#javascript #node.js #rabbitmq #amqp #node-amqplib
#javascript #node.js #rabbitmq #amqp #узел-amqplib
Вопрос:
Итак, я начал использовать RabbitMQ и выполнять учебные пособия на веб-сайтеhttps://www.rabbitmq.com/tutorials/tutorial-one-javascript.html но я не на 100% понял, как можно настроить функцию aknowledge так, чтобы очередь удаляла сообщение сразу после отправки сообщения, не имеет значения, будет ли сообщение использовано или нет. Я пытаюсь создать очередь, которая удалит все сообщения сразу после отправки
Я попробовал примеры из руководств, например, пример hello world показывает, что для свойства noAck установлено значение true, что означает, что мы не подтверждаем сообщения, поэтому очередь должна фактически удалять эти сообщения после их отправки, но это не так, потому что когда я запускаю send.js 3 раза, а затем запустите receive.js тогда я получу 3 раза сообщение hello world, которое не то, что я хочу
// this is send.js
var amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost', function(error0, connection) {
if (error0) {
throw error0;
}
connection.createChannel(function(error1, channel) {
if (error1) {
throw error1;
}
var queue = 'hello';
var msg = 'Hello World!';
channel.assertQueue(queue, {
durable: false
});
channel.sendToQueue(queue, Buffer.from(msg));
console.log(" [x] Sent %s", msg);
});
setTimeout(function() {
connection.close();
process.exit(0);
}, 500);
});
// this is receive .js
var amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost', function(error0, connection) {
if (error0) {
throw error0;
}
connection.createChannel(function(error1, channel) {
if (error1) {
throw error1;
}
var queue = 'hello';
channel.assertQueue(queue, {
durable: false
});
console.log(" [*] Waiting for messages in %s. To exit press CTRL C",
queue);
channel.consume(queue, function(msg) {
console.log(" [x] Received %s", msg.content.toString());
}, {
noAck: true
});
});
});
например, если я запускаю 3 раза send.js может произойти 2 случая. случай 1 заключается в том, что сообщение будет получено от получателя и готово. случай 2 заключается в том, что оно не будет использовано получателем, и в этом случае я хочу, чтобы оно было удалено я не хочу, чтобы сообщение использовалось, если я запускаю receive.js через месяц с send.js но я также хочу, чтобы моя очередь была долговременной, а не эксклюзивной.
это также будет проблемой, когда я продолжу звонить send.js и сообщения будут постоянно помещаться в эту очередь, а затем, если я запущу receive.js я получу 1000 сообщений одновременно, поэтому моя цель — избежать этого.
Я ценю любую помощь
Комментарии:
1. То, что вы описали, является принципом очередей сообщений — производители создают сообщения, которые затем все потребляются потребителями по порядку. Вы не указали никаких конкретных требований, за исключением того, что вы не хотите, чтобы сообщение оставалось в очереди навсегда. Для этого вы можете установить TTL .
2. свойство noAck: true распознает сообщения как использованные. не имеет значения, действительно ли они потребляются или нет, но что меня смущает, так это то, что здесь используется noAck: True ? кажется, что это ничего не делает, потому что, если сообщения автоматически подтверждаются, очередь должна автоматически удалять их, но здесь это не так с amqplib в Node js
3. ИМХО
noAck
означает отсутствие ручного подтверждения, поэтому сообщение автоматически подтверждается после его использования, независимо от того, было ли оно обработано или нет.4. хорошо, но моя цель состоит в том, чтобы оно было удалено независимо от того, было ли оно использовано или нет. я не хочу запускать send.js 100 раз, а затем, когда я запускаю receive.js я получу 100 раз одно и то же сообщение, как я могу этого избежать
5. Какой смысл отправлять сообщения, если вы не хотите их использовать? Каково ваше ожидаемое поведение после запуска
receive.js
?
Ответ №1:
Что я думаю, что вы хотите, после повторного прочтения комментариев и вопроса, так это то, что вы хотите, чтобы сообщение было либо доставлено потребителю, либо отброшено, если оно не может быть доставлено в тот момент, когда оно попадает в очередь. В этом случае вы можете установить TTL равным 0 либо для очереди, либо для отдельных сообщений. Из соответствующей части документации:
Установка TTL в 0 приводит к тому, что срок действия сообщений истекает при достижении очереди, если они не могут быть доставлены потребителю немедленно.
Чтобы установить TTL очереди, в вашем случае клиента JavaScript вам нужно изменить вызов, чтобы channel.assertQueue
включить arguments
с x-message-ttl
значением 0. Вот пример соответствующей части:
var queue = 'hello';
channel.assertQueue(queue, {
durable: false,
arguments: {
"x-message-ttl": 0
}
});
Для получения более подробной информации обратитесь к amqp.node
документации.