什么是RabbitMQ?
- RabbitMQ是一个开源的,在AMQP基础上完整的,可复用的企业消息系统。
- 支持主流的操作系统,Linux、Windows、MacOX等
- 多种开发语言支持,Java、Python、Ruby、.NET、PHP、C/C++、javaScript等
RabbitMQ核心概念
- 消息:在RabbitMQ中,消息是传递的基本单元。它由消息体和可选的属性组成
- 生产者Producer:生产者是消息的发送方,它将消息发送到RabbitMQ的交换器(Exchange)中
- 交换器Exchange:交换器接收从生产者发送的消息,并根据特定的规则将消息路由到一个或多个队列中
- 队列Queue:队列是消息的接收方,它存储了待处理的消息。消费者可以从队列中获取消息并进行处理
- 消费者Consumer:消费者是消息的接收方,它从队列中获取消息并进行处理
RabbitMQ 的安装
1. Rabbit MQ的依赖环境erlang
因为MQ是基于这个语言开发的
官网下载erlang:www.erlang.org/downloads
安装完成之后 新增一个环境变量
ERLANG_HOME -> 对应的目录例如(D:\erlang\Erlang OTP)
然后path 新增 %ERLANG_HOME%\bin
保存 打开cdm 输入 erl 没有报错即可成功
2. 安装MQ
例如windows
安装完成之后配置环境变量
启动MQ
安装MQ插件拥有可视化面板
bash
rabbitmq-plugins enable rabbitmq_management
启动MQ命令
MQ默认端口5672
bash
rabbitmq-server.bat start
访问 http://localhost:15672/#/ 账号密码都是 guest
Nodejs使用
我们在Nodejs使用MQ 无非就是微服务应用,或者就是跨语言通讯
安装依赖
sh
npm install amqplib
producer.js 生产者
js
import express from 'express'
import amqplib from "amqplib";
const app = express()
//连接MQ
const connection = await amqplib.connect("amqp://localhost")
//创建一个通道
const channel = await connection.createChannel()
const queueName = "task_queue"
app.get('/send', (req, res) => {
const message = req.query.message
//发送消息
channel.sendToQueue(queueName, Buffer.from(message))
res.send('send message success')
})
app.listen(3000,()=>{
console.log('producer listen 3000')
})
consume.js 消费者
js
import amqplib from "amqplib";
const queueName = "task_queue"
//连接
const connection = await amqplib.connect("amqp://localhost")
const channel = await connection.createChannel()
//连接队列
await channel.assertQueue(queueName, {
durable: true //持久连接
})
//消息者监听器
channel.consume(queueName, (msg) => {
console.log(`[x] Received ${msg.content.toString()}`)
channel.ack(msg) //确认消费该消息
})
甚至还可以跨语言通讯 python
py
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
queueName = 'task_queue'
channel.queue_declare(queue=queueName,durable=True)
message = '小满zs'
channel.basic_publish(exchange='',routing_key=queueName,body=message)
connection.close()