プロデューサー
このセクションでは、Apache RocketMQにおけるプロデューサーの概念について説明します。メッセージングモデルにおけるプロデューサーの役割、プロデューサー属性と互換性、プロデューサーの使用に関するいくつかの注意点についても説明します。
定義
Apache RocketMQのプロデューサーは、メッセージを作成してサーバーに送信する機能的なメッセージングエンティティです。
プロデューサーは通常、ビジネスシステムに統合され、Apache RocketMQでデータをメッセージとしてカプセル化し、メッセージをサーバーに送信する役割を果たします。メッセージの詳細については、メッセージを参照してください。
プロデューサー側では、次のメッセージ配信要素が定義されています。
送信モード:プロデューサーは、API操作でメッセージ送信モードを指定できます。Apache RocketMQは、同期送信と非同期送信をサポートしています。
バッチ送信:プロデューサーは、API操作でバッチ送信を指定できます。たとえば、一度に送信するメッセージの数またはサイズを指定できます。
トランザクション動作:Apache RocketMQはトランザクションメッセージをサポートしています。プロデューサーはトランザクションチェックに関与し、トランザクションの最終的な整合性を確保します。詳細については、トランザクションメッセージを参照してください。
プロデューサーとトピックはn対nの関係にあります。プロデューサーは複数のトピックにメッセージを送信でき、トピックは複数のプロデューサーからメッセージを受信できます。この多対多の関係は、パフォーマンスのスケーリングとディザスタリカバリを容易にします。
モデル関係
次の図は、Apache RocketMQのメッセージングモデルにおけるプロデューサーの役割を示しています。
メッセージはプロデューサーによって初期化され、Apache RocketMQサーバーに送信されます。
メッセージは、Apache RocketMQサーバーに到着した順序で、トピックの指定されたキューに格納されます。
コンシューマは、指定されたサブスクリプション関係に基づいて、Apache RocketMQサーバーからメッセージを取得して消費します。
内部属性
クライアントID
定義:プロデューサークライアントの識別子。この属性は、異なるプロデューサーを区別するために使用されます。クライアントIDは、クラスタ内でグローバルに一意です。
値:クライアントIDは、Apache RocketMQ SDKによって自動的に生成されます。ログの表示や問題の特定などの運用目的で使用されます。クライアントIDは変更できません。
通信パラメータ
(必須):サーバーへの接続に使用されるエンドポイント。このエンドポイントは、クラスタを識別するために使用されます。
アクセスポイントは、この形式で構成する必要があります。ノードの変更によってホットスポットマイグレーションが失敗するのを防ぐために、IPアドレスを使用するのではなく、ドメイン名を使用することをお勧めします。
(オプション):クライアントが認証に使用できる資格情報。
サーバーでID認識と認証が有効になっている場合のみ、送信が必要です。
- リクエストタイムアウト(オプション):ネットワークリクエストのタイムアウト期間。パラメータの制限で、値の範囲とデフォルト値の詳細を参照してください。
事前バインドトピックリスト
定義:Apache RocketMQのプロデューサーがメッセージを送信するトピックのリスト。事前バインドトピックには、次の利点があります。
トランザクションメッセージ(必須):トランザクションメッセージには、事前バインドトピックリスト属性を指定する必要があります。トランザクションメッセージのシナリオでは、プロデューサーが障害から回復した場合や再起動された場合、プロデューサーはトランザクションメッセージトピックにコミットされていないトランザクションメッセージが含まれているかどうかを確認します。これにより、プロデューサーがトピックに新しいメッセージを送信した後、トピック内のコミットされていないトランザクションメッセージによって発生する遅延を防ぎます。
非トランザクションメッセージ(オプション):サーバーは、アプリケーションの起動後にチェックを実行する代わりに、プロデューサーの初期化中に、事前バインドトピックリストに基づいて、宛先トピックのアクセス権と有効性をチェックします。非トランザクションメッセージには、事前バインドトピックリスト属性を指定することをお勧めします。
非トランザクションメッセージに事前バインドトピックリスト属性が指定されていない場合、または宛先トピックが変更された場合、Apache RocketMQは宛先トピックを動的にチェックして識別します。
制限:トランザクションメッセージの場合、事前バインドトピックを指定し、トランザクションチェッカーと組み合わせて使用する必要があります。
トランザクションチェッカー
Apache RocketMQは、トランザクションの最終的な整合性を確保するために、プロデューサーがトランザクションチェッカーを実装する必要があるトランザクションメッセージメカニズムを使用します。詳細については、トランザクションメッセージを参照してください。
プロデューサーがトランザクションメッセージを送信する場合、トランザクションチェッカーを構成し、事前バインドトピックと組み合わせて使用する必要があります。
送信リトライポリシー
送信リトライポリシーは、メッセージの配信が失敗した場合に、プロデューサーがメッセージの配信を再試行する方法を指定します。詳細については、メッセージ送信のリトライを参照してください。
バージョン互換性
Apache RocketMQバージョン5.x以降、プロデューサーは匿名であり、プロデューサーグループは廃止されました。Apache RocketMQバージョン3.xおよびバージョン4.xでは、既存のプロデューサーグループを廃止できますが、ビジネスに影響を与えることはありません。
使用上の注意
個々のプロセス上のプロデューサーの数を制限することをお勧めします。
Apache RocketMQでは、プロデューサーとトピックは多対多の通信形式を提供します。単一のプロデューサーは複数のトピックにメッセージを送信できます。ビジネスシナリオに必要な最小限のプロデューサーを作成して初期化し、できるだけ多くのプロデューサーを再利用することをお勧めします。たとえば、複数のトピックへのメッセージ配信が必要なシナリオでは、トピックごとにプロデューサーを作成する必要はありません。
定期的にプロデューサーを作成および破棄しないことをお勧めします。
Apache RocketMQのプロデューサーは、データベースの接続プールのように、再利用できる基盤となるリソースです。メッセージを送信するたびにプロデューサーを作成したり、メッセージを送信した後にプロデューサーを破棄する必要はありません。定期的にプロデューサーを作成および破棄すると、ブローカーに大量の短い接続要求が生成されます。これにより、システムに高い負荷がかかります。
正しい使用方法の例
Producer p = ProducerBuilder.build();
for (int i =0;i<n;i++)
{
Message m= MessageBuilder.build();
p.send(m);
}
p.shutdown();
間違った使用方法の例
for (int i =0;i<n;i++)
{
Producer p = ProducerBuilder.build();
Message m= MessageBuilder.build();
p.send(m);
p.shutdown();
}