RabbitMQ 常规使用

161 阅读2分钟

这是我参与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();         
});