科技有限公司 网站制作,网站建设与运行的盈利收入,个人公众号申请要钱吗,wordpress发消息activemq消息持久化我被问了很多关于ActiveMQ如何存储消息#xff08;或在某些情况下不存储#xff09;的基本知识。 这是它的高级解释。 注意#xff0c;上下文在JMS中。 如果您使用ActiveMQ的非JMS客户端#xff08;即STOMP#xff0c;AMQP#xff0c;MQTT等#xff0… activemq消息持久化 我被问了很多关于ActiveMQ如何存储消息或在某些情况下不存储的基本知识。 这是它的高级解释。 注意上下文在JMS中。 如果您使用ActiveMQ的非JMS客户端即STOMPAMQPMQTT等则在某些情况下行为可能有所不同。 ActiveMQ 在不丢失标记为“持久”的消息方面JMS持久性保证非常强大。 让我们看看它如何适用于ActiveMQ 主题 主题是一种广播机制。 它们使我们能够在JMS领域中实现发布-订阅语义。 但是如果我们将消息标记为“持久”并且没有订阅者会发生什么情况 在任何普通广播中例如我去市区并开始大喊ActiveMQ的出色表现如果没有订阅者3a周围没有人听到我的声音……如果我不在一定是一个美好的夜晚在3a会发生什么 没有。 没有人听到。 然后我们继续前进。 如果您发布消息持久的或非持久的并且没有订阅者没有活动的订阅者和持久的订阅者ActiveMQ对该消息不做任何事情。 ActiveMQ仅在有持久订户活动或不活动的情况下存储消息。 对于非活动的持久订阅ActiveMQ会将标记为“持久”的消息存储到非易失性存储中并等待订阅者重新加入订阅。 届时它将尝试传递消息。 Queue列 对于队列ActiveMQ使用简单的默认协议来处理“持久”消息。 我们基本上阻塞了主要生产者线程并等待确认经纪人实际上已收到消息 制片人 生产者发送消息 生产者阻止等待来自代理的ACK 如果成功的确认生产者继续 经纪人 收到消息 将消息存储到磁盘 发回ACK 对于“非持久”发送流程是不同的。 我们以“即发即弃”模式发送邮件。 主生产者线程不会被阻塞并且在ActiveMQ连接传输线程上异步发生任何ACK或其他响应 生产者发送消息 生产者继续其线程不会阻塞 生产者最终在与主生产者线程不同的单独线程上获得ACK 如果失败则客户端可以订阅JMS ExceptionListener以获得通知 交易发送 我们可以通过分批一次发送多个消息来提高发送给代理的性能。 这样可以更有效地利用网络以及代理存储。 发送交易时您必须意识到一个重要的区别。 TX会话的打开和关闭回滚/提交都是与代理的同步交互 但是 TX窗口中每个消息的发送都是异步发送的。 如果一切顺利这是可以的因为代理将这些消息分批处理。 但是如果出现运输错误怎么办 还是代理用完了空间来保存这些消息 我们需要设置一个ExceptionListener来监视这些发送期间的错误。 我们还需要或应该设置一个客户端发送“生产者窗口”以允许我们在代理耗尽资源时强制执行生产者流控制。 有关更多信息请参见ActiveMQ生产者流控制 。 更改默认值 生产者上有趣的设置可以更改以下行为 useAsyncSend –始终异步等待ACK即使在持久发送和提交中也是如此 alwaysSyncSend –强制所有发送包括非持久性或事务性发送始终等待来自代理的ACK 人们通常想要使用默认值。 存储 对于ActiveMQ的生产用途我目前建议使用共享存储方法 。 在这种情况下我们需要知道存储层发生了什么以了解ActiveMQ的保证。 默认情况下ActiveMQ将实现JMS持久性要求该要求基本上规定了所存储的消息必须在崩溃后幸免。 为此默认情况下我们将在文件系统上执行“ fsync”。 现在每个系统上发生的情况将取决于您使用的操作系统网络存储控制器存储设备等。 对于需要持久存储消息并且不是特定于ActiveMQ的任何类型的数据库这都是您期望的。 当我们写入ActiveMQ事务日志时我们需要让OperatingSystem通过调用fsync将日志刷新到磁盘。 基本上发生的是我们迫使操作系统回写用于将文件更改缓存到存储介质的页面文件缓存。 它还鼓励存储介质执行将数据“存储”到磁盘所需的操作取决于实现 一些存储控制器具有自己的缓存需要刷新。 磁盘驱动器具有自己的缓存等等。其中一些缓存由电池支持并且可能以自己的时间间隔写回等等。为了使您了解通过ActiveMQ运行的消息的持久性您应该了解您的存储层。 消费者 最后难题的最后一部分是我们如何向消费者传递/分发消息以及他们如何确认。 ActiveMQ JMS库为您处理了所有这些因此您不必担心是否会丢失消息。 消息将被分发给消费者直到达到驻留在消费者身上的某个“预取”缓冲区为止。 这可以通过使使用者上的可用消息缓存准备好进行处理然后在使用者使用它们时重新填充此缓存来帮助加速消息处理。 在ActiveMQ中这些预取的消息在控制台中表示为“运行中”。 这一点取决于消费者来处理这些消息并对其进行确认。 这将取决于确认模式。默认的自动确认将在使用者获取消息时发送ACK。对于更重要的消息处理您可能希望使用“客户端”确认其中客户端明确说明何时确认消息即完成一些处理后。 如果使用者由于某种原因失败则任何未确认的消息将重新发送到另一个使用者如果有并按照上述相同的处理过程进行。 代理在收到ACK之前不会从其索引中删除该消息。 因此这包括使用者级别和网络级别的故障。 如果即使在消费者被“成功处理”之后这两个级别中的任何一个都存在错误请注意这是非常用例的具体含义“成功处理”的含义并且经纪人没有收到确认那么经纪人很有可能将重新发送消息。 在这种情况下您最终可能会在使用者方面产生重复并且可能会希望实现一个幂等的使用者。 为了扩大消息传递的生产者/消费者无论如何您都需要有幂等的消费者。 最后要注意的一点不使用XA事务JMS不会一次保证消息也只能一次处理消息。 JMS在一次就可以保证一次传递的范围内可以将消息标记为“已重新传递”并让消费者检查该消息但是消费者应负责处理多少次或与幂等消费者过滤掉。 翻译自: https://www.javacodegeeks.com/2016/05/message-durability-activemq-5-x.htmlactivemq消息持久化