1-12.关于ActiveMQ消息传送机制以及消息确认机制

Posted 交易技术汇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1-12.关于ActiveMQ消息传送机制以及消息确认机制相关的知识,希望对你有一定的参考价值。

消息的推/拉

对于消息在中间件及消费者间的传送,我们可以根据消费者的主动或被动获取消息来区分消息的推/拉模式。当中间件主动传送消息给消费者,我们可以认为这是一种推的模式;当消费者在消费完之前的消息后主动到中间件获取下一条消息,则我们可以认为这是一种拉的模式。

消息的推/拉都与中间件的一个参数有关,prefetchSize。其详细作用可参考官网说明:activemq.apache.org/what-is-the-prefetch-limit-for.html

当prefetch > 0 时,消息将会由中间件主动推给消费者;当prefetch = 0 时,消息将由消费者消费完上一消息后主动去获取,此时消费者会发送一个pullCommand如下:

由于默认值设置如下:

persistent queues (default value:1000)

non-persistent queues (default value:1000)

persistent topics (default value:100)

non-persistent topics (default value:Short.MAX_VALUE - 1)

当未设置prefetch值时一般都是采用推的模式进行消息传递。


消息的ACK机制

一条消息从producer端发出之后,一旦被broker正确保存,那么它将会被consumer消费,然后ACK,broker端才会删除;

由分享文章中我们可以看到消息消费及确认如下图所示:


从消息的消费过程来看,ACK分为多种类型,其用于确认消费者消费消息的不同阶段及状态,这一机制确保队列消息的不重复消费这一特点。

DELIVERED_ACK_TYPE= 0    消息"已接收",但尚未处理结束

STANDARD_ACK_TYPE= 2    "标准"类型,通常表示为消息"处理成功",broker端可以删除消息了

POSION_ACK_TYPE= 1    消息"错误",通常表示"抛弃"此消息,比如消息重发多次后,都无法正确处理时,消息将会被删除或者DLQ(死信队列)

REDELIVERED_ACK_TYPE= 3    消息需"重发",比如consumer处理消息时抛出了异常,broker稍后会重新发送此消息

INDIVIDUAL_ACK_TYPE= 4    表示只确认"单条消息",无论在任何ACK_MODE下

UNMATCHED_ACK_TYPE= 5    在Topic中,如果一条消息在转发给“订阅者”时,发现此消息不符合Selector过滤条件,那么此消息将 不会转发给订阅者,消息将会被存储引擎删除(相当于在Broker上确认了消息)。


以上是关于1-12.关于ActiveMQ消息传送机制以及消息确认机制的主要内容,如果未能解决你的问题,请参考以下文章

ActiveMQ消息过滤

JMS消息的可靠性机制

JMS消息的可靠性机制

JMS学习六(ActiveMQ消息传送模型)

Java中间消息件——ActiveMQ入门级运用

该死的Kafka,远程连接Kafka超时以及解决办法