这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战 RabbitMQ:以下简称mq 文档传送门
mq的基本概念:
消息队列:应用之间通讯的工具。传递信息。 集体工作流程: consumer 订阅消息,producer生成消息到queue中,queue发送消息给consumer。
graph TD
生产者(producer) --> queue --> 消费者(consumer)
再细致一些queue中有Exchange,通过绑定queue,来进行确认发送给哪个消费者。并且消费者也需要跟queue保持常连接状态
Exchange 类型
direct:属于完全匹配类型。一个消费者对应一个订阅者
fanout:属于分发类型,一个消费者分发给多个订阅者。不用担心效率问题。转发速度很快
topic: 属于匹配类型,一个消费者分发给匹配到的多个订阅者。
mq实战
mq支持多种语言,本文已node为例传送门 引入amqplib头文件
const amqp = require('amqplib');
创建连接
const params = {
protocol : 'amqp',
hostname : ,
port : ,
username : ,
password : ,
vhost : '/',
heartbeat: 3,
locale : 'en_US',
frameMax : 0
};
return await amqp.connect(params);
连接exchange,Queue
const channel = await connection.createChannel();
await channel.assertExchange('exchange名称', 'direct', {
durable : true, // 持久形队列,服务重新启动的时候,不会清除
autoDelete: false // 当queue中得消息消费完以后,不自动删除
});
await channel.assertQueue(option.queue, {
durable: true, // 持久形队列,服务重新启动的时候,不会清除
autoDelete: true // 当所有消费客户端连接断开后,是否自动删除队列
});
// 绑定queue 和 exchange
channel.bindQueue(queue, exchange, queue);
subscribe 订阅
// 开始订阅(prefetch每次从queue获取的数量)
await channel.prefetch(prefetch || 1);
// noAck标记设为false时,不自动响应消息已经被处理,需要ack方法通知mq
// accept 自定义消息接受方法
await channel.consume(queue, accept, { noAck: !!option.noAck });
publish 发送消息
channel.publish(exchange, queue, Buffer.from(message), params, async err => {
await channel.close();
await channel.connection.close();
});