文章目录
前言
防止忘记
介绍
- 消息中间件是软件和软件之间发送消息的软件
- 消息中级件最大的作用是异步处理、系统解耦
- 消息中级件还有消息收集广播、流量控制等功能
消息中间件技术选型
主流消息中间件
- Apache ActiveMQ
- 由Apache 出品,Java开发,支持JMS1.1协议和J2EE1.4规范。
支持广泛的链接协议:OpenWire/STOMP/REST/XMPP/AMQP
支持多种语言客户端,支持插件
管理方便,便于配置集群代理- 优点:
基于Java,跨平台运行
可以用户JDBC连接多种数据库
有完善的界面、监控、安全机制
自动重连和错误重试- 缺点:
社区活跃度不及RabbitMQ
目前重心放到6.0产品Apollo,对5的BUG维护较少
不适合用于上千个队列的应用场景
- Rabbit MQ
- 特点:
当前最主流的消息中间件
高可靠性,支持发送确认,投递确认等特性
高可用,支持镜像队列- 优点:
基于Erlang,支持高并发
支持多平台,多种客户端,文档安全
可靠性高
在互联网公司有较大规模的应用,社区活跃度高- 缺点:
Erlang语言较于小众,不利于二次开发
代理架构下,中央节点增加了延迟,影响性能
使用AMQP协议,使用起来有学习成本
- Apache RocketMQ
- 特点:
阿里巴巴团队开发,经受双十一考验
能够保证严格的消息顺序
亿级消息堆积能力- 优点:
基于Java,方便二次开发
单机支持1万以上持久化队列
内存与磁盘都有一份数据,保证性能+高可用
开发度较活跃,版本更新很快- 缺点:
客户端种类不多,较成熟的是Java及C++
没有web管理界面,提供了一个CLI(命令行界面)
社区关注度及成熟度不如RabbitMQ
- Apache kafka
- 特点:
Linkedln开发的分布式的日志提交系统
独特的分区特性,适用于大数据系统- 优点:
原生的分布式系统
零拷贝技术,减少IO操作步骤,提高系统吞吐量
快速支持化:可以在O(1)的系统开销下进行消息持久化
支持数据批量发送和拉取- 缺点:
单机超过64个队列/分区时,性能明显劣化
使用短轮询方式,实时性取决与轮询间隔时间
消费失败不支持重试
可靠性比较差
- 总结
- ActiveMQ最"老",但维护较慢
- RabbitMQ最"火",适合大小公司,各种场景通杀
- RocketMQ最"猛",功能强,但考验公司运维能力
- Kafka最"强",支持超大量数据,但消息可靠性弱
RabbitMQ高性能的原因
- ERLANG语言:一门为交换机软件开发诞生的语言
- 特点:
a.通用的面向并发的编译语言,适用于分布式系统
b.基于虚拟机解释运行,跨平台部署
c.进程间上下文切换效率远高于C语言
d.有着和原生Socket一样的延迟
RabbitMQ在银行和金融领域也有着相当高的占有率,甚至微服务间的通讯不部分依靠消息,RabbitMQ使用量最大
AMQP协议介绍
- Broker:接收和分发消息的应用,RabbitMQ就是MessageBroker
- Virtual Host:虚拟Broker,将多个单元隔离开
- Connection:publisher/consumer和broker之间的TCP连接
- Channel:connection内部建立逻辑连接,通常每个线程创建单独的channel
- RoutingKey:路由键,用来指示消息的路由转发,相当于快递的地址
- Exchange:交换机,相当于快递的分拨中心
- Queue:消息队列,消息最终被送到这里等待consumer取走
- Binding:exchange和queue之间的虚拟连接,用于message的分发依据
Exchange(RabbitMQ的核心组件)
- Exchange是AMQP协议和RabbitMQ的核心组件
- Exchange的功能是根据绑定关系和路由键为消息提供路由,将消息转发至相应的队列
- Exchange有4种类型:Direct/Topic/Fanout/Headers,其中Headers使用很少,以前三种为主
DirectExchange
Fanout Exchange
Topit Exchange
- 总结
- AMQP协议直接决定了RabbitMQ的内部结构和外部结构
- 对于发送者来说,将消息发给特定的Exchange
- 消息经过Exchange路由后,到达具体队列
- 消费者将消息从监听的队列中取走
- Exchange主要有三种类型:Direct/Topic/Fanout
- Direct(直接路由):Routing Key = Binding Key,容易配置和使用
- Fanout(广播路由):群发绑定的所有队列,适用于消息广播
- Topic(话题路由):功能较为复杂,但能降级为Direct建议优先使用,为以后扩展留余地
RabbitMQ快速安装
windwo安装
-
下载并安装Erlang OTP(Open Telecom Platform):
以下两个下载网站都可以下载
https://www.erlang.org/downloads -
下载安装MQ:https://www.rabbitmq.com/
步骤:Get Started -> Download + Installation -> windows Installer -> Using the official installer
MacOS安装
- brew update
- brew install rabbitmq
- brew工具会自动安装OTP依赖
Linux安装(Docker)
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
网页端管理工具介绍
- RabbitMQ网页端管理工具也叫管理控制台、管控台
- 管理控制台是RabbitMQ最常用的管理、配置工具
- 管理控制台对于业务的开发、调试也非正常有用
启动前端插件
- 启动应用:安装目录下的sbi文件,cmd运行命令rabbitmq-plugins enable rabbitmq_management
- 浏览器打开:127.0.0.1:15672
- 默认用户名密码:guest
管理端页面讲解
比较重要的是交换机和队列
命令行工具
使用场景
- 生成环境、端口限制等不便打开网页端工具的场景
- 使用脚本自动化配置RabbitMQ
使用口诀
- 想看什么就List什么
- 想清空什么就purge什么
- 想删除什么就delete什么
- 一切问题记得使用 --help
状态查看
查看状态
rabbitmqctl status
查看绑定
rabbitmqctl list_bindings
查看channel
rabbitmqctl list_channels
查看connections
rabbitmqctl list_connections
查看消费者
rabbitmqctl list_consumers
查看交换机
rabbitmqctl list_exchanges
队列相关
查看队列
rabbitmqctl list_queues
删除队列
rabbitmqctl delete_queue
清空队列
rabbitmqctl purge_queue
用户相关
新建用户
rabbitmqctl add_user
修改用户密码
rabbitmqctl change_password
删除用户
rabbitmqctl delete_user
查看用户
rabbitmqctl list_users
设置用户角色
rabbitmqctl rabbitmqctl set_user_tags
应用启停
启动应用
rabbitmqctl start_app
关闭应用
# 保留Erlang虚拟机(暂停)
rabbitmqctl stop_app
关闭应用
# 并关闭Erlang虚拟机
rabbitmqctl stop
集群相关
加入集群
rabbitmqctl join_cluster
离开集群
rabbitmqctl reset
镜像队列
设置镜像队列
rabbitmqctl sync_queue
取消镜像队列
rabbitmqctl cancel_sync_queue
总结
- RabbitMQ高性能的原因
- AMQP协议
- Exchange解析
- 快速安装
- 网页端管理工具
- 命令行工具