Есть ли способ отбросить частичные совпадения?

#apache-flink #flink-cep

#apache-flink #flink-cep

Вопрос:

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

Вот шаблон, который я использую:

 begin("enter").notFollowedBy("exit").within(Time.hours(2)).followedBy("final-exit")
 

Дело в том, что частичное совпадение «enter» остается действительным, даже если значение notFollowed «exit» равно true, т.Е. Если транспортное средство возвращается через пару дней и запускает другое событие exit-Fence, оно передает notFollowedBy-правило и приводит к полному совпадению.

Есть ли способ сообщить Flink, чтобы он активно отбрасывал частичное совпадение?

Ответ №1:

Логически имеет смысл, что частичное совпадение «ввод» остается действительным, если за ним не следует «выход» в течение двух дней, поскольку в этом случае за ним не последовал «выход» в течение двух часов. Можете ли вы описать, при каких обстоятельствах вы хотите, чтобы такое частичное совпадение истекло? Например, если вы хотите, чтобы время ожидания истекло через 8 часов, то я думаю, что такое поведение можно описать следующим образом

 begin("enter")
  .notFollowedBy("exit").within(Time.hours(2))
  .followedBy("final-exit").within(Time.hours(8))
 

Обновить

Если ваша цель — отфильтровать все случаи, когда транспортные средства въезжают и покидают геозону в течение 2 часов, а затем правильно обработать оставшиеся события, тогда вы можете запустить конвейер, состоящий из двух этапов. Первый этап можно описать как

 begin("enter")
  .followedBy("quick-exit").within(Time.hours(2))
 

и затем вы можете отбросить события, соответствующие этому шаблону, и выполнить дальнейшую обработку для тех, у которых истекло время ожидания. Подробнее о том, как использовать для захвата и передачи частичных шаблонов с истекшим временем ожидания, которые будут теми, которые вы хотите рассмотреть для дальнейшей обработки, см. В разделе Обработка частичных шаблонов с истекшим временем ожидания. processTimedOutMatch

Комментарии:

1. Да, я пробовал это. Дело в том, что мои транспортные средства движутся довольно медленно, то есть корабли. Бывают случаи, когда они остаются в порту или доке неделями. Но когда они покидают геозону раньше (2 часа) Я могу быть уверен, что эти события «не подлежат погашению» (период времени слишком короток, чтобы превратиться в истинное событие). Поэтому мне нужен способ отбросить их напрямую. Потому что в противном случае в течение 30 дней возможно, что судно снова выйдет из порта после короткого перерыва. Но шаблон даст мне продолжительность от начала до конца, например, 30 дней.

2. Я обновил свой ответ предложением о том, как с этим справиться.