Как amqplib доставляет сообщения вашему обработчику приложений
У меня есть следующий код:
class Queue extends EventEmitter {
async listen(queueName) {
await this._channel.prefetch(10);
this._channel.consume(queueName, (message) => {
if (!message) {
return;
}
this.emit(queueName, new QueueMessage(this._channel, message));
});
}
}
А затем, где-то еще, я собираю события, генерируемые последней строкой кода выше, и выполняю некоторую асинхронную работу (HTTP-запросы), после чего я подтверждаю их.
Мое понимание prefetch
Это в основном оптимизация для одновременной доставки нескольких сообщений потребителю, избавляя его от необходимости совершать многократные обходы на сервер RabbitMQ. Кроме того, если клиент имеет больше сообщений unACK, чем количество предварительных выборок, библиотека RabbitMQ не извлекает больше сообщений, пока некоторые из них не будут ACKed или NACKed.
Однако часть, которую я, похоже, не нахожу, касается того, как эти сообщения будут доставляться в код потребителя.
Например, в моем коде, предполагая, что сообщение 1 доставлено, преобразовано в событие и приведено к асинхронному HTTP-запросу, будет сообщение 2 после того, как оно будет доставлено, преобразовано в событие и превращено в другой асинхронный HTTP-запрос ДО первого сообщение либо ACKed, либо NACKed?
Если да, то является ли установка предварительной выборки = 1 единственным способом гарантировать, что сообщения обрабатываются до ACK или NACK, одно за другим?