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
確認コールバックが呼び出されないため、フラグは何もしていないように見えます。これは、新しいメッセージを発行する前にメッセージの確認を待つことができないことを意味します。
エラーメッセージが少しわかりにくいので、何が問題なのかわかりません。多くのものを(ほぼ)同時に公開しようとする試みに関係している可能性がありますが、確認のコールバックがなければ、これを止めることはできません...