Сиддхи-запрос для обнаружения входа в геозону

Я пытаюсь заставить Siddhi запускать события всякий раз, когда он обнаруживает, что рейс вошел в геозону, но не могу точно определить правильный запрос для этого.

У меня есть следующее определение входного потока:

define stream GeofenceMulticasterConsumerStream ( journeyId string, geofenceId string, withinGeofence bool, timestamp long )

Каждый раз, когда я получаю позиционное обновление для полета, я получаю событие, сгенерированное в этом потоке для каждой геозоны в системе (существует около 10 геозон, поэтому подумал, что Сиддхи сможет обрабатывать 10 * событий позиционного обновления)

Я начал с этого запроса:

define partition geofencePartition by GeofenceMulticasterConsumerStream.geofenceId;
from every a = GeofenceMulticasterConsumerStream[withinGeofence == false] ->
b = GeofenceMulticasterConsumerStream[a.journeyId == b.journeyId and b.withinGeofence == true]
within 300000
select b.journeyId, b.geofenceId, b.timestamp as timeEntered
insert into EnteredGeofenceStream
partition by geofencePartition

Тем не менее, это дает мне повторяющиеся события Geofence Entry, так как он оценивает каждое событие «a» против каждого совпадающего события «b» (если у меня есть 5 событий, которые не находятся в геозоне, за которыми следует одно, то есть я получаю 5 событий Geofence Entry Мероприятия)

Поэтому я попытался добавить обнаружение повторяющихся событий, чтобы избежать этого:

from every a = GeofenceMulticasterConsumerStream[withinGeofence == false] ->
b = GeofenceMulticasterConsumerStream[a.journeyId == b.journeyId and b.withinGeofence == true]
within 300000
select b.journeyId, b.geofenceId, b.timestamp as timeEntered, geofences:hashEntry(b.journeyId, b.geofenceId, b.timestamp) as entryHash
insert into DuplicateEnteredGeofenceStream
partition by geofencePartition

from DuplicateEnteredGeofenceStream#window.firstUnique(entryHash)
select journeyId, geofenceId, timeEntered
insert into EnteredGeofenceStream

geofences: hashEntry - это созданная мной функция, которая генерирует уникальный хэш-код для события входа.

Однако мне не очень нравится это делать, так как вам нужно вести учет всех уникальных хэшей в окне firstUnique, и я беспокоюсь, что это приведет к утечке памяти. Кажется, это немного преувеличено, так как хеш будет применим только к этому моменту времени, и поэтому мне нужно только окно firstUnique, действительное в течение нескольких секунд максимум, для проверки дубликатов.

Я думаю, что одна из самых серьезных проблем, с которыми я сталкиваюсь, заключается в том, что у меня есть один поток, в котором отслеживаются несколько рейсов и несколько геозон, поскольку все примеры, которые я видел, были намного проще. Мне интересно, пытаюсь ли я достичь чего-то невозможного.

Буду очень признателен за любой совет по этому поводу, так как у меня сейчас заканчиваются идеи!

Заранее спасибо!


person foyst    schedule 27.10.2014    source источник


Ответы (1)


Поскольку вы пытаетесь обнаружить только переходы a -> b, вы можете использовать здесь «последовательности» вместо шаблонов.

В Сиддхи, когда вы используете последовательность, она сопоставляет последовательные события без каких-либо других промежуточных событий. Напротив, шаблоны позволяют другим событиям существовать между ними.

Также в этом случае, поскольку несколько рейсов могут одновременно входить в одну и ту же геозону, вам придется разделить по идентификатору полета (или идентификатору поездки) вместо идентификатора геозоны (иначе, будут шаблоны по рейсам X и Y, такие как X_outside -> Y_outside -> X_inside -> Y_inside, который не будет обнаружен). Таким образом, переход определенного полета из outside_fence -> inside_fence всегда будет правильно обнаруживаться.

Таким образом, как только вы используете правильные разделы вместе с последовательностями, вы можете обнаруживать переходы, и здесь нет необходимости использовать уникальные окна и т. Д.

Дополнительные сведения о последовательностях см. В документе по последовательностям.

person Rajeev Sampath    schedule 28.10.2014
comment
Если вместо этого я разбиваю на разделы по JourneyId, тогда не остается ли проблема, что события для разных геозон будут проходить через раздел, и, следовательно, последовательность по-прежнему не будет совпадать? Путешествие (перелет) может проходить одновременно в нескольких геозонах. - person foyst; 30.10.2014
comment
Я также читал в документации, чтобы не разбивать атрибуты с высокой мощностью (в конечном итоге у меня будут сотни тысяч рейсов), хотя они будут активны только в течение стандартного полета (откуда Сиддхи узнает о закрытии разделы больше не используются?) В идеале я бы разделил по JourneyId и geofenceId, тогда последовательность была бы идеальной :) - person foyst; 30.10.2014