activemq和jms_保证主题,JMS规范和ActiveMQ的消息传递

activemq和jms

最近,一位客户要求我仔细研究ActiveMQ的“持久”消息的实现,它如何应用于主题以及在存在非持久订户的故障转移方案中会发生什么。

我已经了解到,JMS语义规定,即使面对消息代理提供程序故障,也只能保证主题的持久订户以持久传递模式传递消息。 但是对于持久消息的非持久订户,该怎么说呢? 没有持久订阅者时发送“持久”消息有什么意义?

在查看规范的确切措辞后,我变得有点不确定。 因此,我查阅了Java消息服务书(Richards,Monson-Haefel和Chappell),以了解有关保证消息传递的更多讨论,并查看了ActiveMQ源代码,并与我的一些同事进行了咨询。

首先,让我们看一下规格说明:

根据JMS规范的第4.10节:

大多数客户应使用产生PERSISTENT消息的生产者。 这样可以确保从队列或持久订阅中传递的消息只有一次的消息传递。

很清楚吧? 使用持久消息传递可确保为队列或持久预订传递消息。

从第6.12节开始:

不可持久订户的未确认消息应该能够在该不可持久订户的生命周期中恢复。

因此,现在应该能够恢复非持久订户的未经确认的消息吗? 我猜是“在那个非持久订户的一生中”

但后来成为6.12的一部分:

只有持久订阅才能可靠地恢复未确认的消息。

和…

为了确保传递,TopicSubscriber应该建立持久订阅。

尽管规范非常清楚地表明(只有效果),只有队列和持久订户才能利用存储转发保证的交付,但是我猜我对“非持久订户应该能够在非耐用订户的整个生命周期内恢复”

  • 主题的持久性协议是否会根据其使用者而更改(在此消息中,只有当代理保留了消息并向生产者发送确认后,消息才被视为代理的责任)?
  • 这是否意味着即使发生经纪人失败? 还是考虑了经纪人的失败以及非耐久潜艇的订购期限?
  • 当存在用于持久性,非持久性主题的代理网络时,ActiveMQ会发生什么? 如果网络中的代理失败,消息会丢失吗?
  • 向具有非持久订阅者的主题发送消息“持久”与“非持久”之间的确切区别是什么?

这是保证交付讨论中必须考虑的两个部分。 发布者向代理发送消息的位置,以及消费者从代理接收消息的时间。 对于持久性消息,该协议仅在将消息持久化到商店之后才由发送方发送消息,并且代理由协议确认。 另一方面,消费者必须在经纪人传递消息后确认该消息,说“嘿,我现在要对此消息负责”。 只有这样,经纪人才会放弃责任并将其从其商店中删除。  

协议是否根据主题的使用者而改变?

因此,对于发送到某个主题的持久消息(目前未考虑任何消费者),规范是否说明在代理发回其确认之前是否应该存储该消息? 不,不是。 它由有关的JMS代理的实现者来决定。 对于ActiveMQ,如果某个主题上只有非持久订阅,它将不会保留该消息。

协议的同步性质不会改变,即,如果消息是持久发送的,则会话将认为与代理的交换是同步的,并且它将在继续之前等待代理的响应,但代理不会实际保留消息。 在ActiveMQ中,如果至少有一个持久订户,则这种情况会改变。 然后,代理将保留消息(按照JMS规范)。  

这是否意味着即使发生经纪人失败?

如果代理失败,则非持久订阅的生存期确实会中断。 因此,如果代理发生故障(或该非持久子项的任何其他终止),则即使将消息持久发送,也不会将其传递给该非持久订户。 此外,面对代理的非持久订阅失败,将不会重新发送消息。  

在经纪人网络中会发生什么?

消息确实可能丢失。 考虑这个经纪人网络,其中A-> B-> C和订阅是从C-> B-> A转发的。因此,如果我们在A处有一个生产者,生产的主题为“ topic.foo”,而一个非耐用的消费者如果代理B在代理C上从“ topic.foo”中消费,则如果代理B发生故障,此后发送到A的消息将被丢弃。 据A所知,订阅的生存期已终止。

最后,  

向具有非持久订阅者的主题发送消息“持久”与“非持久”之间的确切区别是什么?

根据JMS规范:

出版方式 非持久订户 耐用的订户
非持久 最多一次(如果不活动则丢失) 最多一次
持久性 一次仅一次(如果不活动则丢失) 一次只有一次

因此,对于非持久性订户,非持久性消息将“​​最多”传递一次,但如果处于非活动状态(或代理失败)则将丢失。

对于非持久性订户,持久消息将“仅一次发送”,但如果不活动则丢失。 规范的“非活动”部分实际上意味着,如果没有持久的主题订阅者,则消息可能会丢失,并且无论消息是持久发送还是非持久发送,都无法保证传递。

参考: Christian Posta软件博客上来自JCG合作伙伴 Christian Posta的主题,JMS规范和ActiveMQ的有保证的消息传递


翻译自: https://www.javacodegeeks.com/2012/08/guaranteed-messaging-for-topics-jms.html

activemq和jms

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值