フライトがジオフェンスに入ったことが検出されるたびにシッディにイベントを発生させようとしていますが、それを行うための正しいクエリがわかりません。
次の入力ストリーム定義があります。
define stream GeofenceMulticasterConsumerStream ( journeyId string, geofenceId string, withinGeofence bool, timestamp long )
フライトの位置更新を取得するたびに、システム内のジオフェンスごとにこのストリームでイベントが生成されます (約 10 個のジオフェンスがあるため、Siddhi は 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
ただし、これにより、一致するすべての「b」イベントに対してすべての「a」イベントを評価するため、ジオフェンスエントリイベントが重複します (ジオフェンスにない 5 つのイベントの後に 1 つのイベントが続く場合、5 つのジオフェンスエントリを取得します)。イベント)
そこで、これを回避するために重複イベント検出を追加してみました:
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 は、エントリ イベントの一意のハッシュコードを生成する、私が作成した関数です。
ただし、最初のUniqueウィンドウですべての一意のハッシュを記録しておく必要があり、これによりメモリリークが発生するのではないかと心配しているため、私はこれを行うことに熱心ではありません. ハッシュはその時点にのみ適用されるため、少しやり過ぎのようです。したがって、重複をチェックするために最大数秒間有効な firstUnique ウィンドウのみが必要です。
私が抱えている大きな問題の 1 つは、複数のフライトと複数のジオフェンスが追跡されている 1 つのストリームがあることだと思います。不可能なことを達成する。
私は今アイデアを使い果たしているので、これに関するアドバイスをいただければ幸いです!
前もって感謝します!