消息队列杂谈

原文见:https://mikechen.cc/7319.html

消息队列MQ概述

消息队列(Message Queue),指保存消息的一个容器,本质是一个队列。

消息说指在应用之间传送的数据,消息可以非常简单,比如只包含文本字符串,也可以更加复杂,可能包含嵌入对象。
如下图:

截屏2022-06-02 下午9.21.46.png

消息队列MQ应用场景

截屏2022-06-02 下午9.28.05.png

1,异步处理

消息队列的主要特点是异步处理,主要目的是减少请求响应时间,实现非核心流程异步化,提高系统响应性能。

举一个用户注册的例子,用户成功注册后,系统需要发送短信注册成功通知,以及赠送注册成功的积分
1)同步

截屏2022-06-02 下午9.41.49.png
同步耗时:10ms+100ms+100ms=210ms
由于短信通知与增加积分为非核心流程,为了提升系统响应性能,文吗可以将其改造为异步

2)异步

截屏2022-06-02 下午9.43.24.png
现在吧短信通知和增加积分改为异步的形式,用户注册后写入消息10ms左右立刻返回成功给客户端,无需等待耗时较久的同步(短信+积分)就可以返回,从而极大地提升了系统的吞吐量。

所以异步的典型场景就是将比较耗时而且不需要即时(同步)返回的结果,通过消息队列来实现异步化。

2,应用解耦

使用了消息队列后,只有保证消息的格式不变,消息的发送方和接收方不需要彼此联系,也不需要受到对方的影响。金典的上下游解耦如下图所示:

截屏2022-06-02 下午9.50.46.png

3,流量消峰

流量消峰也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。
这种场景中系统的峰值流量往往集中于一小段时间内,所以为了防止系统在短时间内的峰值流量冲垮,往往采用消息队列来消弱峰值流量,相当于消息队列做了一次缓冲。

截屏2022-06-02 下午9.54.33.png

4,日志处理

日志处理是指将消息队列用在日志处理中,比如Kafka的应用,解决大量日志传输的问题

截屏2022-06-02 下午10.27.27.png

消息队列MQ设计

1,整体架构

截屏2022-06-02 下午10.30.01.png
上图为整体架构,会涉及三类角色:
1)Producer生产者:负责产生和发送消息到Broker;
2)Broker消息处理中心:负责消息存储、确认、重试,一般其中会包括多个queue;
3)Consumer消费者:负责从Broker中获取消息,并进行相应处理;

2,详细设计

截屏2022-06-02 下午10.46.26.png
详细的流程如上图,producer发送给broker,broker发送给consumer,consumer回复消费确认,broker删除/备份消息等。
1)RPC通信
图上的第一个步骤:Producer生产消息向Broker发送会涉及到通信到问题,同样Consumer消费消息也会涉及到通信的问题。上图中的Producer、Broker、Consumer最后就通过RPC将数据流串起来了,所以需要解决通信的问题。
你可以通过基于Netty来做底层通信,用Zookeeper、Euraka等来做注册中心,然后定义一套新的通信协议。也可以直接利用成熟的RPC框架Dubbo或者Thrift实现即可,这样不需要考虑服务注册、负载均衡、通信协议、序列化方式等一系列问题了。
2)Broker存储
图上第二个步骤,消息到达服务端后需要存储到Broker。

大家关注的流量削峰,最终一致性等需求都是需要Broker先存储下来,然后选择时机投递,这才达到流量削峰、泄洪的目的,所以Broker一个非常重要的功能就是存储。

存储可以做成很多方式,比如存储在内存里,存储在分布式KV里,存储在磁盘里,存储在数据库里等等,存储的选型需要综合考虑性能/高可用和开发维护成本等诸多因素。

目前主流的方案:追加写日志文件(数据部分)+索引文件的方式,索引设计上可以考虑稠密索引或者稀疏索引,查找消息利用跳转表、二份查找等,还可以通过操作系统等页缓存、零拷贝等技术来提升磁盘文件等读写性能。

3)消费模型

消费模型,目前主要就两种:单播和广播。所谓单播,就是点到点;而广播,是一点对多点。

4)高级特性
如果Consumer端把消息消费了,除来需要消息确认,还会涉及到比如:重复消息,顺序消息,消息延迟,事务消息等需要考虑的高级特性。

消息队列MQ模型

1,点对点模型

截屏2022-06-02 下午11.13.27.png
特点:
1. 每个消息只有一个消费者(即一旦被消费,消息就不再在消息队列中)
2. 发送者和接收者在时间上没有依赖性
3. 接收者在成功接收消息之后,需向队列应答成功

2,发布订阅消息模型topic

截屏2022-06-02 下午11.24.07.png

特点:
1. 每个消息可以有多个消费者,和点对点方式不同,发布消息可以被所有订阅者消费
2. 发布者和订阅者之间有时间上的依赖性。
3. 针对某个topic的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息
4. 为了消费消息,订阅者必须保持运行的状态

消息队列MQ产品选型

1,ActiveMQ

截屏2022-06-02 下午11.29.29.png
性能万级/秒

2,RabbitMQ

截屏2022-06-02 下午11.30.06.png
整体架构如下图:

截屏2022-06-02 下午11.30.38.png
性能万级/秒

3,Kafka

kafka上一个分布式的、分区的、多复本的日志提交服务,性能在百万级/秒,整体架构如下图:

截屏2022-06-02 下午11.32.16.png

4,阿里开源的消息中间件,具有高吞吐量,高可用性,适合大规模分布式系统应用的特点,性能在十万级/秒,整体架构如下图:

截屏2022-06-02 下午11.33.49.png

广泛来说,电商、金融等对事务性要求很高的,可以考虑RocketMQ,技术挑战不是特别高,用RabbitMQ是一个不错的选择,如果是大数据领域的实时计算,日志采集等场景可以考虑Kafka。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值