网站做细分领域,组织网站建设应该注意什么,网站设计制作代码,中国城乡建设经济研究所 网站activemq优先级在邮件列表中 #xff0c;通常会围绕ActiveMQ的消息优先级支持不断提出一些问题#xff0c;以及有关观察到的行为和“真正支持什么”的好问题#xff1f; 我希望可以帮助您了解幕后情况以及可以支持的优先级。 详细信息可能会有些麻烦。 如果您对这些细节不感… activemq优先级 在邮件列表中 通常会围绕ActiveMQ的消息优先级支持不断提出一些问题以及有关观察到的行为和“真正支持什么”的好问题 我希望可以帮助您了解幕后情况以及可以支持的优先级。 详细信息可能会有些麻烦。 如果您对这些细节不感兴趣请查看ActiveMQ Wiki 以获取高级概述。 首先由于ActiveMQ支持JMS 1.1所以让我们看一下JMS规范对支持“ JMSPriority”的看法 JMS定义了一个十级优先级值最低优先级为0最高优先级为9。 此外客户应将优先级0-4视为正常优先级将优先级5-9视为快速优先级。 JMS不需要提供者严格执行消息的优先级排序 但是它应该尽力在普通消息之前传递加急消息。 ActiveMQ观察到三个不同级别的“优先级” 默认JMSPriority 4 高JMSPriority 4 9 低JMSPriority 0 4 如果您没有为MessageProducer或单个消息指定优先级请参阅MessageProducersendmessagedeliveryModeprioritytimeToLive 则ActiveMQ的客户端将默认使用JMSPriority 4。作为JMS使用者您可以期望如果生产者没有使用优先级或者您没有在目的地使用其他形式的选择标准则使用FIFO排序。 规范指出ActiveMQ还“尽其所能”在“正常”消息之前传递加速消息。 代理使用的消息存储对完成操作有很大的帮助但是通常您可以期望代理仅接受JDBC支持的消息存储的严格0-9优先级支持。 对于支持KahaDB的消息存储库仅支持“类别优先级”“低”“默认”“高”其中每个类别中的优先级并非总是有区别的即5和9被视为“高”。 但是使用正确的设置和消息传递配置文件即使使用KahaDB您也可以影响[严格]优先级排序的方式因此让我们快速看一下。 启用邮件优先级 您可以使用activemq.xml配置文件中的以下设置在队列上启用消息优先级 destinationPolicypolicyMappolicyEntriespolicyEntry queuequeueName prioritizeMessagestrue //policyEntries/policyMap
/destinationPolicy 对于queueName 具有通配符支持因此您可以在消息层次结构上启用优先级支持。 启用优先级支持后代理将在其消息游标中使用优先级链表结构并向KahaDB提示在将消息存储到磁盘时使用优先级类别。 优先级排序的严格程度有不同的级别但是在最坏的情况下您可以假定优先级将按类别维护。 以下因素起作用这些因素控制使用KahaDB存储时优先级排序的严格程度 在队列游标中启用/禁用缓存 MaxPageInSize用于从一批存储中分页多少条消息 消费者预取 过期消息检查 代理内存设置 持久/非持久消息 下一节将详细介绍KahaDB中为支持优先级而发生的事情而下一节将探讨代理内存中的情况如何发生并最终分发给消费者并指出与上述不同因素的关系发挥作用。 KahaDB优先级分类 首先我们将从如何将消息存储在磁盘上并加载到目标位置开始。 KahaDB默认消息存储是基于文件的消息数据库代理使用该数据库将消息持久存储在“日志”或“日志”中。 代理还通过保持一个单独的“索引”来跟踪日志中包含哪些消息该“索引”保存有关消息的信息例如其在日志中的位置与之关联的目的地订购等。 索引还具有消息“优先级”的概念该概念由三个B Tree结构实现每个优先级级别一个请参见org.apache.activemq.store.kahadb.MessageDatabase中的MessageOrderIndex。 此实现细节是消息优先级排序的根当消息从存储中删除时它将对其余的代理产生影响。 从商店中检索消息时将成批完成maxPageInSize并且首先检索“ highPriority” BTree中的消息。 当高优先级消息耗尽时存储将随后提供默认优先级并随后提供低优先级消息。 您可以这样设置maxPageInSize policyEntry queuequeueName prioritizeMessagestruemaxPageSize500 页面大小越大批处理中的消息数量就越大并且每次“快照”一次可以看到的消息越多。 对于进入内存的每个批次将严格按照商店游标的说明对消息进行优先级排序。 缺点是如果您的消息量很大一次输入500条消息可能会耗尽代理内存。 默认设置为200。 消息光标优先级列表 当持久性消息从生产者进入代理时它们将被存储到磁盘上但也将被缓存在内存中等待分发给消费者。 这是默认设置因此无需显式设置。 其背后的想法是能够调度到快速使用方而不必直接从磁盘检索它如果使用方变慢则代理将自动调整自身以使其在填充后不使用高速缓存从而避免OOM。 这样做的好处是当对队列使用优先级支持时用于游标的内部列表将支持严格的优先级0-9因此对于当前在内存在缓存中的所有消息它们将按照从高到低的顺序正确排序。 诀窍在于当缓存中的所有消息都是“低优先级消息”然后高优先级消息进入代理但由于缓存已满而无法容纳在缓存中时这种情况将发生。直接在商店中进行索引并在“高优先级”索引中进行索引但是在下一批优先级消息被分页到内存中之前将无法在低优先级消息之前进行分发。 当NON持久消息进入代理时它们将不会进入消息存储。 它们将尽可能长时间地保留在内存中并且仅在内存超过定义的阈值默认情况下 70时才推送到磁盘在临时存储中。 因此上面的缓存消息的相同行为适用于非持久消息即内存中的消息将严格排序0-9但是一旦将它们推送到磁盘就只会观察到类别。 如果禁用游标的缓存具有以下设置 policyEntry queuequeueName prioritizeMessagestrueuseCachefalse / 那么您可以帮助消除上述情况即当高优先级消息进入时高速缓存将充满低优先级消息由于无法分页到内存而卡在磁盘上。 但是这样做会降低吞吐量因为必须先将磁盘中的消息分页到发送给使用者之前这会减慢调度速度。 但是请注意这样做时即使光标中具有优先级列表您也更有可能看到不遵循“严格”优先级的消息。 但是它们将正确遵循优先级类别高默认低。 综上所述如果禁用缓存则与启用缓存并填充优先级较低的消息相比可以更快地发送优先级较高的消息。 但是仅禁用缓存不会使您获得严格的优先权。 禁用缓存有助于将高优先级的消息先于低优先级的消息发送给使用者但是要使其按预期工作并且已经使我感到痛苦则需要禁用异步message expiry check 。 此过期检查每30秒将邮件分页到内存中无论它们是否准备好进行分派默认情况下并对其执行TTL检查生存时间并丢弃那些应过期的邮件。 这种检查有效地将消息带入内存并且将停滞正常的“页面调度”足以错过更高优先级的消息。 policyEntry queuequeueName prioritizeMessagestrueuseCachefalse expireMessagesPeriod0 但是关闭到期检查将使过期消息在存储区中保留的时间更长因为唯一的到期检查将在发送之前进行因此请对此进行有根据的决定并修改所有ActiveMQ设置。 但是为了朝着严格的顺序优先顺序前进您需要禁用此功能。 最后消费者的预取在实现“严格订购”方面发挥了作用。 默认情况下队列使用者的预取设置为1000这意味着将批量发送1000条消息。 这有助于加快消费者在使用消息时的速度但是就优先级而言从本质上讲它还像消息的缓存一样如上所述可能会导致看不到“严格排序”。 如果您的预取中填充了较低优先级的消息并且代理中出现了新的高优先级消息那么您也不会看到它直到下一条消息分发给消费者为止。 因此预取越低在优先级较低的消息之前看到较高优先级的消息的可能性就越大。 预取为1时您将始终获得商店游标知道的最高优先级消息。 policyEntry queuequeueName prioritizeMessagestrueuseCachefalse expireMessagesPeriod0 queuePrefetch1 客户端消息优先级 ActiveMQ还具有消息客户端中内置的优先级支持并且默认情况下已启用。 这意味着当将消息发送到您的使用者时甚至在您的消费者使用预取功能接收到它们之前它们将被缓存在使用者端并且默认情况下具有优先级。 这与您是否在代理方使用优先级支持无关。 这可能会影响您在消费者上看到的订购因此请记住这一点。 要禁用它请在代理URL上设置以下配置选项例如tcp://0.0.0.0:61616?jms.messagePrioritySupportedfalse 但是如上所述您需要将预取降低到1以获得获得严格排序的最佳机会。 权衡 因此最终可以通过KahaDB获得严格排序的消息但是要进行重大折衷考虑并且它并不适用于所有消息传递情况。 您想要优化的快速消息传递吗 还是要放慢消息传递速度以实现对优先级的严格排序。 每种情况都不同应根据具体情况进行评估。 但是通常您可以依赖类别级别的优先级。 在大队列中对消息进行重新排序并保持高性能是有问题的大多数Message Queue供应商都做得不太好。 ActiveMQ的优先级支持很强但正如ActiveMQ Wiki上讨论的描述消息优先级的讨论一样还有另一个不错的选择那就是使用消息选择器并以高优先级的消息最终被首先使用的方式平衡使用者。 这种方法倾向于提供更多的灵活性和控制力但这是另一篇文章。 参考 ActiveMQ消息优先级如何使用我们的JCG合作伙伴 Christian Posta位于Christian Posta –软件博客博客进行工作。 翻译自: https://www.javacodegeeks.com/2013/04/activemq-message-priorities-how-it-works.htmlactivemq优先级