0

フライトがジオフェンスに入ったことが検出されるたびにシッディにイベントを発生させようとしていますが、それを行うための正しいクエリがわかりません。

次の入力ストリーム定義があります。

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 つのストリームがあることだと思います。不可能なことを達成する。

私は今アイデアを使い果たしているので、これに関するアドバイスをいただければ幸いです!

前もって感謝します!

4

1 に答える 1

0

遷移 a -> b のみを検出しようとしているため、ここではパターンの代わりに「シーケンス」を使用できます。

シッディでは、シーケンスを使用すると、その間に他のイベントがなくても、連続するイベントに一致します。対照的に、パターンは他のイベントが間に存在することを可能にします。

また、この場合、複数のフライトが同時に同じジオフェンスに入る可能性があるため、ジオフェンス ID ではなく、フライト ID (またはジャーニー ID) で分割する必要があります (そうしないと、X_outside などのフライト X と Y によるパターンが存在します)。 -> Y_outside -> X_inside -> Y_inside は検出されません)。このようにして、outside_fence -> inside_fence からの特定のフライトの遷移は、常に適切に検出されます。

したがって、シーケンスとともに正しいパーティションを使用すると、トランジションを検出でき、ここで固有のウィンドウなどを使用する必要はありません。

詳細については、シーケンスに関するこちらのドキュメントを参照してください。

于 2014-10-28T11:00:18.243 に答える