0

次のURLを使用してActiveMQConnactionFactoryを作成します。

failover:(tcp://server1:port,tcp://server2:port,tcp://server2:port)

私がやりたいのは、このブローカーのネットワークから複数のメッセージコンシューマーを作成することです。以下は実際のコードではありませんが、私がそれをどのように行うかを理解するのに役立ちます。

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("BROKER_URL");
connection = connectionFactory.createConnection();
connection.start();

for (int i=0; i<10; i++) {
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
Destination queue = consumerSession.createQueue("QUEUE_NAME");
consumer = consumerSession.createConsumer(queue);
consumer.setMessageListener(new MessageListener());
}

問題は、すべての消費者がランダムに選択された1つのブローカーに接続されることです。しかし、私はそれらがブローカーのネットワーク上でバランスが取れていることを望んでいます。

工場とのつながりを複数作ることで可能だと思います。

しかし、そのためのベストプラクティスは何ですか?そして、これは私が欲しい良いことですか?:)

4

1 に答える 1

0

実際には、消費者はランダムに選択されたブローカーに接続されません。

接続は、ブローカーに接続する部分です。指定した接続文字列を使用すると、ランダムに選択された 1 つのブローカーに 1 つの接続がマップされます。すべてのコンシューマーには独自のセッションがありますが、これらはその 1 つのブローカーに対して同じ 1 つの接続を使用します。

私が知っている唯一の設定は?randomize=false、接続文字列を設定することで、フェールオーバー プロトコルのランダム化動作を無効にできることです。これは、接続が最初に最初に試行し、次に 2 番目、次に 3 番目というように試行することを意味します。

しかし、あなたの要件を達成するために。私は各消費者に独自の接続を持たせます。これは、フェイルオーバー プロトコルのランダム化機能とともに、消費者の負荷を分散します。しかし実際にはそうではありません。そこには知性がなく、接続先のブローカーを「ランダム化」しているだけです。

つまり、次のことを行います(コードから)

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("BROKER_URL");

for (int i=0; i<10; i++) {

connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
Destination queue = consumerSession.createQueue("QUEUE_NAME");
consumer = consumerSession.createConsumer(queue);
consumer.setMessageListener(new MessageListener());

}

このようにして、各コンシューマーは、フェイルオーバー接続文字列の「a」ブローカーへの独自の接続を持ちます

質問の変更後に更新:

ActiveMQ に各コンシューマーのブローカーをランダムに選択させたい場合は、上記のソリューションが最適です。

ベスト プラクティスは、コンシューマーとプロデューサーをできるだけ近づけることです。このため、ネットワーク コンシューマーの優先度を下げることをお勧めします。これにより、ローカル コンシューマーとプロデューサーが最も優先度が高くなります。ローカル コンシューマーがアイドル状態でない場合にのみ、ネットワークを介して他のコンシューマーにさらに配信します。

それに加えて、コンシューマー側の操作が長時間実行されてプリフェッチ値を低く設定するのは良い考えです。これにより、1 つのコンシューマーが 1,000 メッセージを取得している間に他のコンシューマーが 1,000 メッセージを取得する代わりに、ブローカーのネットワーク全体でメッセージの負荷が分散されます。消費者は暇です。

于 2011-03-16T13:18:47.030 に答える