一、引语
本文将介绍RabbitMQ消息中间件的基本概念、工作原理以及在实际应用中的使用场景。通过阅读本文,您将了解到RabbitMQ如何帮助企业实现高效的异步通信和解耦。
二、消息中间件
1.简介
信息中间件是一种应用于分布式系统的基础软件,它位于各类应用/服务与操作系统/数据库系统以及其他系统软件之间,主要解决分布式环境下数据传输、数据访问、事务处理、安全认证等问题。 中间件可以理解为面向信息系统交互,集成过程中的通用部分的集合,屏蔽了底层的通讯,交互,连接等复杂又通用化的功能,以产品的形式提供出来,系统在交互时,直接采用中间件进行连接和交互。
2.主要作用
- 冗余(存储)--有些情况下处理数据的过程会失败,造成数据丢失,可使用消息中间件进行数据持久化
- 扩展性
- 解耦
- 异步通信
- 削峰:消息队列中的常用场景,比如线上的双十一秒杀,或者春节火车票抢购,会有大量的请求同时进来。这时服务承受的压力是平时的几十甚至上百倍,一般会因为流量过大,应用系统配置承载不了这股瞬间流量,容易造成数据库的崩溃或者导致系统直接挂掉,即传说中的“宕机”现象。为解决这个问题,加入了消息中间件后我们会将那股巨大的力量将其统一转移至MQ中均速处理消息。而不直接涌入我们的后端服务接口,这样可以防止流量洪峰造成系统服务崩溃.
3.消息中间件的两种模式
- P2P模式(点对点模式)包含三个角色:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每个消息都被发送到一个特定的队列,消息可以在队列中进行异步传输,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。队列支持多个消费者,但是一个消息只能被一个消费者消费。
- Pub/Sub模式(发布订阅模式)包含三个角色:主题(Topic)、发布者(Publisher)、订阅者(Subscriber) 。发布者将消息发送到Topic,多个订阅者从 Topic 订阅消息。一个消息可以被多个订阅者消费。
4.思考
消费者怎么从消息队列里边得到数据?有两种办法:1.生产者将数据放到消息队列中,消息队列有数据了,主动叫消费者去拿(俗称push)
2.消费者不断去轮训消息队列,看看有没有新的数据,如果有就消费(俗称pull)
三、Rabbitmq集群
1.Rabbitmq的简介
RabbiMQ是⽤erlang语言开发的,开源的,集群⾮常⽅便,支持多种语言客户端,包括java、Python、ruby、PHP、C/C++等,但其本身并不⽀持负载均衡,支持高并发。支持AJAX,持久化,用于在分布式系统中存储转发消息,在易用性、高可用性等方面表现不俗。
2.特点
- 可靠性---提供了多种技术可以在性能和可靠性之间进行权衡。这些技术包括 持久性机制、投递确认、和高可用性机制
- 高可用性
- 多语言客户端
- 管理界面
- 插件机制
3.思考
如何实现持久化?
1 队列实现持久化
如果要队列实现持久化,需要在声明队列的时候把 durable 参数设置为持久化 。
boolean durable = true;
channel.queueDeclare(ACK_QUEUE_NAME, durable, false, false, null);
但是需要注意的就是如果之前声明的队列不是持久化的,需要把原先队列先删除,或者重新 创建一个持久化的队列,不然就会出现错误。
当我们将durable参数位置传递true之后,即使重启 rabbitmq 队列也依然存在。2 消息实现持久化
要想让消息实现持久化需要在消息生产者修改代码,需要像channel的basicPublish方法中props属性中传递MessageProperties.PERSISTENT_TEXT_PLAIN 参数
4.实验过程
注意:集群中有两种节点,分别为内存节点和镜像节点
1 内存节点:只保存状态到内存(持久的queue的持久内容将被保存到disk)2 磁盘节点:保存状态到内存和磁盘。---推荐内存节点虽然不写入磁盘,但是它执行比磁盘节点要好。集群中,只需要一个磁盘节点来保存状态 就足够了
如果集群中只有内存节点,那么不能停止它们,否则所有的状态,消息等都会丢失。
我们进行普通集群的部署
准备环境
准备三台干净的服务器,并关闭防火墙和selinux,在完成准备这些以后,我们还要对服务器进行改名和映射处理。
192.168.91.5 rabbitmq-1
192.168.91.6 rabbitmq-2
192.168.91.7 rabbitmq-3
分别在三个节点上安装rabbitmq软件
yum install -y *epel* gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel #安装依赖curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
yum install erlang-21.3.8.21-1.el7.x86_64 #yum安装erlangyum install -y rabbitmq-server-3.7.10-1.el7.noarch.rpm #安装rabbitmq
安装完成之后我们可用依次启动rabbitmq
systemctl daemon-reload
systemctl start rabbitmq-server
systemctl enable rabbitmq-serverrabbitmq-plugins enable rabbitmq_management #开启web访问页面
开启用户远程登录
cp /usr/share/doc/rabbitmq-server-3.7.5/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config # vim /etc/rabbitmq/rabbitmq.config
除去第61行的注释即可
完成以上操作我们再重启服务就可以通过浏览器进行访问了
systemctl restart rabbitmq-server