这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战
什么是中间件
中间件,是提供软件和软件之间连接的软件,以便于软件各部件之间的沟通。
同步直接调用的问题
- 业务调用链过长,用户等待时间长
- 部分组件故障会瘫痪整个业务
- 业务高峰期没有缓冲
异步直接调用的问题
- 业务高峰期时产生大量的异步线程,造成线程池不够用或者内存爆满
使用消息中间件的优势
- 业务调用链短,用户等待时间短
- 部分组件故障不会瘫痪整个业务
- 业务高峰期有缓冲
- 业务高峰期时不会产生大量的异步线程
使用消息中间件的作用
- 异步处理
- 系统解耦
- 流量的削峰和流控
- 消息广播
- 消息收集
- 最终一致性
主流的消息中间件技术
- ActiveMQ最老,老牌,但维护较慢
- RabbitMQ最火,适合大小公司,各种场景通杀
- RocketMQ最猛,功能强,但考验公司运维能力
- kafka最强,支持超大量数据,但消息可靠性弱
RabbitMQ介绍
- 当前最主流的消息中间件
- 高可靠性,支持发送确认,投递确认等特性
- 高可用,支持镜像队列
- 支持插件
优点
- 基于erlang,支持高并发
- 支持多种平台,多种客户端,文档齐全
- 可靠性高
- 在互联网公司有较大规模的应用,社区活跃度高
缺点:
- erlang语言较为小众,不利于二次开发
- 代理架构下,中央节点增加了延迟,影响性能
- 使用AMQP协议,使用起来有学习成本
RabbitMQ高性能的原因
erlang语言,爱立信开发,一门专门为交换机软件开发诞生的编程语言
erlang特点
- 通用的面向并发的编程语言,适用于分布式系统
- 基于虚拟机解释运行,跨平台部署
- erlang进程间上下文切换效率远高于C语言和Java,进一步提高了RabbitMQ的并发性能
- erlang的网络性能有着和原生Socket一样的延迟,使得RabbitMQ的网络IO性能极高
AMQP协议介绍
- Broker: 接收和分发消息的应用,RabbitMQ 就是Message Broker
- Virtual Host: 虚拟Broker,将多个单元隔离开
- Connection: publisher/consumer和broker之间的TCP连接
- Channel: connection内部建立的逻辑连接,通常每个线程创建单独的channel
- Routing Key: 路由键,用来指示消息的路由转发,相当于快递的地址
- Exchange: 交换机,相当于快递的分拨中心,是AMQP中的核心概念
- Queue: 消息队列,消息最终被送到这里等待consumer取走
- Binding: exchange和queue之间的虚拟连接,用于message的分发依据
核心概念——Exchange
- 在AMQP协议或者是RabbitMQ实现中,最核心的组件是Exchange
- Exchange承担RabbitMQ的核心功能——路由转发
- Exchange有多个种类,配置多变
一个有趣的网站:tryrabbitmq.com
Exchange解析
- Exchange是AMQP协议和RabbitMQ的核心组件
- Exchange的功能是根据绑定关系和路由键为消息提供路由,将消息转发至相应的队列
- Exchange有4种类型:Direct / Topic / Fanout / Headers,其中Headers使用很少,以前三种为主
- direct:Message中的Routing Key如果和Binding Key一致, Direct Exchange则将message发到对应的queue中
- fanout:每个发到Fanout Exchange的message都会分发到所有绑定的queue上去
- topic:根据Routing Key及通配规则,Topic Exchange将消息分发到目标Queue中
- 全匹配:与direct类似
- Binding Key中的#:匹配任意个数的word
- Binding Key中的*:匹配任意1个word
如何保证消息可靠性
发送方
- 发送端确认机制
- 消息返回机制
消费放
- 消费端确认机制
- 消费端限流机制
RabbitMQ自身
- 消息过期时间
- 死信队列
实际开发中经验及小结
善用RabbitMQ高级特性
- 对于RabbitMQ的高级特性,要善加利用
- 接收端确认、死信队列是非常常用的特性
慎用RabbitMQ高级特性
- 不要无限追求高级,用上所有RabbitMQ的高级特性
- 重回队列、发送端确认是不常用的特性,谨慎使用
善用RabbitMQ管控台
- 管控台是RabbitMQ调试的利器
- RabbitMQ高级特性多数都涉及交换机、队列的属性配置,可以在管控台确认配置是否生效
- RabbitMQ高级特性很多都可以在管控台进行试验