私は 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 プロキシのポーリング間隔を待つ必要はありません。