深入理解RabbitMQ消息中间件

一、引语

本文将介绍RabbitMQ消息中间件的基本概念、工作原理以及在实际应用中的使用场景。通过阅读本文,您将了解到RabbitMQ如何帮助企业实现高效的异步通信和解耦。

二、消息中间件

1.简介

信息中间件是一种应用于分布式系统的基础软件,它位于各类应用/服务与操作系统/数据库系统以及其他系统软件之间,主要解决分布式环境下数据传输、数据访问、事务处理、安全认证等问题。 中间件可以理解为面向信息系统交互,集成过程中的通用部分的集合,屏蔽了底层的通讯,交互,连接等复杂又通用化的功能,以产品的形式提供出来,系统在交互时,直接采用中间件进行连接和交互。

2.主要作用

  • 冗余(存储)--有些情况下处理数据的过程会失败,造成数据丢失,可使用消息中间件进行数据持久化
  • 扩展性
  • 解耦
  • 异步通信
  • 削峰:消息队列中的常用场景,比如线上的双十一秒杀,或者春节火车票抢购,会有大量的请求同时进来。这时服务承受的压力是平时的几十甚至上百倍,一般会因为流量过大,应用系统配置承载不了这股瞬间流量,容易造成数据库的崩溃或者导致系统直接挂掉,即传说中的"宕机"现象。为解决这个问题,加入了消息中间件后我们会将那股巨大的力量将其统一转移至MQ中均速处理消息。而不直接涌入我们的后端服务接口,这样可以防止流量洪峰造成系统服务崩溃.

3.消息中间件的两种模式

  • P2P模式(点对点模式)包含三个角色:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每个消息都被发送到一个特定的队列,消息可以在队列中进行异步传输,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。队列支持多个消费者,但是一个消息只能被一个消费者消费。
  • Pub/Sub模式(发布订阅模式)包含三个角色:主题(Topic)、发布者(Publisher)、订阅者(Subscriber) 。发布者将消息发送到Topic,多个订阅者从 Topic 订阅消息。一个消息可以被多个订阅者消费。

4.思考

bash 复制代码
消费者怎么从消息队列里边得到数据?有两种办法:

1.生产者将数据放到消息队列中,消息队列有数据了,主动叫消费者去拿(俗称push)
2.消费者不断去轮训消息队列,看看有没有新的数据,如果有就消费(俗称pull)

三、Rabbitmq集群

1.Rabbitmq的简介

RabbiMQ是⽤erlang语言开发的,开源的,集群⾮常⽅便,支持多种语言客户端,包括java、Python、ruby、PHP、C/C++等,但其本身并不⽀持负载均衡,支持高并发。支持AJAX,持久化,用于在分布式系统中存储转发消息,在易用性、高可用性等方面表现不俗。

2.特点

  • 可靠性---提供了多种技术可以在性能和可靠性之间进行权衡。这些技术包括 持久性机制、投递确认、和高可用性机制
  • 高可用性
  • 多语言客户端
  • 管理界面
  • 插件机制

3.思考

bash 复制代码
如何实现持久化?
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.实验过程

注意:集群中有两种节点,分别为内存节点和镜像节点

bash 复制代码
1 内存节点:只保存状态到内存(持久的queue的持久内容将被保存到disk)

2 磁盘节点:保存状态到内存和磁盘。---推荐

内存节点虽然不写入磁盘,但是它执行比磁盘节点要好。集群中,只需要一个磁盘节点来保存状态 就足够了
如果集群中只有内存节点,那么不能停止它们,否则所有的状态,消息等都会丢失。

我们进行普通集群的部署

准备环境

bash 复制代码
准备三台干净的服务器,并关闭防火墙和selinux,在完成准备这些以后,我们还要对服务器进行改名和映射处理。
192.168.91.5     rabbitmq-1
192.168.91.6     rabbitmq-2
192.168.91.7     rabbitmq-3

分别在三个节点上安装rabbitmq软件

bash 复制代码
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

bash 复制代码
systemctl daemon-reload
systemctl start rabbitmq-server
systemctl enable rabbitmq-server

rabbitmq-plugins enable rabbitmq_management       #开启web访问页面

开启用户远程登录

bash 复制代码
cp /usr/share/doc/rabbitmq-server-3.7.5/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config    

# vim /etc/rabbitmq/rabbitmq.config
除去第61行的注释即可

完成以上操作我们再重启服务就可以通过浏览器进行访问了

bash 复制代码
systemctl restart rabbitmq-server
相关推荐
技术路上的苦行僧1 小时前
分布式专题(10)之ShardingSphere分库分表实战指南
分布式·shardingsphere·分库分表
GitCode官方2 小时前
GitCode 光引计划投稿 | GoIoT:开源分布式物联网开发平台
分布式·开源·gitcode
小扳4 小时前
微服务篇-深入了解 MinIO 文件服务器(你还在使用阿里云 0SS 对象存储图片服务?教你使用 MinIO 文件服务器:实现从部署到具体使用)
java·服务器·分布式·微服务·云原生·架构
zquwei13 小时前
SpringCloudGateway+Nacos注册与转发Netty+WebSocket
java·网络·分布式·后端·websocket·网络协议·spring
道一云黑板报16 小时前
Flink集群批作业实践:七析BI批作业执行
大数据·分布式·数据分析·flink·kubernetes
飞来又飞去18 小时前
kafka sasl和acl之间的关系
分布式·kafka
MZWeiei19 小时前
Zookeeper的监听机制
分布式·zookeeper
莹雨潇潇19 小时前
Hadoop完全分布式环境部署
大数据·hadoop·分布式
浩哲Zhe20 小时前
RabbitMQ
java·分布式·rabbitmq
明达技术20 小时前
分布式 IO 模块:赋能造纸业,革新高速纸机主传动
分布式