RabbitMQ
大约 3 分钟
RabbitMQ
介绍
2007年,Rabbit技术公司基于AMQP标准开发的RabbitMQ 1.0 发布
采用Erlang语言开发
- Erlang 语言专门为开发高并发和分布式系统的一种语言
接受、存储和转发二进制数据消息。accepts, stores, and forwards binary blobs of data ‒ messages.
- 生产者: 发送消息的程序, Producing
- 消费者: 等待接收消息的程序, Consuming
- 队列: 一个大的消息缓冲区, 只受主机的内存和磁盘限制
P 生产者
- 队列
- C 消费者
模式
Hello World 简单模式
- 仅作消息代理,单生产者,单消费者;
Work Queues 工作队列模式
- 单生产者, 多个消费者同时并行处理;
Publish/Subscribe 发布订阅模式
- 单生产者,多消费者,多队列。
Routing 路由模式
- 根据Routing Key有选择地接收消息;
- 多消费者,选择性多队列,每个队列通过routing key全文匹配。
Topics 主题模式
- 主题交换机方式接收消息,将routing key和模式进行匹配。
- 多消费者,选择性多队列,每个队列通过模式匹配。
队列需要绑定在一个模式上。
#匹配一个词或多个词,*只匹配一个词。
RPC 远程过程调用
- Remote procedure call (RPC)
- 在远程计算机上运行功能并等待结果。
Publisher Confirms 发布者确认
- 与发布者进行可靠的发布确认,发布者确认是RabbitMQ扩展,可以实现可靠的发布。
- 适用于消息可靠性要求较高
主题模式 TopicExchange
安装
安装erlang
- erlang和rabbitmq的版本对应关系
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
yum install -y erlang
erl -version
安装RabbitMQ
rpm -ivh rabbitmq-server-3.8.8-1.el7.noarch.rpm
- 出现警告和一个错误。警告是缺少key,而错误是socat,只需要导入key和安装socat即可。
- 1)导入key:
rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
- 2)安装socat
yum -y install epel-release
yum -y install socat
- 1)导入key:
注意:yum方式安装会自动创建一个启动rabbitmq的账户 rabbitmq
cat /etc/password
rabbitmq:x:598:499:RabbitMQ messaging server:/var/lib/rabbitmq:/sbin/nologin
- 启用管理平台插件,启用插件后,可以可视化管理RabbitMQ。
rabbitmq-plugins enable rabbitmq_management
rabbitmq-plugins enable rabbitmq_federation
rabbitmq-plugins enable rabbitmq_federation_management
- 启动RabbitMQ
systemctl start rabbitmq-server.service
systemctl enable rabbitmq-server.service
systemctl status rabbitmq-server.service
- 访问控制台界面???
高可用
集群实现
- 默认集群
- 一般在局域网中使用
- 各节点版本相同
- 使用插件:无需建立集群,广域网中使用
- 各节点版本可以不同
- Federation
- Shovel
- 默认集群
默认集群:各节点只有原数据,消息五冗余
- 前置配置
- 关掉防火墙
- ssh免登录
- rabbitmq账号(yum略)
- 安装各节点服务
- 配置各节点 hosts
- erlang.cookie 各节点一致
- 设置集群节点
- 前置配置
镜像集群:高可用,镜像队列模式,节点之间不仅仅会同步元数据,消息内容也会在镜像节点间同步
- 性能损耗
- 扩展性差
集群关闭启动
- 最后关闭的那个节点是第一个启动的
- 如果第一个启动的不是最后关闭的节点,那么这个节点会等待最后那个关闭的节点启动。这个等待时间默认为30s,默认会重试10次。如果10次之后,还未等到最后关闭的节点启动,则当前节点也会因失败而关闭自身的应用。(可以通过查看rabbit的日志来查看)
- 集体挂掉
- 所有node都认为自己并不是最后一个关闭的
- 各node上尝试重启,最终都会失败
- 措施命令:rabbitmqctl force_boot
- 无条件的启动节点,可能会造成数据lost
- 最后关闭的node最终无法启动
- 将该node从集群中剔除:rabbitmqctl forget_cluster_node --offline
- 最后关闭的那个节点是第一个启动的
高可用方案
- Federation 配置,集群双向同步 ,如双机房备份
- 镜像集群 + Haproxy + keepalived