什么是RocketMQ
RocketMQ中常规的MQ中的一种,MessageQueue(消息队列)的作用是保存消息,消费消息,消息可以作为跨服务、跨服务器之间的资源传递,并提供高性能、高并发、高容错的组件。RocketMQ作为微服务项目中经常被选用的几种MQ也有独特的优势和特点。
RokcetMQ的优点
高并发、高性能、高可靠性,还有是由JAVA编写的源码,所以可以通过修改框架,对业务进行定制服务。缺点也是对除java、c++以外的项目都不支持
RokcetMQ中的概念
1、生产者
作为消息模型中提供消息的一方,负责将消息发送到服务器。
2、消费者
负责从服务器获取消息并消费。
3、Topic
一系列消息的集合,一个主题下包含多个消息,一个消息属于一个主题。
4、 NameServe
名称服务充当路由消息的提供者。生产者或消费者能够通过名字服务查找各主题相应的BrokerIP列表。多个Namesrv实例组成集群,但相互独立,没有信息交换。
5、消息模式
RokcetMQ中消息分为两种模式,一种是集群模式,一个主题下所有的消费者平均所有消息,另一种是广播消息,一个主题下所有消费者都收到每一条消息。
6、顺序消息
一个Topic下的消息按照先进先出的顺序被消费。但是多个主题下的消息不会严格按顺序消费。按照sharding key 将消息分类,Topic下的消息放在一个FIFO的队列中。
7、 严格顺序消息
全局消息都会按照先进先出的顺序被消费。 全局消息都在一个FIFO的队列中实现,缺点是效率低。
8、tag
为消息设置的标志,用于同一主题下区分不同类型的消息。来自同一业务单元的消息,可以根据不同业务目的在同一主题下设置不同标签。标签能够有效地保持代码的清晰度和连贯性,并优化RocketMQ提供的查询系统,RocketMQ中实现了根据tag进行消息过滤,在消费端可以设置client属性,来过滤tag对应的消息。
RocketMQ特性
1、事务消息
RokcetMQ中独有的消息类型,通过本地事务和消息可以发送到服务器中,要么一起成功,要么一起失败,达到分布式事务的效果。
实现原理是通过事务消息中添加一个预就绪的状态,来先发送消息,等待消费消息回传ACK表示确认消息成功后再提交本地消息,不然则取消本地事务即可。
2、消息重试
消息重试也就是提供一种重试机制给失败的消息,RocketMQ为每一个消费组都提供一个重试队列,重试队列有不同的重试级别,不同的重试级别决定了多长时间后进行重新尝试。
3、延迟消息
RocketMQ中提供了延迟消息的机制,在服务器上有专门为延迟消息准备的延迟队列,保存相同延迟时间的消息,默认有从1S到2小时的延时级别,可以自己在配置中自定义级别时间长度。
4、消息重投
生产者在发送消息时,同步消息失败会重投,异步消息有重试。消息重投保证消息尽可能发送成功、不丢失,但可能会造成消息重复,消息重复在RocketMQ中是无法避免的问题。
5、回溯消费
回溯消费是指Consumer已经消费成功的消息,由于业务上需求需要重新消费,要支持此功能,Broker在向Consumer投递成功消息后,消息仍然需要保留。并且重新消费一般是按照时间维度,例如由于Consumer系统故障,恢复后需要重新消费1小时前的数据,那么Broker要提供一种机制,可以按照时间维度来回退消费进度。RocketMQ支持按照时间回溯消费,时间维度精确到毫秒。
6、死信队列
死信队列用于处理无法被正常消费的消息。当一条消息初次消费失败,消息队列会自动进行消息重试;达到最大重试次数后,若消费依然失败,则表明消费者在正常情况下无法正确地消费该消息,此时,消息队列 不会立刻将消息丢弃,而是将其发送到该消费者对应的特殊队列中。RocketMQ将这种正常情况下无法被消费的消息称为死信消息(Dead-Letter Message),将存储死信消息的特殊队列称为死信队列(Dead-Letter Queue)。在RocketMQ中,可以通过使用console控制台对死信队列中的消息进行重发来使得消费者实例再次进行消费。