7

私は Kafka を初めて使用し、私たちのチームはサービス間通信のパターンを調査しています。

目標

P (プロデューサー) と C (コンシューマー) の 2 つのサービスがあります。P は、C が必要とする一連のデータの信頼できる情報源です。C が起動すると、現在のデータをすべて P からキャッシュにロードし、変更通知をサブスクライブする必要があります。(つまり、サービス間でデータを同期したいのです。)

データの総量は比較的少なく、変更はまれです。同期のわずかな遅延は許容されます (結果整合性)。

P と C が互いのことを知る必要がないように、サービスを分離したいと考えています。

提案

P が起動すると、すべてのデータが、ログ圧縮が有効になっている Kafka トピックに発行されます。各メッセージは、その ID のキーを持つ集約です。

C が起動すると、トピックの先頭からすべてのメッセージが読み取られ、キャッシュにデータが入力されます。その後、オフセットからの読み取りを続けて、更新の通知を受けます。

P がデータを更新すると、変更された集計のメッセージが発行されます。(このメッセージは元のメッセージと同じスキーマを持っています。)

C が新しいメッセージを受信すると、キャッシュ内の対応するデータを更新します。

ここに画像の説明を入力

制約

Confluent REST Proxyを使用して Kafka と通信しています。

問題

C が起動するとき、安全に処理を開始できるように、トピックからすべてのメッセージをいつ読み取ったかをどのように知るのでしょうか?

P が 1 秒前に送信したメッセージに C がすぐに気付かない場合は、許容されます。P が 1 時間前に送信したメッセージを消費する前に C が処理を開始することは受け入れられません。P のデータがいつ更新されるかわからないことに注意してください。

各メッセージを消費した後、C が REST プロキシのポーリング間隔を待つ必要はありません。

4

2 に答える 2