При возрастающем числе источников, предоставляющих потоковые данные в реальном времени, возможность приложений принимать и немедленно отображать эти данные становится все более важной. Традиционный подход, при котором имеется задержка, связанная с хранением данных событий в классе объектов многопользовательской базы геоданных и периодическим обращением клиентов к сервису объектов для получения данных для отображения, становится проблематичным – особенно при работе с потоками данных большого объема.
Такой подход требует изменений. Необходимо обеспечить непрерывность потока данных в виде архивирования, параллельно с передачей данных событий клиентам. Ответом Esri является новый тип сервиса ArcGIS Server – потоковый сервис.
Что такое потоковый сервис?
Потоковый сервис является новым типом сервиса ArcGIS Server, который придает особое значение низко латентному, в реальном времени распространению данных для потоков данных клиент/сервер. Клиенты, подключившиеся к потоковому сервису, начинают получать данные сразу после подписки на сервис. Клиенты могут задавать и перенастраивать пространственные и атрибутивные ограничения без отключения и повторного подключения к сервису.
GeoEvent ServerДля использования потоковых сервисов требуется лицензировать и установить в среде ГИС . В первом выпуске, потоковый сервис был включен в веб-карты ArcGIS Online и Portal for ArcGIS, а также работал в клиентских приложениях, разработанных с помощью ArcGIS API for JavaScript. В последующих выпусках появится поддержка различных клиентских подписок.
Потоковые сервисы используют технологию WebSocket, которая поддерживает полнодуплексный двунаправленный обмен данными. Это позволяет клиентам указывать, какие данные им необходимо получить, без отключения и повторного подключения к сервису. Клиенты могут фильтровать данные потокового сервиса с помощью пространственных или атрибутивных условий.
Подключение к потоковому сервису для получения данных в реальном времени позволяет отделить необходимость немедленного отображения событий от необходимости хранения данных в базе. Настроив доп. модуль GeoEvent Server на передачу данных событий через потоковый сервис, вы получите возможность сохранения данных событий в корпоративном хранилище реляционных данных или в хранилище больших пространственно-временных данных, но для визуализации данных это не требуется.
На рисунке ниже показано сравнение традиционного способа получения, обработки и использования данных объектов с получением и передачей данных в реальном времени с помощью потоковых сервисов.
На рисунке показано, что до появления потоковых сервисов, данные, полученные в реальном времени, сначала записывались в класс объектов, что требовало наличия многопользовательской базы геоданных. Клиентские приложения, ожидающие данные, должны были периодически обращаться к сервису объектов, для получения новых и обновленных объектов.
В нижней части рисунка показано, как потоковые сервисы позволяют получать данные в реальном времени и сразу направлять их в приложения клиентов по протоколу WebSocket.
Обратитесь к учебному руководству по потоковым сервисам, доступному в руководствах к GeoEvent Server, чтобы получить более подробные сведения о создании и публикации потоковых сервисов в дополнительном модуле GeoEvent Server.
Публикация потокового сервиса
Потоковые сервисы создаются и публикуются в GeoEvent Manager как часть рабочего процесса по настройке отправки объектов в выходной коннектор потокового сервиса.
При настройке отправки объектов в выходной коннектор потокового сервиса, рекомендуется использовать подключение ArcGIS Server или Portal for ArcGIS, зарегистрированное как подключение по умолчанию в GeoEvent Server.
Альтернативно, если у вас установлен GeoEvent Server и лицензирован на второй серверной машине, вы можете зарегистрировать подключение хранилища данных на этой второй машине в GeoEvent Manager и указать потоковый сервис, чтобы он был опубликован на этой второй машине. Это позволит вам сконфигурировать, чтобы выходные данные запускались на одной машине для передачи ее записей пространственных объектов через потоковый сервис, запущенный на другой машине.
Отправка объектов в выходной коннектор потокового сервиса, настроенная и запущенная в рамках экземпляра GeoEvent Server, должна быть включена в GeoEvent Service, настроенный и запущенных на этом же GeoEvent Server.
Потоковые сервисы в ArcGIS REST Services Directory
Потоковые сервисы перечислены в ArcGIS REST Services Directory наряду с другими сервисами ArcGIS Server. Чтобы увидеть свойства потокового сервиса, его следует щелкнуть. Внизу страницы потокового сервиса, в ArcGIS REST Services Directory, имеются ссылки для вещания и получения данных событий от потокового сервиса.
Щелкните Вещание, чтобы открыть веб-страницу, с которой вы можете войти в представление Esri Feature JSON одного или нескольких объектов и отправить их клиентам, подключенным к потоковому сервису.
Щелкните Подписаться, чтобы открыть веб-страницу, на которой можно подключиться к потоковому сервису для просмотра передаваемых объектов. Если у вас имеется поток данных большого объема, форма на этой странице быстро станет перегруженной; используйте эту страницу в течение короткого времени, чтобы только убедиться, что подключенные клиенты получают данные.
Подробнее о потоковых сервисах в ArcGIS REST Services Directory см. в разделе Потоковые сервисы.
Использование потокового сервиса
Выше, на рисунке REST-страницы потокового сервиса, обратите внимание на ссылку вверху для просмотра ресурсов потокового сервиса на карте ArcGIS JavaScript; эта опция обычно доступна для картографических сервисов.
Щелкните ArcGIS JavaScript, чтобы создать на-лету HTML-страницу, на которой можно визуализировать данные, передаваемые потоковым сервисом.
Если вы щелкните ArcGIS JavaScript правой кнопкой мыши и выберите Посмотреть исходный код, вы увидите код JavaScript. Разработчики могут использовать и редактировать этот код для создания веб-приложений, использующих потоковые сервисы.
Потоковые сервисы также можно использовать, внедряя их в веб-карту и в ArcGIS Pro.
Более подробно об использовании потоковых сервисов в ArcGIS Pro см. в разделе Потоковые слои.
Фильтрация потокового сервиса
Потоковый сервис позволяет фильтровать данные на стороне клиента. Каждый клиент может запросить фильтр, применяемый к данным, перед их отправкой из потокового сервиса. Фильтр не влияет на поток данных к другим клиентам. Фильтр можно задать в момент подключения или после его установки.
Эти и другие параметры можно применить во время установки соединения, открыв подключение WebSocket.
Задание пространственной привязки для потока данных
Потоковый сервис имеет пространственную привязку по умолчанию, которую можно найти в ArcGIS Server Manager на странице описания сервиса. Если клиент хочет получать данные в другой пространственной привязке, ее нужно задать в момент подключения. После задания пространственной привязки ее нельзя изменить пока подключение работает. Для изменения пространственной привязки необходимо создать новое подключение WebSocket. Чтобы изменить пространственную привязку по умолчанию, необходимо использовать ключевое слово outSR, знать общепринятый ID (WKID) требующейся привязки и добавить outSR=<WKID> к URL-адресу. Например, чтобы задать по умолчанию WGS 1984 Web Mercator (Auxiliary Sphere), WKID которой равен 3857, добавьте outSR=3857 к URL-адресу:ws://HOSTNAME:6180/arcgis/services/Vehicles/StreamService/0/subscribe?outSR=3857
Настройка фильтра
Фильтр потокового сервиса может содержать пространственную компоненту, SQL-подобную компоненту, и компоненту outFields. Каждая из них может быть задана или удалена независимо, т.е. любая, все или ни одна из них могут действовать в любой момент времени. Чтобы задать одну часть фильтра, просто задайте ее, не трогая другие. Другие части останутся неизменными.
Фильтр геометрии
Геометрическая часть фильтра соответствует структуре геометрических объектов JSON, возвращаемых ArcGIS REST API. Для сохранения производительности потокового сервиса, в качестве типа геометрии применяются только конверты.
Фильтр также может включать пространственное отношение, заданное ключевым словом spatialRel. Оно представляет пространственное отношение, которое должно применяться для входной геометрии при выполнении запроса. Единственное поддерживаемое пространственное отношение – это пересекает, используемое по умолчанию.
Предполагается, что фильтр геометрии имеет ту же пространственную привязку, что и подключение, изменить это можно только в момент подключения. Если в качестве части геометрии указана другая пространственная привязка, конверт проецируется в пространственную привязку подключения, что позволяет использовать его при фильтрации объектов из потока данных.
Фильтр where
Фильтр where является SQL-подобным выражением, которое фильтрует объекты из потока данных с помощью проверки атрибутов на соответствие условию where. Выражение должно быть строковым значением JSON в кавычках. К поддерживаемым операциям относятся AND, OR, NOT, =, !=, <, <=, >, >=, IS NULL, IS NOT NULL, IN и LIKE. Можно сделать сравнение между полем и значением, например, ('field1 > 1') или между двумя схожими полями, например ('field1 > field2'). Для принудительного изменения приоритета можно использовать скобки.
- Числовой сравнение – пример сравнения поля (Altitude) с числовым значением "Altitude < 1000".
- Сравнение полей – пример сравнения двух полей: "speed > maxSpeed".
- Сравнение строк – строки также можно сравнивать. Сравнения всегда учитывают регистр, буквенные значения должны быть заключены в одинарные кавычки. Например: "Departure_Airport='KZSE'".
- Выражения LIKE – строки можно сравнивать с помощью условия LIKE, применяя подстановочные символы. Знак процента (%) означает любое количество символов, подчеркивание (_) может быть одним любым знаком. В следующем примере выбираются люди, в именах которых второй и третий символы соответствуют символам имен Samantha и James: "name LIKE '_am%'".
- Выражения IN – выражение IN позволяет задавать списки буквенных значений. Если поле соответствует любому значению в списке, объект передается потоком.
- Ниже приводится пример списка строк: "name IN ('Bob','Jane','Henry')".
- Ниже приводится пример выражения IN, использующего список числовых значений: "alertCode IN (404,500,505)".
- Также можно использовать логическое поле вместо логического выражения. Например, если объекты содержат логическое поле с именем active, можно написать выражение where, которое будет пропускать все объекты, имеющие значение true в поле active, например: "active".
Фильтр выходных полей
Поля внутри потока данных могут быть отфильтрованы по-отдельности с помощью фильтра выходных полей, задаваемого ключевым словом outFields. Желаемые поля можно задать с помощью списка имен полей, разделенных запятыми.