一。使用amqplib
官网文档:
http://www.squaremobius.net/amqp.node/channel_api.html
const amqp = require('amqplib');
二。发布订阅样例
1. publish
async function main() {
let amqp = require('amqplib');
let conn = await amqp.connect('amqp://10.200.3.114'); // 创建连接
let channel = await conn.createChannel(); // 创建channel
await channel.assertExchange('logs', 'fanout', {durable: false}); // 绑定exchange,exchange名为logs, 'fanout'为广播类型,
await channel.publish('logs', '', Buffer.from('test message')); // 在绑定的exchange上发布消息,队列名不填exchange会自动分配一个
await channel.close();
await conn.close();
}
main()
2. consume消息
async function main() {
async function logMessage(msg) {
console.log(msg.fields); // fields中会给出{queue队列名,messageCount最近消息数,consumerCount最近消费者数}
console.log(msg.content.toString()); // content为消息内容
}
let amqp = require('amqplib');
let coon = await amqp.connect('amqp://10.200.3.114'); // 创建连接
let channel = await coon.createChannel(); // 创建channel
await channel.assertExchange('logs', 'fanout', {durable: false}); // 绑定exchange,'logs'为exchange名,'fanout'为广播类型,
let queue_ok = await channel.assertQueue('', {exclusive: true}); // 确定队列
await channel.bindQueue(queue_ok.queue, 'logs', ''); // 绑定队列,'logs'为exchange名
await channel.consume(queue_ok.queue, logMessage, {noAck: true}) // 消费消息,logMessage为回调的消息处理函数
}
main()
三。部分参数说明
1.广播为实时,publish只负责发送,不管对方是否收到,因此广播模式下消息持久化无效。
2.三种广播模式:
fanout:所有bind到该exchange的queue都会接收到消息
direct:通过routingKey和exchange同时决定哪个queue会接收到消息
topic:所有符合routingKey所bind的queue可以接收消息