2017-08-12 6 views
1

Kafkaの初心者。異なるメッセージタイプを順番に送信することをお勧めします。

私は、タイプAの最初のいくつかのメッセージ(json)、次にタイプBのメッセージを送信したいと思います。Javaコンシューマは、データベースを更新する目的でこの順序を維持するために消費しなければなりません。

私の最初の考えは、メッセージの順序を保証するために単一のトピックを使用することでした。私はこれらの答え読み:

をしかし、別のオブジェクトタイプに対して1つのトピックを使用するには、カフカで良い習慣ではないようですか?

もう1つの解決策 "kafkaesque"はこの問題の2つのトピックを持っています。しかし、プロデューサーが最初のトピックのすべてのメッセージが2番目のトピックを送信する前に消費されたことを確認する方法はありますか?私は非同期を失うだろうか?

あなたの意見では、このタイプの構成ではどのような戦略が最適ですか?

ありがとうございます。

+0

Bのすべてのイベントは、Aの後に読み取られなければならないか、いくつかの通気孔ob BはAのいくつかの事象の後に読み取られ得るか? – marvel308

+0

ご質問ありがとうございます@ marvel308。理想的には、Aのすべてのイベントの後にBのすべてのイベント。 –

答えて

4

複数のトピックまたは複数のパーティションにわたって注文が保存されないため、すべてのメッセージを1つのトピックとそのトピック内の1つのパーティションに送信する必要があります。

トピックごとに一貫性のあるスキーマを適用するAvroまたは他のシリアライザを使用していない限り、同じトピックに異なるデータ型を送信する心配はありません。 JSONを送信している場合、1つのトピックで問題はありません。

トピックの複数のパーティションにわたって順序が保持されないことに注意することが重要です。トピックに単一のパーティションがある場合は、問題ありません。トピックに複数のパーティションがある場合は、順序を維持する必要があるすべてのメッセージに同じキーを発行して使用するときに、キーを使用する必要があります。これにより、すべてが同じパーティションに確実に移動します。

実際に注文が保存されることを確認したい場合は、max.inflight.requests.per.connection=1を設定する必要があります。それ以外の場合は、エラーと1つのメッセージの再試行によって、他の機内メッセージから順序が外れてしまう可能性があります。

+0

この答えをありがとうハンス。私はJava/Springコンシューマのデシリアライザの値としてJsonDeserializerを選択しました。そして私は受信者の良いオブジェクト型に値をキャストする方法を知るために、 "型"を含むオブジェクトにペイロードをラップしました。 –

+0

注文はパーティション内でのみ維持されます。最初の文はそれを少し混乱させます。 – PragmaticProgrammer

+0

あまり混同しないように改訂されました –

関連する問題