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
image.png
重启

访问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管理控制台

image.png
看到三个节点

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 “/“ …

查看队列已经同步到其他两台节点

所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一致。