课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
消息传送机制是程序员在学习软件编程开发的时候需要重点掌握的编程技术之一,而今天我们就一起来了解一下,ActiveMQ消息传送机制与ACK模式应用。
一.ActiveMQ消息传送机制
Producer客户端使用来发送消息的,Consumer客户端用来消费消息;它们的协同中心就是ActiveMQbroker,broker也是让producer和consumer调用过程解耦的工具,终实现了异步RPC/数据交换的功能。随着ActiveMQ的不断发展,支持了越来越多的特性,也解决开发者在各种场景下使用ActiveMQ的需求。比如producer支持异步调用;使用flowcontrol机制让broker协同consumer的消费速率;consumer端可以使用prefetchACK来大化消息消费的速率;提供"重发策略"等来提高消息的安全性等。
二、ACK模式详解
AUTO_ACKNOWLEDGE:自动确认,这就意味着消息的确认时机将有consumer择机确认."择机确认"似乎充满了不确定性,这也意味着,开发者必须明确知道"择机确认"的具体时机,否则将有可能导致消息的丢失,或者消息的重复接收.那么在ActiveMQ中,AUTO_ACKNOWLEDGE是如何运作的呢?
1)对于consumer而言,optimizeAcknowledge属性只会在AUTO_ACK模式下有效。
2)其中DUPS_ACKNOWLEGE也是一种潜在的AUTO_ACK,只是确认消息的条数和时间上有所不同。
3)在“同步”(receive)方法返回message之前,会检测optimizeACK选项是否开启,如果没有开启,此单条消息将立即确认,所以在这种情况下,message返回之后,如果开发者在处理message过程中出现异常,会导致此消息也不会redelivery,即"潜在的消息丢失";如果开启了optimizeACK,则会在unAck数量达到prefetch*0.65时确认,当然我们可以指定prefetchSize=1来实现逐条消息确认。
4)在"异步"(messageListener)方式中,将会先调用listener.onMessage(message),此后再ACK,如果onMessage方法异常,将导致client端补充发送一个ACK_TYPE为REDELIVERED_ACK_TYPE确认指令;如果onMessage方法正常,消息将会正常确认(STANDARD_ACK_TYPE)。此外需要注意,消息的重发次数是有限制的,每条消息中都会包含“redeliveryCounter”计数器,用来表示此消息已经被重发的次数,如果重发次数达到阀值,将会导致发送一个ACK_TYPE为POSION_ACK_TYPE确认指令,这就导致broker端认为此消息无法消费,此消息将会被删除或者迁移到"deadletter"通道中。
因此当我们使用messageListener方式消费消息时,通常建议在onMessage方法中使用try-catch,这样可以在处理消息出错时记录一些信息,而不是让consumer不断去重发消息;如果你没有使用try-catch,就有可能会因为异常而导致消息重复接收的问题,需要注意你的onMessage方法中逻辑是否能够兼容对重复消息的判断。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。