Привет, Хабр! Хочу поделиться своим опытом использования Форсайт мобильной платформы.
Если у вас встанет задача удалённого хранения данных и при этом не писать собственный сервер, то первое, что придёт на ум это инструмент Firebase Realtime Database. Большинство читающих знают, о чём идёт речь, но для остальных поясню. С помощью Firebase Database можно хранить удаленно данные в NoSql-ом виде.
Картинка с сайта firebase
Из плюсов использования:
Из минусов:
Теперь хочу вам рассказать про альтернативный инструмент, которым мне приходится пользоваться.
Зайду издалека. Где-то у меня имеется поднятый сервер PostreSQL с базой данных. В базе данных у меня есть таблица с фруктами:
Что такое PostreSQL как с ним работать можно почитать тут.
Моя задача, чтобы эта таблица как можно быстрее оказалась на телефоне с наименьшим написанием кода и обеспечения безопасности на каждом этапе.
Вот таблица my_table_fruits в pgAdmin4:
Далее нахожу в дереве pgAdmin4 процедуры. Пишу собственную процедуру на получение таблицы:
Процедура будет иметь название fruits_get_by_color и будет отдавать мне фрукты определённого цвета из моей таблицы my_table_fruits.
После этого перехожу на сервер Форсайт мобильной платформы (далее ФМП). Как развернуть платформу и что для этого нужно можно прочитать в документации. ФМП представляет собой сервер, который имеет коннекторы к серверам баз данных. Может приконнектиться и к нужному нам PostgreSQL. Код писать для этого никакой не нужно. С чем мне приходится работать, так это с панелью администратора через браузер. Вводить необходимые адреса серверов, баз данных. Панель администратора имеет настройки и дерево сред:
Более подробно про настройки также можно прочитать в документации.
К сожалению, никаких пробных версий или бесплатных периодов у ФМП нету. Также ФМП разворачивают в защищенной инфраструктуре заказчика. Поэтому ссылок на сервер, чтобы попробовать, не смогу предоставить. Но, чтобы понять суть работы, нижеследующей информации вполне хватит.
Создаю новую среду в дереве сред, например назову её Leonid_environment. Внутри среды создаю проект, например Leonid_project. Захожу в проект и создаю там источник данных, в нашем случае PostgreSQL. Ввожу параметры сервера и базы данных, в которой храниться моя таблица:
Захожу внутрь источника данных и жму “Импортировать”. Ввожу в название источника наименование той процедуры, которую ввёл в PostgreSQL, в данном случае fruits_get_by_color. Для мобильного клиента можно придумать другое название, хотя не обязательно. Назову его fruits_get_by_color_for_android:
После нажатия кнопки “Импортировать”, платформа ФМП “увидит” нашу процедуру и параметры, которые мы должны туда передать.
В частности, она увидит, что мы должны передать параметр fruit_color:
После этого необходимо перейти во вкладку “Пользователи API” и создать пользователя. Создал пользователя с логином Leonid и паролем 123123:
Начиная с этого момента можно переходить в Android Studio, чтобы получить эти данные на мобильный телефон.
Создаю новый проект. Вместе с платформой распространяется фреймворк для работы с ней. Подтягиваю фреймворк в проект File > import module > *.aar
В проекте объявляю ряд констант, в которые вставляю адрес сервера, а также придуманные мной название среды, название проекта, логин, пароль, наименование ресурса из ФМП:
Обратите внимание, что обращаемся именно к ФМП, а не напрямую к PostgreSQL. Далее необходимо создать объект HyperHive и засетить объявленные переменные:
Затем нужно выполнить авторизацию. Для этого передаём логин и пароль в метод auth():
При получении true можно запрашивать содержимое таблицы, что и сделаем. В объект tableStreamCallParams передадим в виде json-а параметр fruit_color и введём для него значение yellow. Напомню, что мы создавали таблицу фруктов и создавали в PostreSQL процедуру, которая принимает на вход параметр цвета. Это нужно было, чтобы на устройстве ввести данный параметр:
После запроса мы обращаемся к серверу ФМП. Сервер ФМП обращается к серверу PostgreSQL. В итоге мы должны получить список желтых фруктов:
Строки stream-ятся в базу SQLite. В данном случае цвета yellow были только banana и lemon. Скорость загрузки закешированных на стороне ФМП данных примерно 10000 строк в секунду при нормальной скорости интернета.
Все описанные мною шаги можно прочесть в документации. Также там есть информация про подключение к iOs и другим операционным системам.
Привожу полный код активити.
Сделал запрос из основного потока и не обработал ошибки, чтобы сократить количество кода.
Функционал ФМП этим не ограничивается. Можно на стороне сервера базы данных создать процедуру не только для получения, но и для создания новых строк в зависимости от переданных значений. Можно передавать массивы значений. Ограничения только внутри самой БД.
Пройдусь широкими шагами по основному функционалу ФМП:
Есть фреймворки под:
Есть коннекторы к:
Приведу плюсы и минусы, которые вижу со своей точки зрения. В зависимости от специфики и размера проекта, думаю, вы будете не со всем согласны.
Плюсы:
Минусы:
Сравнение платформы ФМП с Firebase Realtime Database было “притянуто за уши”, т.к. хотелось хоть с чем-то сравнить знакомым android- и iOs-разработчику. На самом деле ФМП имеет несколько другой функционал и цели. Среди конкурентов можно привести SAP Mobile Platform, IBM first mobile platform, Оптимум CDC.
В заключение хочу сказать, что на ФМП стоит обратить внимание, если у вас есть:
Если у вас встанет задача удалённого хранения данных и при этом не писать собственный сервер, то первое, что придёт на ум это инструмент Firebase Realtime Database. Большинство читающих знают, о чём идёт речь, но для остальных поясню. С помощью Firebase Database можно хранить удаленно данные в NoSql-ом виде.
Картинка с сайта firebase
Из плюсов использования:
- поддерживается Google
- не нужно писать никакой код, на стороне базы
- быстрая работа
- бесплатно до 5Гб
- интеграция с сервисом Firebase authentication с довольно большим количеством провайдеров авторизации
- поддержка android, iOs, unity и др.
- синхронизируется в режиме реального времени: при обновлении данных в базе они обновляются в клиенте
Из минусов:
- при привышении установленных лимитов по пространству и нагрузке на сервер приходится платить
- нету возможности кастомизировать под себя структура хранения
ФМП + PostgreSQL
Теперь хочу вам рассказать про альтернативный инструмент, которым мне приходится пользоваться.
Зайду издалека. Где-то у меня имеется поднятый сервер PostreSQL с базой данных. В базе данных у меня есть таблица с фруктами:
Что такое PostreSQL как с ним работать можно почитать тут.
Моя задача, чтобы эта таблица как можно быстрее оказалась на телефоне с наименьшим написанием кода и обеспечения безопасности на каждом этапе.
Вот таблица my_table_fruits в pgAdmin4:
Далее нахожу в дереве pgAdmin4 процедуры. Пишу собственную процедуру на получение таблицы:
Процедура будет иметь название fruits_get_by_color и будет отдавать мне фрукты определённого цвета из моей таблицы my_table_fruits.
После этого перехожу на сервер Форсайт мобильной платформы (далее ФМП). Как развернуть платформу и что для этого нужно можно прочитать в документации. ФМП представляет собой сервер, который имеет коннекторы к серверам баз данных. Может приконнектиться и к нужному нам PostgreSQL. Код писать для этого никакой не нужно. С чем мне приходится работать, так это с панелью администратора через браузер. Вводить необходимые адреса серверов, баз данных. Панель администратора имеет настройки и дерево сред:
Более подробно про настройки также можно прочитать в документации.
К сожалению, никаких пробных версий или бесплатных периодов у ФМП нету. Также ФМП разворачивают в защищенной инфраструктуре заказчика. Поэтому ссылок на сервер, чтобы попробовать, не смогу предоставить. Но, чтобы понять суть работы, нижеследующей информации вполне хватит.
Создаю новую среду в дереве сред, например назову её Leonid_environment. Внутри среды создаю проект, например Leonid_project. Захожу в проект и создаю там источник данных, в нашем случае PostgreSQL. Ввожу параметры сервера и базы данных, в которой храниться моя таблица:
Захожу внутрь источника данных и жму “Импортировать”. Ввожу в название источника наименование той процедуры, которую ввёл в PostgreSQL, в данном случае fruits_get_by_color. Для мобильного клиента можно придумать другое название, хотя не обязательно. Назову его fruits_get_by_color_for_android:
После нажатия кнопки “Импортировать”, платформа ФМП “увидит” нашу процедуру и параметры, которые мы должны туда передать.
В частности, она увидит, что мы должны передать параметр fruit_color:
После этого необходимо перейти во вкладку “Пользователи API” и создать пользователя. Создал пользователя с логином Leonid и паролем 123123:
Начиная с этого момента можно переходить в Android Studio, чтобы получить эти данные на мобильный телефон.
ФМП + android
Создаю новый проект. Вместе с платформой распространяется фреймворк для работы с ней. Подтягиваю фреймворк в проект File > import module > *.aar
В проекте объявляю ряд констант, в которые вставляю адрес сервера, а также придуманные мной название среды, название проекта, логин, пароль, наименование ресурса из ФМП:
private static final String MY_URL = "http://mobilefmp.dev.fs.world";
private static final VersionAPI MY_VERSION_API = VersionAPI.V_1;
private static final String MY_ENVIRONMENT = "Leonid_environment";
private static final String MY_PROJECT = "Leonid_project";
private static final String MY_VERSION = "v1";
private static final String MY_LOGIN = "Leonid";
private static final String MY_PASSWORD = "123123";
private static final String MY_RESOURCE = "fruits_get_by_color_for_android";
Обратите внимание, что обращаемся именно к ФМП, а не напрямую к PostgreSQL. Далее необходимо создать объект HyperHive и засетить объявленные переменные:
hyperHive = new HyperHiveState(getApplicationContext())
.setHostWithSchema(MY_URL)
.setApiVersion(MY_VERSION_API)
.setEnvironmentSlug(MY_ENVIRONMENT)
.setProjectSlug(MY_PROJECT)
.setVersionProject(MY_VERSION)
.buildHyperHive();
Затем нужно выполнить авторизацию. Для этого передаём логин и пароль в метод auth():
boolean status = hyperHive.authAPI.auth(MY_LOGIN, MY_PASSWORD, true).execute().isOk();
При получении true можно запрашивать содержимое таблицы, что и сделаем. В объект tableStreamCallParams передадим в виде json-а параметр fruit_color и введём для него значение yellow. Напомню, что мы создавали таблицу фруктов и создавали в PostreSQL процедуру, которая принимает на вход параметр цвета. Это нужно было, чтобы на устройстве ввести данный параметр:
TableStreamCallParams tableStreamCallParams = new TableStreamCallParams();
String data = "{\"fruit_color\": \"yellow\"}";
tableStreamCallParams.setData(data);
String status = hyperHive.requestAPI.tableStream(MY_RESOURCE, tableStreamCallParams).execute();
После запроса мы обращаемся к серверу ФМП. Сервер ФМП обращается к серверу PostgreSQL. В итоге мы должны получить список желтых фруктов:
Строки stream-ятся в базу SQLite. В данном случае цвета yellow были только banana и lemon. Скорость загрузки закешированных на стороне ФМП данных примерно 10000 строк в секунду при нормальной скорости интернета.
Все описанные мною шаги можно прочесть в документации. Также там есть информация про подключение к iOs и другим операционным системам.
Привожу полный код активити.
Сделал запрос из основного потока и не обработал ошибки, чтобы сократить количество кода.
Функционал ФМП
Функционал ФМП этим не ограничивается. Можно на стороне сервера базы данных создать процедуру не только для получения, но и для создания новых строк в зависимости от переданных значений. Можно передавать массивы значений. Ограничения только внутри самой БД.
Пройдусь широкими шагами по основному функционалу ФМП:
- кеширование данных на стороне платформы и получение дельты (не всей таблицы, а только изменённых строк)
- логгирование действий пользователя
- разграничение доступа по пользователям, группам пользователей, id устройства
- аутентификация через LDAP
- интеграция с SMTP, Citrix XenMobile, Sentry
- подпись данных в центре сертификации КриптоПро
- файловое хранилище не стороне ФМП
- локальная БД на стороне ФМП (можно не коннектиться к сторонней БД, а создать БД локально, как в Firebase)
- коннекторы к Firebase Cloud Messaging, Apple Push Notification и Windows Push Notification. Создание рассылок и шаблонов push-уведомлений
Есть фреймворки под:
- android
- iOs
- UWP
- WinCE
- Sailfish, Аврора (российский sailfish)
Есть коннекторы к:
- SAP
- PostgreSQL
- Oracle
- web-источникам
- SOAP ( в том числе 1C)
- Форсайт аналитической платформы
Плюсы и минусы ФМП
Приведу плюсы и минусы, которые вижу со своей точки зрения. В зависимости от специфики и размера проекта, думаю, вы будете не со всем согласны.
Плюсы:
- без написания серверного кода можно приконектиться к серверу базы
- большое количество коннекторов к другим источникам
- наличие фреймворков под большинство мобильных операционных систем
- русскоязычная служба поддержки
Минусы:
- стоимость
- ориентация под коммерческого заказчика
- нету бесплатной пробной версии или периода
Выводы
Сравнение платформы ФМП с Firebase Realtime Database было “притянуто за уши”, т.к. хотелось хоть с чем-то сравнить знакомым android- и iOs-разработчику. На самом деле ФМП имеет несколько другой функционал и цели. Среди конкурентов можно привести SAP Mobile Platform, IBM first mobile platform, Оптимум CDC.
В заключение хочу сказать, что на ФМП стоит обратить внимание, если у вас есть:
- довольно крупный заказчик готовый платить за систему
- который не хочет писать прослойку между мобильным устройством и сервером базы данных
- у которого есть большое количество данных, например склад товаров
- для которого принципиально использование российское ПО
- для которого не последнюю роль играет защита данных
Griboks
Конечно же, написать его на клиенте)
lim14 Автор
Всё верно. Можно и напрямую. Но если встанет вопрос аутентификации пользователей, то понадобится «прослойка» между БД и клиентом