ActiveMQ是否保证邮件传递?

时间:2015-05-25 12:55:02

标签: activemq

当我们使用ActiveMQ时,我们可以信任ActiveMQ服务器的可靠性。例如,在开发非实时软件时(无需立即发送数据。但应该发送)。我们是否可以信任activeMQ作为确认邮件传递的可靠来源。例如,我正在从生产者发送一个xml文件。将该文件发送到ActiveMQ确认的ActiveMQ传送。那么我可以信任ActiveMQ并删除xml的本地副本吗?

EDITS

当消息到达ActiveMQ服务器时,它是可靠的。我们如何确保生产者服务器链接的可靠性。如果producer是java SE应用程序。 ActiveMQ客户端如何处理这些场景

  • 在准备要发送的数据时强制关闭应用程序。
  • 发送消息时
  • 网络故障。

enter image description here

4 个答案:

答案 0 :(得分:4)

如果您使用事务和持久交付发送到ActiveMQ(如果您通过JMS,则几乎默认)并且事务提交成功 - 是的。然后ActiveMQ将消息保存在持久存储(通常是磁盘)上。

然后,当然,磁盘可能会崩溃,人为错误和地震可能会打击你,但除此之外,消息还可以。

答案 1 :(得分:2)

ActiveMQ绑定到JMS规范,该规范要求JMS提供程序默认情况下必须保证“持久性”的传递。消息。此保证确实带来了沉重的性能价格,因为在向生产者确认消息之前,代理必须在消息存储中安全地保留消息。此保证不需要本地JMS事务,但可用于将消息批处理到代理,这是克服性价比高的一种方法。

答案 2 :(得分:0)

我建议制作人不能丢弃XML消息,直到客户确认已收到消息为止。仅确认ActiveMQ服务器已收到它是不够的,因为在客户端收到消息之前该消息没有任何价值。

所以为此,我会发现某种确认接收是一种好方法。简化的系统可能会像这样......

初始设置

首先,创建两个主题:'消息'和'消息收据'。

接下来,设置制作人以发布到'消息'主题,并订阅'邮件收据'话题。制作人还应该能够维护已发送但尚未确认的所有消息的列表。

此外,您的客户还会订阅“'消息”。主题,并发布到'消息收据'主题。

发布消息

要发布消息,Producer将首先生成XML消息,并为其提供可识别消息的唯一ID。然后它会将其发布在'消息'主题。

然后,客户端会在“'消息”上看到该消息。话题。然后它必须转身并发布一条消息收据'响应,其中包含收到的消息的ID。

最后,制片人会看到“收据”收据'消息,并且可以通过将消息接收ID与尚未确认的消息列表进行比较来确认消息已被发送。确认后,该消息将从已发送但尚未验证的消息中删除。列表。

处理未收到的讯息

如果在一段时间内没有收到任何收据,制作人可以重新发送邮件。

答案 3 :(得分:0)

是的,ActiveMQ是基于JMS的消息代理,其核心是旨在确保可靠地传递消息。为了更好地理解这一点,让我们考虑通过系统的消息路径,即从生产到消费。

消息通常以两跳的形式传递。第一个跃点是消息从生产者传输到消息代理上的目的地(在本例中为ActiveMQ)的位置。在第二跳中,消息从代理上的物理目标传输到消费者。

在此过程中,只有三种方法可以使消息在路径中丢失。首先是它从生产者转移到消息代理的过程。第二个可能的损失点是在经纪人的内存中,最后是从经纪人到消费者的路径。

ActiveMQ使用两种机制以三种方式中的任何一种来ensure messages are not lost。首先是代理将所有消息存储在高度持久的数据存储中。如果系统中断或代理内存在成功传递消息之前出现故障,则代理在恢复后仍可以检索该消息,然后重试该操作。

第二,ActiveMQ使用确认和事务来确保成功产生和使用消息。即使使用这两种方法,也有可能无法成功传递邮件。例如,当用于消费消息的事务处理会话回滚时。发生这种情况时,邮件将返回到队列并重新发送。

ActiveMQ提供了两种方法来处理返回到队列并成功发送的消息。这些是延迟的交还和死信地址。

对于延迟的交付,消息会延迟一段时间,以使使用者能够从瞬态故障中恢复并防止网络或系统过载。这是一个示例,展示了如何在地址设置配置中定义延迟交期。

<!-- delay message redelivery for 5 seconds -->
<address-setting match="exampleQueue">
   <!-- default is 1.0 -->
   <redelivery-delay-multiplier>1.5</redelivery-delay-multiplier>
   <!-- default is 0 (no delay) -->
   <redelivery-delay>5000</redelivery-delay>
   <!-- default is 0.0) -->
   <redelivery-collision-avoidance-factor>0.15</redelivery-collision-avoidance-factor>
   <!-- default is redelivery-delay * 10 -->
   <max-redelivery-delay>50000</max-redelivery-delay>
</address-setting>

对于死信地址,未成功发送的邮件将从队列中删除并发送到死信地址。代理不会尝试重新传递此类消息,而是将它们放置在队列中,系统管理员可以访问该队列并采取措施。

下面是一个死信地址的简单配置。

<!-- undelivered messages in the Queue are sent to a dead letter address
after 3 unsuccessful redelivery attempts -->
<address-setting match="exampleQueue">
   <dead-letter-address>deadLetterAddress</dead-letter-address>
   <max-delivery-attempts>3</max-delivery-attempts>
</address-setting>