深入理解RabbitMQ消息中间件

2023-12-15 11:29:39

一、引语

本文将介绍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安装erlang

yum install -y rabbitmq-server-3.7.10-1.el7.noarch.rpm      #安装rabbitmq

安装完成之后我们可用依次启动rabbitmq

systemctl daemon-reload
systemctl start rabbitmq-server
systemctl enable rabbitmq-server

rabbitmq-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

?

?

文章来源:https://blog.csdn.net/XX_HK/article/details/134897981
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。