rebbitMQ的端口
4369 — erlang端口
5672 —程序连接端口
15672 — 管理界面ui端口
25672 — server间内部通信端口
rabbitMQ的简介
消息中间件也可以称消息队列,是指用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。
当下主流消息中间件
RabbitMQ、Kafka、ActiveMQ、RocketMQ
但是我们公司只用到了rabbitmq 和 kafka kafka主要用于收集日志
消息中间件的作用
如何保证消息队列的可靠性
生产者到RabbitMQ:事务机制和Confirm机制,注意:事务机制和 Confirm 机制是互斥的,两者不能共存,会导致 RabbitMQ 报错。
RabbitMQ自身:持久化、集群、普通模式、镜像模式。
RabbitMQ到消费者:basicAck机制、死信队列、消息补偿机制。
RabbitMQ中消息可能有的几种状态?
alpha: 消息内容(包括消息体、属性和 headers) 和消息索引都存储在内存中 。
beta: 消息内容保存在磁盘中,消息索引保存在内存中。
gamma: 消息内容保存在磁盘中,消息索引在磁盘和内存中都有 。
delta: 消息内容和索引都在磁盘中 。
消息中间件的两种模式
p2p模式
- 每个消息只有一个消费者(Consumer),即一旦被消费,消息就不再在消息队列中存在
- 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行它不会影响到消息被发送到队列
- 接收者在成功接收消息之后需向队列应答成功
如果希望发送的每个消息都会被成功处理的话,那么需要P2P模式
pub/sub模式
每个消息可以有多个消费者
- 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息
- 为了消费消息,订阅者必须保持运行的状态
- 如果希望发送的消息可以不被做任何处理、或者只被一个消费者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型
常用的消息中间件介绍和对比
kafka
Kafka主要特点是追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量日志数据的互联网服务的数据收集业务。
RabbitMQ
RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全
RocketMQ
RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。它对消息的可靠传输及事务性做了优化
rabbitMQ的特点
- 可靠性
- 扩展性
- 高可用性
- 多种协议
- 多语言客户端
- Web管理界面
- 插件机制
rabbitMQ三种模式
(1)单机模式。
(2)普通模式(默认的集群模式)。
(3)镜像模式(把需要的队列做成镜像队列,存在于多个节点,属于RabbiMQ的HA方案
rabbitmq集群的两种节点
1 内存节点:只保存状态到内存(持久的queue的持久内容将被保存到磁盘中)
2 磁盘节点:保存状态到内存和磁盘。—-推荐
普通集群的搭建
hosts配置
192.168.50.138 rabbitmq-1
192.168.50.139 rabbitmq-2
192.168.50.140 rabbitmq-3
三个节点配置安装rabbitmq软件
wget https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.5/rabbitmq-server-3.7.5-1.el7.noarch.rpm
yum install rabbitmq-server-3.7.5-1.el7.noarch.rpm -y
启动
systemctl start rabbitmq-server
创建用户
rabbitmqctl add_user soho soso
rabbitmqctl set_user_tags soho administrator
开启用户远程登录:3台机器都操作
vim rabbitmq.config
重启
访问ip地址加端口15672
创建好数据存放目录和日志存放目录
mkdir -p /data/rabbitmq/data
mkdir -p /data/rabbitmq/logs
mkdir -p /data/rabbitmq/logs
chmod 777 -R /data/rabbitmq
chown rabbitmq.rabbitmq /data/ -R
vim /etc/rabbitmq/rabbitmq-env.conf
RABBITMQ_MNESIA_BASE=/data/rabbitmq/data
RABBITMQ_LOG_BASE=/data/rabbitmq/logs
systemctl restart rabbitmq-server
拷erlang.cookie
将mq-2、mq-3作为内存节点加到mq-1节点集群中
在mq-1
rabbitmqctl start_app
在mq-2、mq-3执行如下命令:
[root@rabbitmq-2 ~]# rabbitmqctl stop_app #停止节点,切记不是停止服务
添加节点两台机子都操作
rabbitmqctl join_cluster —ram rabbit@rabbitmq-1
查看集群状态
rabbitmqctl cluster_status
登录rabbitmq web管理控制台

看到三个节点
RabbitMQ镜像集群配置
RabbitMQ默认集群模式,但并不保证队列的高可用性,队列内容不会复制。如果队列节点宕机直接导致该队列无法应用,只能等待重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,必须要创建镜像队列
创建镜像集群:在任意一台机器操作
设置策略 rabbitmq set_policy
rabbitmqctl set_policy ha-all “^” ‘{“ha-mode”:”all”}’
Setting policy “ha-all” for pattern “^” to “{“ha-mode”:”all”}” with priority “0” for vhost “/“ …
查看队列已经同步到其他两台节点
所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一致。
