0

JRuby にコードがあります。

class Receiver

  def initialize(channel_id)
    @channel_id = channel_id

    factory = ConnectionFactory.new
    factory.setHost("localhost")
    connection = factory.newConnection
    @channel = connection.createChannel
    @channel.exchangeDeclare(exchange_name, "direct");
    @channel.queueDeclare(queue_name, true, false, false, nil)
    @channel.queueBind(queue_name, exchange_name, routing_key)
    @consumer = QueueingConsumer.new(@channel);
    @channel.basicConsume(queue_name, true, @consumer);
  end

  def receive
    String.from_java_bytes @consumer.nextDelivery.getBody
  end

  private

  def queue_name
    @channel_id
  end

  def exchange_name
    @channel_id
  end

  def routing_key
    @channel_id
  end

end

このコードは、私のアーキテクチャでメッセージを受け取る責任があります。しかし、私がieを持っているとき。同じ channel_id (基本的に交換名とルート キー) を持つ の2 つのインスタンスはReceiver、この交換にメッセージを送信すると、1 つのメッセージが 1 つの受信者に送信され、別の受信者に送信されます。なぜ、私は間違っているのですか?

4

1 に答える 1

3

問題は、1 つのキューに同時に登録された 2 つのエージェントが何かを処理する必要があるのはなぜですか? 通常、RabbitMQ では、複数のエージェントを 1 つのキューにサブスクライブできますが、それらはすべて同じことを行い、冗長性/負荷分散のためです。ランダムなエージェントがキューからメッセージを取得して ACK を送信すると、他のユーザーがメッセージを消費するのを防ぐことができます。

通常、キューは 1 つのアクションを意味し、リッスンしているエージェントは同等であり、メッセージを拾うことができます。メッセージを 1 つの場所に送信してから複数のエージェントにブロードキャストする場合は、ファンアウト交換を使用して、各エージェントが個別のキューでリッスンすることをお勧めします。

したがって、各キューが 1 つのことを行っているかのように考えてください。あなたが説明している動作は、まさに意図されたものです。

ファンアウト エクスチェンジの設定の詳細と、さまざまなエクスチェンジの機能については、このチュートリアルを参照してください。

于 2013-02-13T19:17:54.150 に答える