文章目录
一、消息中间件的产生的背景
在网络通讯中,Http请求默认采用同步请求方式,基于请求与响应模式,在客户端与服务器进行通讯时,客户端调用服务端接口后,必须等待服务端完成处理后返回结果给客户端才能继续执行,这种情况属于同步调用方式。如果服务器端发生网络延迟、不可达的情况,可能客户端也会受到影响
1.1什么是消息中间件
消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。对于消息中间件,常见的角色大致也就有Producer(生产者)、Consumer(消费者)例如:寄快递
1.2.消息中间件使用场景
1.2.1 异步处理
场景说明:用户注册后,需要发注册邮件和注册短信
传统的做法有两种
- a.串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信,以上三个任务全部完成后,返回给客户端
- b.并行方式:将注册信息写入数据库成功后,发送注册邮件的同时发送注册短信,以上三个任务完成
后,返回给客户端;与串行的差别是并行的方式可以提高处理的时间
引入消息队列,改造后的架构如下:
按照以上约定,用户的响应时间相当于是注册信息写入数据库的时间,也就是50毫秒。注册邮件,发送短信写入消息队列后,直接返回,因此写入消息队列的速度很快,基本可以忽略,因此架构改变后,系统的吞吐量比串行提高了3倍,比并行提高了2倍
1.2.2应用解耦
场景说明:用户下单后,订单系统需要通知库存系统,传统的做法是订单系统调用库存系统的接口
订单系统:假如在下单时库存系统不能正常使用,也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了,实现订单系统与库存系统的应用解耦
二、RocketMQ
这里我们介绍一款中间件RocketMQ,RocketMQ是阿里巴巴开源的分布式消息中间件,现在是Apache的一个顶级项目。在阿里内部使用非常广泛,已经经过了"双11"这种万亿级的应用场景考验。
特点:
1.能够保证严格的消息顺序
2.提供丰富的消息拉取模式
3.高效的订阅者水平扩展能力
4.实时的消息订阅机制
5.亿级消息堆积能力
2.1.RocketMQ的架构及概念
如上图所示,整体可以分成4个角色,分别是:NameServer,Broker,Producer,Consumer
- NameServer(邮局)
- 消息队列的协调者,Broker向它注册路由信息,同时Producer和Consumer向其获取路由信
息- Broker(邮递员)
- Broker是RocketMQ的核心,负责消息的接收,存储,投递等功能
- Producer(寄件人)
- 消息的生产者,需要从NameServer获取Broker信息,然后与Broker建立连接,向Broker发
送消息- Consumer(收件人)
- 消息的消费者,需要从NameServer获取Broker信息,然后与Broker建立连接,从Broker获
取消息- Topic(地区)
- 用来区分不同类型的消息,发送和接收消息前都需要先创建Topic,针对Topic来发送和接收
消息- Message Queue(邮件)
- 为了提高性能和吞吐量,引入了Message Queue,一个Topic可以设置一个或多个Message
Queue,这样消息就可以并行往各个Message Queue发送消息,消费者也可以并行的从多个
Message Queue读取消息- Message
- Message 是消息的载体。
2.2消费模式
消费模式由Consumer决定,消费维度为Topic
1.集群消费:
- 一条消息只会被同Group种的一个Consumer消费
- 多个Group同时消费一个Topic时,每个Group都会有一个Consumer消费到数据
2.广播消费:- 消息将对一个Consumer Group下的各个Consumer实例都消费一边,即即使这些Counsumer属于同一个Consumer Group,消息也会被Counsumer Group种的每个Counsumer都消费一次。
2.3发送方式的区别
发送方式 | 发送TPS | 发送结果反馈 | 可靠性 |
---|---|---|---|
同步发送 | 快 | 有 | 不丢失 |
异步发送 | 快 | 有 | 可能丢失 |
单向发送 | 最快 | 无 | 可能丢失 |