分布式系统不同模块之间的通信,除了远程服务调用以外,消息中间件是另外一个重要的手段。
消息队列,就是传递消息的队列
消息队列是进程之间的一种很重要的通信机制
随着分布式系统的发展,消息队列在系统设计中又有了更多的应用
20230709172801.jpg
消息队列可以用于系统内部组件之间的通信,也可以用于系统跟其他服务之间的交互。
消息队列的使用,增加了系统的可扩展性。
系统解耦
开闭原则,指的是软件实体应该对扩展开发,对修改关闭,尽量保存系统之间的独立。
20230709173020.jpg
系统之间的解耦,使用 RPC 服务调用也可以实现,那使用消息队列有什么好处?
使用消息队列,系统之间可以更好的实现依赖倒转
异步处理
在处理高并发,高可用等系统设计时,如果不需要或者限制于系统承载能力,不能立即处理消息,此时就可以应用消息队列,将请求异步化。
异步处理的一个典型场景就是流量削峰
秒杀抢购的流量峰值是很高的,可以引入消息队列,结合限流工具,对超过系统阈值的请求在消息队列中暂存,等待流量高峰过去以后再进行处理。
请求缓冲
在典型的生产者和消费者模型中,就是通过一个队列来实现缓冲
使用消息队列,可以作为一个缓冲层,平滑各个业务系统之间处理性能的不同等。
企业数据总线(ESB) 的概念,实现的就是内部各个系统之间的集成。
数据分发
消息队列支持一对多的广播机制,可以用来实现数据的分发
典型的比如关系数据库对 binlog 订阅的处理
由于主库的 binlog 只有一份,但是下游的消费方可能包括各种文件索引,离线数据库等
这时候就可以应用消息队列来实现数据的分发
消息队列还可以用来实现分布式事务
利用数据库+本地消息表的方式分布式一致性,是已给非常经典的分布式事务解决方案。
几种常见的消息队列
Apache Kafka
Kafka 是 LinkedIn 开源的一个分布式消息系统
主要使用 Scala 语言开发,已经加入 Apache 顶级项目
Kafka 集群部署时依赖 ZooKeeper 环境
Kafka 可以非常方便地进行水平扩展,支持海量数据的传输
Kafka 的另外一个特定是高吞吐率,在消息持久化写入磁盘的过程中
使用了多种技术来实现读写的高性能,包括磁盘的顺序读写,零拷贝技术等。
Apache RocketMQ
RocketMQ 是阿里巴巴开源的一款消息中间件,使用 Java 语音开发
以消息持久化为例,Linux 文件在写入磁盘时,可能会出现数据丢失的情况
RocketMQ 在写入磁盘时支持同步刷盘方式,即消息存储磁盘成功,才会返回消息发送成功的响应
RocketMQ 尽可能地保证了消息投递中的顺序一致性及可靠性,并且优化了响应时间
Apache RabbitMQ
RabbitMQ 是使用 Erlang 语言编写的一个开源消息队列,功能比较全面,支持多种消息传输的协议
AMQP 是一个异步消息传输的网络协议
RabbitMQ 同时支持 MQTT,STOMP 等协议
RabbitMQ 还支持优先级队列等特性
RabbitMQ 还比较适合企业级应用
如果在一个电商系统的构建中,这三款消息队列可以怎样组合使用呢?
- Kafka 可以在各类数据埋点中使用,比如电商营销的转化率日志收集和计算
Kafka 的高性能使得它特别适合应用在各类监控,大数据分析等场景。 - RocketMQ 对一致性的良好保证,可以应用在电商各级业务调用的拆分中
比如在订单完成后通知用户,物流信息更新以后对订单状态的更新等。 - RabbitMQ 可以在数据迁移,系统内部的业务调用中应用
比如一些后台数据的同步,各种客服和 CRMx 系统。
网友评论