0

node-amqpを使用して RabbitMQ に接続しています。セットアップは次のとおりです。

  • 2 つの RabbitMQ サーバー (以降「ウサギ」)、1 つは「受信」、もう 1 つは「通知」と呼ばれます。
  • データは「着信」うさぎに公開され、アプリはデータベースに書き込む前に特定の数のメッセージをバッファーします (「バッファー」アプリ)。
  • 次に、バッファはこれらのメッセージを、システムの他の部分 (UI など) に通知するように設計された「通知者」ウサギに発行しようとします。

「着信」からメッセージを引き出すことは問題なく、データベースへの書き込みなどはすべて機能しますが、「通知者」への公開に関しては、最初のいくつかのメッセージを公開しようとした後に次のエラーが発生します。

Unhandled connection error: UNEXPECTED_FRAME - expected content header for class 60, got non content header frame instead

接続は次のようになります。

self.exchangeOpen = new Promise(function(resolve) {
    var exchangeOptions = {
        type:       'fanout',
        autoDelete: false,
        confirm:    true
    };
    conn.exchange(opts.exchange, exchangeOptions, function(exchange) {
        debug('exchange %s opened', opts.exchange);
        self.exchange = exchange;
        resolve(exchange);
    });
});

(取引所が開かれたというメッセージが表示されるので、実際には正常に開きます。)

次に、次のようにこの取引所に公開しています。

publish: function(data) {
    var self = this;

    debug('publishing data');

    return new Promise(function(resolve) {
        self.exchange.publish('', data, { contentType: 'application/json' }, function() {
            debug('data published!');
            resolve(data);
        });
    });
}

これは、データがデータベースに書き込まれると、ループで呼び出されます。

このエラーは 1 回だけ表示されますが、RabbitMQ 管理インターフェイスを見ると、キューにメッセージがまったく発行されていません。fanoutキューの種類を からに変更しようとしましtopicたが、役に立ちませんでした。さらに、confirm: true確認コールバックが呼び出されないため、フラグは何もしていないように見えます。これは、新しいメッセージを発行する前にメッセージの確認を待つことができないことを意味します。

エラーメッセージが少しわかりにくいので、何が問題なのかわかりません。多くのものを(ほぼ)同時に公開しようとする試みに関係している可能性がありますが、確認のコールバックがなければ、これを止めることはできません...

4

0 に答える 0