RabbitMQ (через node-amqp): необработанная ошибка соединения: UNEXPECTED_FRAME - ожидаемый заголовок содержимого для класса 60, вместо него получен кадр заголовка без содержимого
Я использую node-amqp для подключения к RabbitMQ. Установка выглядит следующим образом:
- два сервера RabbitMQ (далее "кролики"), один из которых называется "входящий", другой - "уведомитель".
- Данные публикуются "входящему" кролику, и мое приложение буферизует (приложение "буфер") определенное количество сообщений перед записью их в базу данных.
- Затем буфер пытается опубликовать эти сообщения кролику-уведомителю, который предназначен для уведомления других частей системы (например, пользовательского интерфейса).
Удаление сообщений из "входящих" - это нормально, запись в базу данных и т. Д. - все работает, но когда дело доходит до публикации в "уведомителе", я получаю следующую ошибку после попытки опубликовать первую пару сообщений:
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);
});
});
}
И это вызывается в цикле после записи данных в базу данных.
Эта ошибка появляется только один раз, но когда я смотрю в интерфейсе управления RabbitMQ, сообщения вообще не публикуются в очереди. Я пытался изменить тип очереди с fanout
в topic
но безрезультатно. Кроме того, confirm: true
флаг, кажется, ничего не делает, так как обратный вызов подтверждения никогда не вызывается. Это означает, что я не могу дождаться подтверждения сообщения перед публикацией нового сообщения.
Я не могу понять, в чем проблема, поскольку сообщение об ошибке немного загадочно. Это может быть связано с попыткой опубликовать много вещей (почти) одновременно, но без обратного вызова подтверждения я не могу остановить это...