私は趣味のプロジェクトとしてKafka 9を調査しており、いくつかの「Hello World」タイプの例を完了しました。
私は、現実の世界Kafka一般に要求応答メッセージングに基づいたアプリケーション、より具体的にはKafka要求メッセージをその応答メッセージにリンクする方法について考える必要があります。
生成されたUUIDを要求メッセージキーとして使用し、この要求UUIDを関連する応答メッセージキーとして使用するという考えに沿っていました。 WebSphere MQがメッセージ相関IDを持っているのとほぼ同じタイプのメカニズム。
私のエンド2終了プロセスは次のようになります。
1)。 KafkaクライアントはランダムなUUIDを生成し、単一のKafka=要求メッセージを送信します。2)。サーバーはこの要求メッセージを消費し、要求UUID値を保存します3 )。メッセージペイロードを使用してビジネスプロセスを完了します。 4)。要求メッセージから保存されたUUID値を応答メッセージキーとして使用する応答メッセージで応答します。 5)。 Kafka=クライアントは、タイムアウトになるか、元の要求UUID値でメッセージを取得するまで、応答トピックをポーリングします。
私が心配しているのは、Kafkaコンシューマーポーリングが応答トピックから他のクライアントメッセージを削除し、他のクライアントが失敗するようにオフセットをインクリメントすることです。
Kafkaは設計されていないユースケースに適用しようとしていますか?
Kafkaで要求/応答メッセージングを実装することは可能ですか?
Kafkaは、特定のコンシューマグループのコミット済みオフセットを永続化する便利なメソッドを提供しますが、その動作を使用する必要はなく、必要に応じて独自の動作を記述できます。 Kafka=あなたが説明した方法は、各クライアントが特定の応答のためにトピックを繰り返し検索する必要があるため、ユースケースにとって少し厄介です。それはせいぜい非効率的です。
問題を2つの部分に分けて、Kafkaを使用してサーバーにリクエストとレスポンスを配信し続けます。追加する必要があるのは、ある種のAPIレイヤーだけですクライアントはクライアントと対話し、クライアントからのKafka固有のロジックをカプセル化します。このレイヤーには、uuidで応答を保存できるローカルDB(リレーショナルまたはNoSQL)が必要です。特定のuuid。
より簡単に!パーティションYでUUID Xに応答する必要があることをzookeeperに書き込み、そのUUIDを送信したプロデューサーにパーティションYを消費させることができます...それは理にかなっていますか?
私はそれを試したことはありませんが、理論的には、プロデュースを開始する前に、0から回答トピックのパーティション数までのキーをキーとするメッセージを作成すると、プロデューサーはすでにそのトピックのコンシューマーであるため、すべてのプロデューサーは少なくとも1つを受け取りますそれらのメッセージ。そのため、各キーを各プロデューサーに保存し、uuid
...で公開できます。コンシューマーでのプロセスの後、uuid
で回答を(回答トピックで)公開できます。送信された同じキーでキーが設定されているため、送信元と同じプロデューサーによって取得されます...同じキーを持つすべてのメッセージが同じパーティションで公開されると...
リクエストを呼び出すサービスの明確に定義されたシャードキーが必要だと思います。リクエストには、このシャードキーと、応答を投稿するトピックの名前を含める必要があります。また、何らかのステートマシンを作成する必要があります。タスクに関するメッセージが表示されると、何らかのステートに移行します。これは厳密な非同期設計のためです。