さまざまなキュー(10000以上のキュー)にメッセージを動的にルーティングできるソリューションを開発したいと考えています。それは今まで私が持っているものです:RabbitMQでメッセージをキューにルーティングする方法
- 交換タイプが
topic
に設定されています。ルーティングキーに基づいて異なるキューにメッセージをルーティングすることができます。 - ルーティングキーが
#.%numberOfQueue.#
の10000個のキュー。%numberOfQueue%
は、そのキューの単純な数値です(ただし、意味のある数値の場合は変更される可能性があります)。 - プロデューサは、そのようなルーティングキーを持つメッセージ:
5.10.15.105.10000
を意味します。つまり、メッセージは、そのキューのパターンに適合するキー5,10,15,105、および10000でキューにルーティングする必要があります。private String generateRoutingKey() { StringBuilder keyBuilder = new StringBuilder(); for (int i = 0; i < numberOfQueues - 2; i++) { keyBuilder.append(i); keyBuilder.append('.'); } String result = keyBuilder.append(numberOfQueues - 2).toString(); LOGGER.info("generated key: {}", result); return result; }
良いようだ:0から9998までのキューのすべてのメッセージに対して生成さ
routingKey
の方法ですString exchangeName = "rabbit.test.exchange"; String exchangeType = "topic"; boolean exchangeDurable = true; boolean queueDurable = true; boolean queueExclusive = false; boolean queueAutoDelete = false; Map<String, Object> queueArguments = null; for (int i = 0; i < numberOfQueues; i++) { String queueNameIterated = "rabbit.test" + i + ".queue"; channel.exchangeDeclare(exchangeName, exchangeType, exchangeDurable); channel.queueDeclare(queueNameIterated, queueDurable, queueExclusive, queueAutoDelete, queueArguments); String routingKey = "#." + i + ".#"; channel.queueBind(queueNameIterated, exchangeName, routingKey); }
:それはJavaクライアントAPIからどのように見えるかだ
。
java.lang.IllegalArgumentExceptionがスレッドで例外「メイン」:問題は、私は
channel.basicPublish()
方法で、このような長いroutingKey
を使用することができないということである短い文字列が長すぎます。 utf-8エンコードされた長さ= 48884、最大= 255. com.rabbitmq.client.impl.ValueWriter.writeShortstr(ValueWriter.java:50) at at com.rabbitmq.client.impl.MethodArgumentWriter.writeShortstr(MethodArgumentWriter.java: (AMQImpl.java:2319) at com.rabbitmq.client.impl.AMQImpl $ Basic $ Publish.writeArgumentsTo(AMQImpl.java:2319) at com.rabbitmq.client.impl.Method.toFrame(Method.java:85) at com。 (AMQChannel.java:396) com.rabbitmq.client.impl.AMQChannel.transmit (ChannelN.java:370) com.rabbitmq.client.impl.recovery.AutorecoveringChannel.basicPublishでcom.rabbitmq.client.impl.ChannelN.basicPublish(ChannelN.java:662) における672) (AutorecoveringChannel.java:192)
私は要件があります:
- キューがメッセージを生成するプロデューサーから動的に選択します。 1つのキュー、すべてのキュー、または1000のキューである可能性があります。
- 私は10000以上の異なるキューを持っており、それらに同じメッセージを生成する必要があるかもしれません。
だから、質問は以下のとおりです。
- は、私はそのような長いキーを使用できますか?それができたらどうすればいい?
- 多分
exchange
やキューの異なる設定で同じ目標を達成できますか? - おそらくdistingueshの宛先を壊して、それを255シンボルで崩壊させることができるハッシュ関数がありますか?そうであれば、異なる出版物を扱う方法を提供するはずです(たとえば、番号555と8989のキューだけに送る方法)?
- 多分、その方法で使用できるいくつかの異なる重要な戦略がありますか?
- どのように私は私の要件を達成することができますか?
これは、答えの の必須部分を含めるために、 [こちらが望ましい](http://meta.stackoverflow.com/q/8259)の質問に答えることができますが、参照のためのリンクを提供します。リンクと壊れていると将来のユーザーは、リンクに従わずに質問への答えを得ることができるはずです。ここでお勧めのテクニックを使用して質問に答えるコードを投稿することを検討してください。 –