RocketMq学习笔记
消息队列
为什么要使用消息队列
消息队列(Message Queue)。众所周知,队列是一种“先进先出”的数据结构。
通常来讲,分布式消息队列的结构是:
即一个应用想向其他应用发送消息。它不直接向其发送消息,而是先发送到一个消息中间件,而消息接收方从消息中间件中获得消息。
MQ的好处和典型的场景:
- 消息通讯
MQ提供了统一的消息通讯方式,应用无须再专门的写自己的发送消息、接收消息方法和协议,只需简单的向MQ发送消息、接收消息即可。
比如上图中有4个应用,如果不使用MQ,两两通信,会需要6条通信渠道。而使用MQ,仅需要4条。随着应用数的增多,MQ用于消息通信的优势会越来越明显。
- 应用解耦
在没有消息队列时,应用之间通信通常会使用RPC的方式,如thift协议定义的RPC。而RPC调用,系统之间的耦合性较高。
因此,MQ的第一个应用场景就是实现应用之间的解耦。不使用MQ,各个应用之间是同步调用方式,若一个模块出现问题,就会导致整个业务出现状况。
考虑典型的电商核心交易场景:
通过引入MQ,实现了电商各个应用模块之间的异步解耦,由同步调用改成了异步调用,降低了各个模块之间的依赖性。
- 流量削峰
考虑这样一个场景:
应用系统如果遇到流量暴增的时候,有可能将整个数据库压垮。而直接搭建一个高性能的集群是有资源浪费的,因为只有在某个时间段才有那么大的流量。因此需要用到“流量削峰”。即MQ可以将大量请求缓存起来。这种业务场景下,MQ类似于一个“缓存”,起到缓解发送方、接收方速度不匹配的情况。
- 分布式事务场景
某些MQ是支持事务型消息的,如RocketMq。考虑这样一个场景:
MQ提供了在分布式环境下实现事务的一个解决方案。会有专门的线程去扫描消息队列,只有当这个消息成功被“余额宝”消费时,图中的“支付宝”事务才算成功。
- 大数据分析场景
MQ作为整个大数据生态环境中的一环,起到日志采集、消息缓存等的作用:
如RocketMq收集到日志数据,传递给下游的Flink、Spark等。
- 物联网场景
IoT设备往往性能较差,如果直接将其发送到远端的服务器集群,会经常存在消息丢失、消息无法发送等问题,因此,需要使用MQ做一个中间件:
MQ的优缺点
MQ的优点在于解耦、削峰、数据分发。
需要解决的问题在于:
- 系统的可靠性需要依赖于MQ本身的可靠性,如果MQ挂了,则系统会受到很大影响。
- MQ需要保证消息的各种性质,如避免重复消费、消息丢失问题、消息传递的顺序性。
- 消息的一致性问题。
MQ对比
RocketMq简介
什么是RocketMq
RocketMq是一款分布式的消息中间件,是金融级消息及数据流平台,支持万亿级消息洪峰,是阿里巴巴开源项目,目前已成为Apache顶级项目。项目主页:http://rocketmq.apache.org/
RocktMq基本模型
Producer来发送消息,Topic是消息的“逻辑地址”,Consumer是来消费消息的。
实际生产环境中要比这复杂的多,如Topic需要进行分区,整个MQ要实现高可用、负载均衡等。因此也就有了下图:
上图是一个概念模型。有两个Topic和Consumer Group。Broker就是用来存储实际的消息的。
Topic其实一个逻辑上的概念,为了进行Topic的水平扩展,实际上对应于多个MessageQueue(类似于kafka中Partition分区的概念)。一个broker可以负责多个MessageQueue。
在RocketMq中,有多种消费模式。一种是集群模式,即一条消息只被Consumer Group中一个消费者进行负载均衡的消费。另一种是广播的模式,即每个消费者都会消费到那条消息。
RocketMQ消息类型
RocketMQ的消息类型可分为普通消息、顺序消息(局部有序和全局有序)、事务消息、延时(定时)消息。
**定时消息:**给出消费的“延时”时间: