0

3 台のワーカー マシンで AMQP gem を使用して rabbitmq を実行しています。マシンが再起動されると、私のキューには、ワーカーが追加されただけで、サブスクライブ解除されていないことが示されます。たとえば、各マシンが 5 つのワーカーを実行するとします。

3 台のマシンを起動すると、15 のワーカーがキューにサブスクライブされている 3 台のマシンすべてをシャットダウンしても、まだ 15 のワーカーがキューにサブスクライブされている 3 台のマシンを再起動すると、キューに 30 のワーカーがサブスクライブされている

実際には、ワーカーは 15 人しかいないはずです。

マシンの再起動/シャットダウン時にタスク キューへの接続を確実に閉じるにはどうすればよいですか? 私が試してみました:

  Signal.trap("INT") do #handles the ctrl c case
    connection.close do
      EM.stop { exit }
    end
  end

  Signal.trap("TERM") do #handles the reboot and shut down case
    connection.close do
      EM.stop { exit }
    end
  end

これは動作しません。

4

1 に答える 1

1

あなたが探しているのは、消費者キャンセル通知拡張機能だと思います。

あなたの場合、クライアントはマシンの再起動について通知されていません (つまり、マシンの再起動時にrabbitmqブローカーから「basic.cancel」通知を受け取っていません)。

上記のリンクからの抜粋を参照してください。

このような予期しない消費者のキャンセルの場合に、ブローカーがクライアントに basic.cancel を送信する拡張機能。これは、ブローカーがクライアントから basic.cancel を受信した場合には送信されません。AMQP 0-9-1 クライアントは、デフォルトでは、ブローカーから basic.cancel メソッドを非同期に受信することを想定していないため、この動作を有効にするために、クライアントは client-properties に機能テーブルを提示する必要があります。キー consumer_cancel_notify とブール値 true

私は Ruby プログラマーではありませんが、上記のリンクにある Java の例で全体像がわかると思います。

于 2012-05-07T19:51:17.360 に答える