深入理解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
相关推荐
茶杯梦轩4 天前
从零起步学习RabbitMQ || 第三章:RabbitMQ的生产者、Broker、消费者如何保证消息不丢失(可靠性)详解
分布式·后端·面试
回家路上绕了弯6 天前
深入解析Agent Subagent架构:原理、协同逻辑与实战落地指南
分布式·后端
用户8307196840826 天前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
用户8307196840828 天前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq
初次攀爬者9 天前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
初次攀爬者11 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
让我上个超影吧12 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖12 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
断手当码农12 天前
Redis 实现分布式锁的三种方式
数据库·redis·分布式
初次攀爬者12 天前
Redis分布式锁实现的三种方式-基于setnx,lua脚本和Redisson
redis·分布式·后端