1.RocketMq名词解释( 三 )


通过消息触发一些定时任务,比如在某一固定时间点向用户发送提醒消息 。
1.4.2 顺序消息
顺序消息(FIFO 消息)是消息队列提供的一种严格按照顺序进行发布和消费的消息类型 。顺序消息指消息发布和消息消费都按顺序进行 。
顺序发布:对于指定的一个 Topic,客户端将按照一定的先后顺序发送消息 。顺序消费:对于指定的一个 Topic,按照一定的先后顺序接收消息,即先发送的消息一定会先被客户端接收到 。
1.4.3 事务消息
消息队列提供类似 X/Open XA 的分布事务功能,通过消息队列事务消息能达到分布式事务的最终一致 。
步骤:
发送方向消息队列服务端发送消息 。服务端将消息持久化成功之后,向发送方 ACK 确认消息已经发送成功,此时消息为半消息 。发送方开始执行本地事务逻辑 。发送方根据本地事务执行结果向服务端提交二次确认( 或是 ),服务端收到状态则将半消息标记为可投递,订阅方最终将收到该消息;服务端收到状态则删除半消息,订阅方将不会接受该消息 。在断网或者是应用重启的特殊情况下,上述步骤 4 提交的二次确认最终未到达服务端,经过固定时间后服务端将对该消息发起消息回查 。发送方收到消息回查后,需要检查对应消息的本地事务执行的最终结果 。发送方根据检查得到的本地事务的最终状态再次提交二次确认,服务端仍按照步骤 4 对半消息进行操作
1.5 消息重试
1.5.1 顺序消息的重试
对于顺序消息,当消费者消费消息失败后,消息队列会自动不断进行消息重试(每次间隔时间为 1 秒),这时,应用会出现消息消费被阻塞的情况 。因此,建议您使用顺序消息时,务必保证应用能够及时监控并处理消费失败的情况,避免阻塞现象的发生 。
1.5.2无序消息的重试
对于无序消息(普通、定时、延时、事务消息),当消费者消费消息失败时,您可以通过设置返回状态达到消息重试的结果 。
无序消息的重试只针对集群消费方式生效;广播方式不提供失败重试特性,即消费失败后,失败消息不再重试,继续消费新的消息 。
如果消息重试 16 次后仍然失败,消息将不再投递 。如果严格按照上述重试时间间隔计算,某条消息在一直消费失败的前提下,将会在接下来的 4 小时 46 分钟之内进行 16 次重试,超过这个时间范围消息将不再重试投递 。
注意: 一条消息无论重试多少次,这些重试消息的ID 不会改变 。
1.6 消息幂等性
消息队列消费者在接收到消息以后,有必要根据业务上的唯一 Key 对消息做幂等处理的必要性 。因为ID 有可能出现冲突(重复)的情况,所以真正安全的幂等处理,不建议以ID 作为处理依据 。最好的方式是以业务唯一标识作为幂等处理的关键依据,而业务的唯一标识可以通过消息 Key 进行设置
原因:
发送时消息重复:当一条消息已被成功发送到服务端并完成持久化,此时出现了网络闪断或者客户端宕机,导致服务端对客户端应答失败 。如果此时生产者意识到消息发送失败并尝试再次发送消息,消费者后续会收到两条内容相同并且ID 也相同的消息 。
投递时消息重复:消息消费的场景下,消息已投递到消费者并完成业务处理,当客户端给服务端反馈应答的时候网络闪断 。为了保证消息至少被消费一次,消息队列的服务端将在网络恢复后再次尝试投递之前已被处理过的消息,消费者后续会收到两条内容相同并且ID 也相同的消息 。
1.7 消费轨迹
消息队列系统中,一条消息的完整链路包含生产方、服务方、消费方三个角色,每个角色处理消息的过程中都会在轨迹链路中增加相关的信息,将这些信息汇聚即可获取任意消息当前的状态,从而为生产环境中的问题排查提供强有力的数据支持 。