参考资料
- RabbitMQ官方网站
- RabbitMQ官方文档
- 噼咔噼咔-动力节点教程
简单来说,消息中间件就是指保存数据的一个容器(服务器),可以用于两个系统之间的数据传递。
消息中间件一般有三个主要对象:
生产者发送信息到消息服务器,然后消费者会从消息代理中获取数据并进行处理。关系图如下。
其中,broker作为独立的中间件,是不需要我们手动编写的。
在企业级java开发中,有很多需要异步线程处理的场景,这些场景如果比较简单且低负载,我们使用多线程,配合线程池即可很好是胜任。
但是如果出现大流量、高并发的数据传递时,使用消息中间件就很有必要了。
比如动力节点提到的这个场景:
MQ可以作为字面意义的消息中间件,负责调度不同系统之间的交互请求,通过消息进行业务流转(而不是不同的系统之间直接调用)。
用于QPS极高的情况,比如双十一订单量暴增的时候,如果直接将用户的请求打到数据库,则会造成极大的数据库压力。
使用MQ匀速消费可以将QPS降低到一个系统可接受的水平,保证系统的稳定运行。
主要是kafka这个服务器来做。
如果系统采用微服务处理,(比如有1000个微服务)每个单独的服务都会有大量的日志,如果要定位异常就需要每台服务器都要翻找日志,kafka解决了大量日志传输的问题,给出了ELK日志解决方案:
将所有的日志通过kafka集中到一个地方进行查看。
拓展阅读: ELK日志分析系统
由以下三个中间件组成
- Elasticsearch
- Logstash
- Kibana
具体详解:
https://blog.csdn.net/weixin_49022211/article/details/109514485
https://blog.csdn.net/zkc7441976/article/details/115868050
为了快速学习,使用docker快速部署
https://www.rabbitmq.com/which-erlang.html
参考原文链接:https://blog.csdn.net/qq_39340792/article/details/117715984
version: '3.1'
services:
rabbitmq:
restart: always
image: rabbitmq:management
container_name: rabbitmq
hostname: rabbit
ports:
- 5672:5672
- 15672:15672
environment:
TZ: Asia/Shanghai
RABBITMQ_DEFAULT_USER: rabbit
RABBITMQ_DEFAULT_PASS: 123456
volumes:
- ./data:/var/lib/rabbitmq
- ./conf:/etc/rabbitmq
注意:./conf
目录即配置挂载目录需事先创建好,如果未事先创建或是空文件夹启动时会报错。
可以先不挂载该目录启动,然后 通过 docker cp
命令将配置目录拷贝出来。
示例:
docker cp rabbitmq:/etc/rabbitmq ./conf
执行 docker-compose up -d命令启动。
浏览器访问 http://localhost:15672/ 进入RabbitMQ Management 页面。输入上面的用户名和密码登录。
页面如下
标签页分别是
作为rabbitMQ的核心重点,理解工作模型有助于快速上手
大致的工作流程前面已经提到了——
那么在上图中可以发现生产者是如何具体将消息传达到消费者中的。大致流程简单描述如下
至此完成的消息的传递
视频给了一个很形象的类比。有助于我们理解mq的基本构成
rabbitMQ服务器 | Mysql服务器 |
---|---|
一个服务器可以创建多个不同的虚拟主机 | 一个服务器可以创建多个不同的数据库 |
一个虚拟机可以有多个不同的消息队列 | 一个数据库可以有多个不同的表格 |
队列中可以存储多条消息 | 表格中可以存储多条记录 |
这三要素是所有MQ中间件通用
发送消息的应用。(可以是java程序,也可以是其他语言的程序
接受消息的应用。(可以是java程序,也可以是其他语言的程序
即消息服务器,消息中间件,也叫消息队列。
rabbitMQ server 就是 message broker
连接 RabbitMo 服务器的TCP 长连接
连接中的一个虚拟通道,消息队列发送或者接收消息时,都是通过信道进行的;
一个虚拟分组,在代码中就是一个字符串。
当多个不同的用户使用同一个RabbitMQ 服务时,可以划分出多个 Virtual host。每个用户在自己的 Virtual host 创建 exchange/queue 等;
(分类比较清晰、相互隔离)
交换机负责从生产者接收消息,并根据交换机类型分发到对应的消息队列中,起到一个路由的作用
交换机根据路由键来决定消息分发到哪个队列,路由键是消息的目的地址
也就是说其实在每一个channel中都有一个路由key,通过这个key就可以快速定位到具体的队列。避免了消息乱发队列的情况。
绑定是队列和交换机的一个关联连接(关联关系)
存储消息的缓存队列
由生产者通过 Rabbitmq 发送给消费者的信息; (消息可以任何数据字符串、user 对象,json 串等等)