2017-09-08 7 views
0

さまざまなキュー(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以上の異なるキューを持っており、それらに同じメッセージを生成する必要があるかもしれません。

だから、質問は以下のとおりです。

  1. は、私はそのような長いキーを使用できますか?それができたらどうすればいい?
  2. 多分exchangeやキューの異なる設定で同じ目標を達成できますか?
  3. おそらくdistingueshの宛先を壊して、それを255シンボルで崩壊させることができるハッシュ関数がありますか?そうであれば、異なる出版物を扱う方法を提供するはずです(たとえば、番号555と8989のキューだけに送る方法)?
  4. 多分、その方法で使用できるいくつかの異なる重要な戦略がありますか?
  5. どのように私は私の要件を達成することができますか?

答えて

0

私はちょうど短時間前にRabbitQMを使い始めましたが、それでもあなたを助けてくれることを願っています。ルーティングキーには、好きなだけ多くの単語を255バイトまで使用できます(例:RabbitMQ Tutorial 5 - Topicsにも記載されています)。したがって、トピック交換は、あなたのユースケースには適切ではないようです。

この場合、おそらくheaders exchangeを使用できますか?

ヘッダー交換は、ルーティングキーよりもメッセージヘッダーとして簡単に表現できる複数の属性のルーティング用に設計されています。ヘッダー交換はルーティングキー属性を無視します。代わりに、ルーティングに使用される属性はheaders属性から取得されます。ヘッダーの値がバインディング時に指定された値と等しい場合、メッセージは一致しているとみなされます。

たとえば、hereおよびhereを参照してください。私が言ったように、私はちょうどRabbitMQで始まったので、これがあなたのための選択肢かもしれないかどうかは分かりません。後で時間があれば、私はあなたのための簡単な例を作ろうとします。

+0

これは、答えの の必須部分を含めるために、 [こちらが望ましい](http://meta.stackoverflow.com/q/8259)の質問に答えることができますが、参照のためのリンクを提供します。リンクと壊れていると将来のユーザーは、リンクに従わずに質問への答えを得ることができるはずです。ここでお勧めのテクニックを使用して質問に答えるコードを投稿することを検討してください。 –

関連する問題