RabbitMQ 消息中央件/消息队列
RabbitMQ 消息中央件/消息队列1、消息中央件1.1 简介1.2 异步处置惩罚1.2.1 串行方式1.2.2 并行方式1.2.3 消息队列2、作用2.1 消息中央件主要作用3、消息中央件的两种模式1、P2P模式 Rabbitmq2、Pub/Sub模式(发布/订阅:Topic,可以重复消耗) Kafka4、常用中央件介绍与对比1、Kafka2、RabbitMQ3、RocketMQ2、RabbitMQ集群1、RabbitMQ简介2、RabbitMQ 特点3、RabbitMQ模式4、了解集群中的基本概念:5、普通集群准备情况6、开始部署集群三台机器都操作7、RabbitMQ镜像集群配置3、RabbitMQ面试题
1、消息中央件
1.1 简介
什么是消息队列
MQ 全称为Message Queue, 消息队列。是一种应用步伐对应用步伐的通讯方法。应用步伐通过读写出入队列的消息(针对应用步伐的数据)来通讯,而无需专用连接来链接它们。
消息传递指的是步伐之间通过在消息中发送数据举行通讯。
当下主流的消息中央件有RabbitMQ、Kafka、ActiveMQ、RocketMQ等
1.2 异步处置惩罚
场景说明:用户注册账号以后,须要发送注册乐成邮件和注册乐成短信,传统的做法有两种:
1.2.1 串行方式
将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个使命全部完成后才返回给客户端。这有一个问题是,邮件,短信并不是必须的,它只是一个通知,而这种做法让客户端等待没有须要等待的东西。
1.2.2 并行方式
将注册信息写入数据库后,发送邮件的同时,发送短信,以上三个使命完成后,返回给客户端,并行的方式能提高处置惩罚的时间。
假设三个业务节点分别使用50ms,串行方式使用时间150ms,并行使用时间100ms。虽然并性已经提高的处置惩罚时间,但是,前面说过邮件和短信对我正常的使用网站没有任何影响,客户端没有须要等着其发送完成才显示注册乐成,应该是写入数据库后就返回。
1.2.3 消息队列
引入消息队列后,把发送邮件,短信不是必须的业务逻辑异步处置惩罚。
由此可以看出,引入消息队列后,用户的响应时间就即是写入数据库的时间+写入消息队列的时间(可以忽略不计),引入消息队列后处置惩罚后,响应时间是串行的3倍,是并行的2倍。
2、作用
2.1 消息中央件主要作用
- 冗余(存储)
- 消息持久化功能,将消息存储在可靠的介质中,确保在体系故障或瓦解时,消息不会丢失。
- 扩展性
- 消息中央件支持体系的水平扩展。通过添加更多的生产者(Producers)和消耗者(Consumers),可以处置惩罚更大规模的数据量和流量。
- 可恢复性
- 具有内建的故障恢复机制,可以或许在体系组件出现故障时举行恢复。例如,当某个消耗者瓦解后重新启动时,它可以从前次处置惩罚的消息位置继续处置惩罚未完成的消息,从而实现故障恢复。
- 缓冲
- 在生产者和消耗者之间提供缓冲作用。生产者可以以自己的速率发送消息,而消耗者可以以自己的速率处置惩罚消息,这种缓冲机制帮助平滑突发的流量高峰,防止体系过载。
- 异步通讯
- 允许体系之间举行异步通讯,生产者发送消息后不须要等待消耗者处置惩罚完毕,如许可以提高体系的并发性和响应速率。异步通讯模式下,生产者和消耗者可以独立地举行处置惩罚,提升团体体系的服从。
- 削峰
- 消息队列中的常用场景,一样平常在秒杀或抢购活动中使用广泛。一样平常会因为流量过大,应用体系配置承载不了这股瞬间流量,导致体系直接挂掉,即传说中的“宕机”征象。为解决这个问题,我们会将那股巨大的流量拒在体系的上层,即将其转移至 MQ 而不直接涌入我们的接口。
- 解耦(耦合性)
3、消息中央件的两种模式
1、P2P模式 Rabbitmq
P2P模式包含三个角色:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消耗或超时。
P2P的特点:(点对点:Queue,不可重复消耗)
- 每个消息只有一个消耗者(Consumer),即一旦被消耗,消息就不再在消息队列中存在
- 发送者和接收者之间在时间上没有依靠性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行它不会影响到消息被发送到队列
- 接收者在乐成接收消息之后需向队列应答乐成
- 如果希望发送的每个消息都会被乐成处置惩罚的话,那么须要P2P模式
2、Pub/Sub模式(发布/订阅:Topic,可以重复消耗) Kafka
Pub/Sub模式包含三个角色:主题(Topic)、发布者(Publisher)、订阅者(Subscriber) 。多个发布者将消息发送到Topic,体系将这些消息传递给多个订阅者。
Pub/Sub的特点:
- 每个消息可以有多个消耗者
- 发布者和订阅者之间有时间上的依靠性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消耗发布者的消息
- 为了消耗消息,订阅者必须保持运行的状态
- 如果希望发送的消息可以不被做任那边理、或者只被一个消耗者处置惩罚、或者可以被多个消耗者处置惩罚的话,那么可以采用Pub/Sub模子
4、常用中央件介绍与对比
1、Kafka
Kafka是LinkedIn开源的分布式发布-订阅消息体系,目前归属于Apache顶级项目。Kafka主要特点是追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量日志数据的互联网服务的数据收集业务。
2、RabbitMQ
RabbitMQ是使用Erlang语言开发的开源消息队列体系,基于AMQP协议来实现。AMQP的主要特性是异步通讯、 面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业体系内对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
Erlang是一种通用的面向并发的编程语言
AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个开放的尺度应用层协议,用于消息传递。AMQP 设计的初衷是为了实现跨平台的消息队列体系,确保差异的消息传递中央件可以或许互操作。
主要特性
- 异步消息传递:AMQP 支持异步消息传递,可以在发送和接收消息时不须要同步等待。
- 跨平台互操作性:AMQP 是一个开放尺度,支持差异平台和编程语言的互操作。
- 可靠性:提供消息确认、持久化、事务等机制,确保消息不会丢失。
- 机动的路由:支持多种消息路由计谋,如直连、主题、广播等。
3、RocketMQ
RocketMQ是阿里开源的消息中央件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式体系应用的特点。它对消息的可靠传输及事务性做了优化,目前在阿里团体被广泛应用于生意业务、充值、消息推送、日志流式处置惩罚、binglog分发等场景。
RabbitMQ比Kafka可靠,Kafka更适合IO高吞吐的处置惩罚,一样平常应用在大数据日志处置惩罚或对实时性(少量耽误),可靠性(少量丢数据)要求稍低的场景使用,好比ELK日志收集。
2、RabbitMQ集群
1、RabbitMQ简介
RabbitMQ是Erlang开发的,集群非常方便,因为Erlang天生就是分布式语言,但其本身并不支持负载均衡,支持高并发,支持可扩展。支持AJAX,持久化,用于在分布式体系中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。Ajax = 异步 JavaScript 和 XML
2、RabbitMQ 特点
- 可靠性
- 持久化:消息可以持久化到磁盘,确保在服务器重启后仍然可以恢复消息。
- 确认机制:生产者和消耗者可以收到消息传递和处置惩罚的确认,确保消息不会丢失。
- 扩展性
- 集群:RabbitMQ 可以配置为集群模式,多个节点共同工作,分担消息负载。
- 分区互换:消息可以根据规则分发到差异的队列,实现负载均衡。
- 高可用性
- 镜像队列:队列可以配置为镜像队列,消息会在多个节点之间复制,确保其中一个节点故障时消息不会丢失。
- 主动故障转移:在集群模式下,RabbitMQ 可以主动举行故障转移,保持体系的高可用性。
- 多种协议
- AMQP (Advanced Message Queuing Protocol):这是 RabbitMQ 的主要协议,提供了丰富的消息模子。
- HTTP:RabbitMQ 支持通过 HTTP 举行消息传递,便于与其他 Web 应用集成。
- 多语言客户端
- Java:通过 Spring AMQP、RabbitMQ Java Client 等库举行集成。
- 其他语言:如 .NET、JavaScript、Go、PHP 等都有对应的客户端库。
- Web管理界面
- 提供了一个功能强大的 Web 管理界面,便于管理和监控
- 队列管理:可以查看、创建、删除队列。
- 消息监控:实时查看消息流量、消息速率等。
- 权限管理:设置用户权限,控制访问。
- 节点状态:查看集群节点的状态、性能指标。
- 插件机制
- 通过简单的命令可以安装和启用插件。
- Management Plugin:提供 Web 管理界面。
- 其他插件:如耽误队列插件、安全认证插件等。
3、RabbitMQ模式
注意:RabbitMQ模式大概分为以下三种:
(1)单机模式。
(2)普通模式(默认的集群模式)。
(3)镜像模式(把须要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA方案,在对业务可靠性要求较高的场合中比力适合)。要实现镜像模式,须要先搭建出普通集群模式,在这个模式的底子上再配置镜像模式以实现高可用。
4、了解集群中的基本概念:
RabbitMQ的集群节点包括内存节点、磁盘节点。顾名思义内存节点就是将全部数据放在内存,磁盘节点将数据放在磁盘。
一个rabbitmq集群中可以共享 user,vhost,queue,exchange等,全部的数据和状态都是必须在全部节点上复制。
- Broker:
- # RabbitMQ 服务器本身就是一个消息代理(Broker)。它负责接收、存储和转发消息到合适的目的地。
-
-
- ConnectionFactory(连接管理器):
- # 应用程序与Rabbit之间建立连接的管理器,程序代码中使用;如主机名、端口、用户名、密码等。
-
- Exchange(交换器):
- # 交换器(Exchange)是消息路由的核心组件。生产者发送的消息不会直接传递到队列,而是先发送到交换器,然后由交换器根据特定的规则将消息路由到一个或多个队列中。
-
- Routing Key:
- # 一个用于路由消息的字符串。当生产者发送消息到交换机(Exchange)时,会指定一个路由键。交换机会根据这个键和绑定规则将消息分发到相应的队列。
-
- Queue(队列):
- # 存储消息的地方,消费者从队列中获取并处理消息。队列可以配置为持久化,以确保消息在服务器重启后仍然存在。
-
- Bindding(绑定):
- # 将交换机和队列连接起来,定义了交换机如何根据路由键将消息路由到队列。
-
- vhost(虚拟主机):
- # 用于多租户和权限分离的机制。一个 Broker 可以有多个 Vhost,每个 Vhost 可以有独立的交换机、队列、绑定和权限配置。这样可以隔离不同的应用或租户的数据和配置。
-
- producer(生产者):
- # 生产者是创建并发送消息到 RabbitMQ 的应用程序或服务。生产者将消息发送到交换机,并指定一个路由键。
-
- consumer(消费者):
- # 消费者是从 RabbitMQ 队列中接收并处理消息的应用程序或服务。消费者可以订阅一个或多个队列,并根据需要处理消息。
-
- channel(信道):
- # 消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。消息推送使用的通道;
复制代码
面试注意:集群中有两种节点
- 内存节点:只保存状态到内存(持久的queue的持久内容将被保存到磁盘中)
- 磁盘节点:保存状态到内存和磁盘。---保举
内存节点虽然不写入磁盘,但是它执行比磁盘节点要高。集群中,只须要一个磁盘节点来保存状态 就足够了。如果集群中只有内存节点,那么不能停止它们,否则全部的状态,消息等都会丢失。
5、普通集群准备情况
Rabbitmq官方最新rpm包下载地址:https://www.rabbitmq.com/install-rpm.html#downloads
- # rabbitmq 和 erlang兼容版本
- https://www.rabbitmq.com/which-erlang.html
- # erlang 版本选择
- https://packagecloud.io/rabbitmq/erlang
- # rabbitmq 版本选择
- https://www.rabbitmq.com/news.html
复制代码 注意:
三台服务器,RabbitMQ集群节点必须在同一网段,如果是跨域,效果会变差。关闭防火墙和selinux
三台机器都操作:
- 配置hosts文件;更改三台MQ节点的主机名分别为rabbitmq-1、rabbitmq-2 和rabbitmq-3,然后修改hosts配置件
- # 三台主机修改主机名
- [root@rabbitmq-1 ~]# hostnamectl set-hostname rabbitmq-1
-
- # 三台主机本地解析
- [root@rabbitmq-1 ~]# vim /etc/hosts
- 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
- ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
- 192.168.50.138 rabbitmq-1
- 192.168.50.139 rabbitmq-2
- 192.168.50.140 rabbitmq-3
复制代码 - 三个节点配置安装rabbitmq软件
- # 安装依赖
- [root@rabbitmq-1 ~]# yum install -y *epel* gcc-c++ unixODBC unixODBC-devel openssl-devel ncurses-devel
-
- # yum安装erlang
- [root@rabbitmq-1 ~]# wget --content-disposition https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-20.3-1.el7.centos.x86_64.rpm/download.rpm
- [root@rabbitmq-1 ~]# yum install erlang-20.3-1.el7.centos.x86_64.rpm -y
-
- # 测试erlang
- [root@rabbitmq-1 ~]# erl
- Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:10] [hipe] [kernel-poll:false]
-
- Eshell V9.3 (abort with ^G)
- 1>
- # 两次Crtl+c退出
-
-
- # 安装rabbitmq
- [root@rabbitmq-1 ~]# wget https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.5/rabbitmq-server-3.7.5-1.el7.noarch.rpm
- [root@rabbitmq-1 ~]# yum install rabbitmq-server-3.7.5-1.el7.noarch.rpm -y
复制代码- # 启动
- [root@rabbitmq-1 ~]# systemctl daemon-reload
- [root@rabbitmq-1 ~]# systemctl enable --now rabbitmq-server
- [root@rabbitmq-1 ~]# systemctl status rabbitmq-server
-
- # 启动方式二:
- [root@rabbitmq-1 ~]# /sbin/service rabbitmq-server status ---查看状态
- [root@rabbitmq-1 ~]# /sbin/service rabbitmq-server start ---启动
-
- # 每台都操作开启rabbitmq的web访问界面:
- [root@rabbitmq-1 ~]# rabbitmq-plugins enable rabbitmq_management
复制代码
默认:RabbitMQ web界面关闭
创建用户
- 注意:在一台机器操作
-
- # 添加用户和密码
- [root@rabbitmq-1 ~]# rabbitmqctl add_user soho soso
- Adding user "soho" ...
- # soho:用户名
- # soso:密码
-
- # 设置为管理员
- [root@rabbitmq-1 ~]# rabbitmqctl set_user_tags soho administrator
- Setting tags for user "soho" to [administrator] ...
-
- # 查看所有用户
- [root@rabbitmq-1 ~]# rabbitmqctl list_users
- Listing users ...
- guest [administrator]
- soho [administrator]
- ...done.
-
- # 新建用户设置权限
- [root@rabbitmq-1 ~]# rabbitmqctl set_permissions -p "/" soho ".*" ".*" ".*"
- Setting permissions for user "soho" in vhost "/" ...
复制代码 此处设置权限时注意'.'之间须要有空格 三个'.'分别代表了加载conf权限,read权限与write权限 例如:当没有给soho设置这三个权限前是没有权限查询队列,在ui界面也看不见
- # 切换目录
- [root@rabbitmq-1 ~]# cd /etc/rabbitmq/
-
- # 拷贝默认配置文件至工作目录
- [root@rabbitmq-1 rabbitmq]# cp /usr/share/doc/rabbitmq-server-3.7.5/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
-
- [root@rabbitmq-1 rabbitmq]# ls
- enabled_plugins rabbitmq.config
-
- [root@rabbitmq-1 rabbitmq]# vim rabbitmq.config
- # 修改如下:
复制代码
- # 三台机器都操作重启服务服务:
- [root@rabbitmq-1 ~]# systemctl restart rabbitmq-server
复制代码 查看端口
- 4369 -- erlang端口
- 5672 --程序连接端口
- 15672 -- 管理界面ui端口
- 25672 -- server间内部通信端口
复制代码 !注意如果是云服务器,切记添加安全组端口放行。
访问:192.168.50.138:15672
这里须要注意:
rabbitmq默认管理员用户:guest 密码:guest
新添加的用户为:soho 密码:soso
6、开始部署集群三台机器都操作
1.首先创建好数据存放目次和日志存放目次:
3台机器都操作:
- # 创建RabbitMQ数据存放处
- [root@rabbitmq-1 ~]# mkdir -p /data/rabbitmq/data
- # 创建RabbitMQ日志文件存放处
- [root@rabbitmq-1 ~]# mkdir -p /data/rabbitmq/logs
- # 修改权限和属主、属组
- [root@rabbitmq-1 ~]# chmod 777 -R /data/rabbitmq
- [root@rabbitmq-1 ~]# chown rabbitmq.rabbitmq /data/ -R
- # 创建配置文件:
- [root@rabbitmq-1 ~]# vim /etc/rabbitmq/rabbitmq-env.conf
- RABBITMQ_MNESIA_BASE=/data/rabbitmq/data
- RABBITMQ_LOG_BASE=/data/rabbitmq/logs
- # 重启服务
- [root@rabbitmq-1 ~]# systemctl restart rabbitmq-server
复制代码 2.拷erlang.cookie
Rabbitmq的集群是依附于erlang的集群来工作的,以是必须先构建起erlang的集群。Erlang的集群中各节点是经过各个cookie来实现的,这个cookie存放在/var/lib/rabbitmq/.erlang.cookie中,文件是400的权限。以是必须保证各节点cookie一致,不然节点之间就无法通讯。
如果执行# rabbitmqctl stop_app 这条命令报错:须要执行
- #如果执行# rabbitmqctl stop_app 这条命令报错:需要执行
- #chmod 400 .erlang.cookie
- #chown rabbitmq.rabbitmq .erlang.cookie
复制代码 (官方在介绍集群的文档中提到过.erlang.cookie 一样平常会存在这两个地址:第一个是home/.erlang.cookie;第二个地方就是/var/lib/rabbitmq/.erlang.cookie。如果我们使用解压缩方式安装部署的rabbitmq,那么这个文件会在{home}目次下,也就是$home/.erlang.cookie。如果我们使用rpm等安装包方式举行安装的,那么这个文件会在/var/lib/rabbitmq目次下。)
- # 查看Cookie值
- [root@rabbitmq-1 ~]# cat /var/lib/rabbitmq/.erlang.cookie
- HOUCUGJDZYTFZDSWXTHJ
- # scp的方式将rabbitmq-1节点的.erlang.cookie的值复制到其他两个节点中。
- [root@rabbitmq-1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.50.139:/var/lib/rabbitmq/
- [root@rabbitmq-1 ~]# scp /var/lib/rabbitmq/.erlang.cookie root@192.168.50.140:/var/lib/rabbitmq/
复制代码 .erlang.cookie 文件是 Erlang 运行时体系用于节点之间的认证文件。在搭建 RabbitMQ 集群时,确保了集群中的各个节点可以相互通讯和信任。每个节点在启动时都会检查 .erlang.cookie 文件的内容,只有拥有类似 cookie 值的节点才能乐成地创建连接并举行通讯。
3.将mq-2、mq-3作为内存节点加到mq-1节点集群中
- #在mq-2、mq-3执行如下命令: 停止节点,切记不是停止服务
- [root@rabbitmq-2 ~]# rabbitmqctl stop_app
复制代码
- #如果有数据需要重置,没有则不用
- [root@rabbitmq-2 ~]# rabbitmqctl reset
复制代码
注意查看回显,如果不是以上。就是错误;如果报错,重启rabbitmq服务
- # 将两个节点加入集群,指定角色,添加到内存节点
- [root@rabbitmq-2 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq-1
- Clustering node 'rabbit@rabbitmq-2' with 'rabbit@rabbitmq-1' ...
- # 启动节点
- [root@rabbitmq-2 ~]# rabbitmqctl start_app
- Starting node 'rabbit@rabbitmq-2' ...
- completed with 3 plugins.
- ===============================================================================
- [root@rabbitmq-3 ~]# rabbitmqctl stop_app
- Stopping node 'rabbit@rabbitmq-3' ...
- [root@rabbitmq-3 ~]# rabbitmqctl reset
- Resetting node 'rabbit@rabbitmq-3' ...
- [root@rabbitmq-3 ~]# rabbitmqctl join_cluster --ram rabbit@rabbitmq-1
- Clustering node 'rabbit@rabbitmq-3' with 'rabbit@rabbitmq-1' ...
- [root@rabbitmq-3 ~]# rabbitmqctl start_app
- Starting node 'rabbit@rabbitmq-3' ...
- completed with 3 plugins.
- (1)默认rabbitmq启动后是磁盘节点,在这个cluster命令下,mq-2和mq-3是内存节点,
- mq-1是磁盘节点。
- (2)如果要使mq-2、mq-3都是磁盘节点,去掉--ram参数即可。
- (3)如果想要更改节点类型,可以使用命令rabbitmqctl change_cluster_node_type
- disc(ram),前提是必须停掉rabbitmq基础应用erlang
- 注:
- #如果有需要使用磁盘节点加入集群
- [root@rabbitmq-2 ~]# rabbitmqctl join_cluster rabbit@rabbitmq-1
- [root@rabbitmq-3 ~]# rabbitmqctl join_cluster rabbit@rabbitmq-1
复制代码
4.查看集群状态
- #在RabbitMQ集群任意节点上执行 rabbitmqctl cluster_status来查看是否集群配置成功。在mq-1磁盘节点上面查看
- [root@rabbitmq-1 ~]# rabbitmqctl cluster_status
复制代码
5.登录rabbitmq web管理控制台,创建新的队列
打开浏览器输入http://192.168.50.138:15672,
输入默认的Username:guest;输入默认的Password:guest
登录后出现如图所示的界面。
根据界面提示创建一条队列
7、RabbitMQ镜像集群配置
上面已经完成RabbitMQ默认集群模式,但并不保证队列的高可用性,队列内容不会复制。如果队列节点宕机直接导致该队列无法应用,只能等待重启,以是要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,必须要创建镜像队列。
镜像队列是基于普通的集群模式的。
创建镜像集群:在恣意一台机器操作
rabbitmq set_policy :设置计谋
- [root@rabbitmq-1 ~]# rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
- # 命令回显
- Setting policy "ha-all" for pattern "^" to "{"ha-mode":"all"}" with priority "0" for vhost "/" ...
复制代码 "^"匹配全部的队列, ha-all 计谋名称为ha-all, '{"ha-mode":"all"}' 计谋模式为 all 即复制到全部节点,包含新增节点。
再次查看队列已经同步到其他两台节点:
"^"匹配全部的队列, ha-all 计谋名称为ha-all, '{"ha-mode":"all"}' 计谋模式为 all 即复制到全部节点,包含新增节点。
- 设置策略介绍:
- rabbitmqctl set_policy [-p Vhost] Name Pattern Definition
- -p Vhost: 可选参数,针对指定vhost下的queue进行设置
- Name: policy的名称,可以定义
- Pattern: queue的匹配模式(正则表达式),也就是说会匹配一组。
- Definition:镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
- ha-mode:指明镜像队列的模式,有效值为 all/exactly/nodes
- all:表示在集群中所有的节点上进行镜像
- exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
- nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定
- ha-params:ha-mode模式需要用到的参数
- ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manual
- 案例:
- 例如,对队列名称以hello开头的所有队列进行镜像,并在集群的两个节点上完成镜像,policy的设置命令为:
- rabbitmqctl set_policy hello-ha “^hello)” ‘{“ha-mode”:”exactly”,”ha-params”:2,”ha-sync-mode”:”automatic”}’
复制代码 则此时镜像队列设置乐成。已经部署完成。将全部队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一致。
三、常见问题
常见错误:
1、使用 rabbitmq-server -detached命令启动rabbitmq时,出现以下提示Warning: PID file not written; -detached was passed,此时使用rabbitmqctl status提示服务已启动,可知此问题不用解决。
2、由于更改hostname文件,在每次rabbitmqctl stop或者rabbitmqctl cluster_status等,只要是rabbitmq的命令就报错,提示大概如下
- Cluster status of node rabbit@web2 ...
- Error: unable to connect to node rabbit@web2: nodedown
- DIAGNOSTICS
- ===========
- attempted to contact: [rabbit@web2]
- rabbit@web2:
- * connected to epmd (port 4369) on web2
- * epmd reports node 'rabbit' running on port 25672
- * TCP connection succeeded but Erlang distribution failed
- * Hostname mismatch: node "rabbit@mq2" believes its host is different. Please ensure that hostnames resolve the same way locally and on "rabbit@mq2"
- current node details:
- - node name: 'rabbitmq-cli-11@web2'
- - home dir: /root
- - cookie hash: SGwxMdJ3PjEXG1asIEFpBg==
复制代码 此时先ps aux | grep mq,然后kill -9 该历程,然后再rabbitmq-server -detached即可解决。(即先强杀,再重新启动)
3、使用rabbitmqctl stop,rabbitmq-server -detached重新启动后,原先添加的用户admin、假造主机coresystem等均丢失,还须要重新添加。
3、RabbitMQ面试题
1、消息队列的作用?
2、RabbitMQ有什么作用?
- 消息队列
- 将消息从发送方(生产者)传递到接收方(消耗者)。通过消息队列,生产者和消耗者可以异步通讯,互不干扰。
- 异步处置惩罚
- 通过将使命封装成消息放入队列,应用步伐可以实现异步处置惩罚,从而提高响应速率和处置惩罚服从。例如,Web 应用可以快速响应用户哀求,同时在后台处置惩罚耗时的使命。
- 组件解耦
- 通过使用消息队列,体系的差异组件(服务或应用)可以相互解耦。如许,各组件可以独立开发、部署和扩展,而不必直接依靠于其他组件的实现细节。
- 负载均衡
- 当有多个消耗者订阅同一个队列时,RabbitMQ 可以将消息分发给这些消耗者,实现负载均衡,确保每个消耗者处置惩罚的工作量大抵均等。
- 高可用性
- RabbitMQ 支持集群模式和镜像队列,可以提供高可用性和故障恢复本事,确保在节点故障时体系依然可以正常工作。
- 机动的路由
- RabbitMQ 通过互换器(Exchange)和绑定(Binding)机制,提供机动的消息路由功能。可以根据差异的路由键、队列绑定和互换器范例,实现复杂的消息路由规则。
3、RabbitMQ的工作模式?
- 单节点模式
- 单节点模式是最简单的部署方式,适合小型应用或开发测试情况。
- 普通集群模式
- 普通集群模式包含多个 RabbitMQ 节点,节点之间可以共享消息队列,但消息本身不会被复制。
- 镜像模式
- 镜像模式是普通集群模式的扩展,增长了消息的高可用性。队列可以被镜像到集群中的多个节点上。
4、消息队列使用场景
- 使命队列
- 事件通知
- 数据流处置惩罚
- 实时数据流的处置惩罚和分析,例如日志收集和处置惩罚
- 负载分发
- 将消息负载分发给多个消耗者,实现负载均衡和并行处置惩罚
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |