activemq优先级_ActiveMQ消息优先级:工作原理

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或单个消息指定优先级(请参阅MessageProducer#send(message,deliveryMode,priority,timeToLive) ),则ActiveMQ的客户端将默认使用JMSPriority ==4。作为JMS使用者,您可以期望如果生产者没有使用优先级,或者您没有在目的地使用其他形式的选择标准,则使用FIFO排序。

规范指出,ActiveMQ还“尽其所能”在“正常”消息之前传递加速消息。 代理使用的消息存储对完成操作有很大的帮助,但是通常,您可以期望代理仅接受JDBC支持的消息存储的严格(0-9)优先级支持。 对于支持KahaDB的消息存储库,仅支持“类别优先级”(“低”,“默认”,“高”,其中每个类别中的优先级并非总是有区别的,即5和9被视为“高”)。 但是,使用正确的设置和消息传递配置文件,即使使用KahaDB,您也可以影响[严格]优先级排序的方式,因此让我们快速看一下。

启用邮件优先级

您可以使用activemq.xml配置文件中的以下设置在队列上启用消息优先级:

<destinationPolicy><policyMap><policyEntries><policyEntry queue='queueName' prioritizeMessages='true' /></policyEntries></policyMap>
</destinationPolicy>

对于queueName ,具有通配符支持,因此您可以在消息层次结构上启用优先级支持。

启用优先级支持后,代理将在其消息游标中使用优先级链表结构,并向KahaDB提示在将消息存储到磁盘时使用优先级类别。 优先级排序的严格程度有不同的级别,但是在最坏的情况下,您可以假定优先级将按类别维护。 以下因素起作用,这些因素控制使用KahaDB存储时优先级排序的严格程度:

  • 在队列游标中启用/禁用缓存
  • MaxPageInSize,用于从一批存储中分页多少条消息
  • 消费者预取
  • 过期消息检查
  • 代理内存设置
  • 持久/非持久消息

下一节将详细介绍KahaDB中为支持优先级而发生的事情,而下一节将探讨代理内存中的情况如何发生并最终分发给消费者,并指出与上述不同因素的关系发挥作用。

KahaDB优先级分类

首先,我们将从如何将消息存储在磁盘上并加载到目标位置开始。 KahaDB(默认消息存储)是基于文件的消息数据库,代理使用该数据库将消息持久存储在“日志”或“日志”中。 代理还通过保持一个单独的“索引”来跟踪日志中包含哪些消息,该“索引”保存有关消息的信息(例如其在日志中的位置,与之关联的目的地,订购等)。 索引还具有消息“优先级”的概念,该概念由三个B + Tree结构实现,每个优先级级别一个(请参见org.apache.activemq.store.kahadb.MessageDatabase中的MessageOrderIndex)。 此实现细节是消息优先级排序的根,当消息从存储中删除时,它将对其余的代理产生影响。

从商店中检索消息时,将成批完成(maxPageInSize),并且首先检索“ highPriority” BTree中的消息。 当高优先级消息耗尽时,存储将随后提供默认优先级,并随后提供低优先级消息。

您可以这样设置maxPageInSize:

<policyEntry queue='queueName' prioritizeMessages='true'maxPageSize='500'>

页面大小越大,批处理中的消息数量就越大,并且每次“快照”一次可以看到的消息越多。 对于进入内存的每个批次,将严格按照商店游标的说明,对消息进行优先级排序。 缺点是,如果您的消息量很大,一次输入500条消息可能会耗尽代理内存。 默认设置为200。

消息光标优先级列表

当持久性消息从生产者进入代理时,它们将被存储到磁盘上,但也将被缓存在内存中,等待分发给消费者。 这是默认设置,因此无需显式设置。 其背后的想法是能够调度到快速使用方,而不必直接从磁盘检索它(如果使用方变慢,则代理将自动调整自身以使其在填充后不使用高速缓存,从而避免OOM)。 这样做的好处是,当对队列使用优先级支持时,用于游标的内部列表将支持严格的优先级(0-9),因此对于当前在内存(在缓存中)的所有消息,它们将按照从高到低的顺序正确排序。 诀窍在于,当缓存中的所有消息都是“低优先级消息”,然后高优先级消息进入代理,但由于缓存已满而无法容纳在缓存中时,这种情况将发生。直接在商店中进行索引,并在“高优先级”索引中进行索引,但是在下一批优先级消息被分页到内存中之前,将无法在低优先级消息之前进行分发。

当NON持久消息进入代理时,它们将不会进入消息存储。 它们将尽可能长时间地保留在内存中,并且仅在内存超过定义的阈值(默认情况下> 70%)时才推送到磁盘(在临时存储中)。 因此,上面的缓存消息的相同行为适用于非持久消息,即内存中的消息将严格排序(0-9),但是一旦将它们推送到磁盘,就只会观察到类别。

如果禁用游标的缓存(具有以下设置)

<policyEntry queue='queueName' prioritizeMessages='true'useCache='false' />

那么您可以帮助消除上述情况,即当高优先级消息进入时,高速缓存将充满低优先级消息(由于无法分页到内存而卡在磁盘上)。 但是,这样做会降低吞吐量,因为必须先将磁盘中的消息分页到发送给使用者之前,这会减慢调度速度。 但是请注意,这样做时,即使光标中具有优先级列表,您也更有可能看到不遵循“严格”优先级的消息。 但是,它们将正确遵循优先级类别(高,默认,低)。 综上所述,如果禁用缓存,则与启用缓存并填充优先级较低的消息相比,可以更快地发送优先级较高的消息。 但是,仅禁用缓存不会使您获得严格的优先权。

禁用缓存有助于将高优先级的消息先于低优先级的消息发送给使用者,但是要使其按预期工作(并且已经使我感到痛苦),则需要禁用异步message expiry check 。 此过期检查每30秒将邮件分页到内存中,无论它们是否准备好进行分派(默认情况下),并对其执行TTL检查(生存时间),并丢弃那些应过期的邮件。 这种检查有效地将消息带入内存,并且将停滞正常的“页面调度”,足以错过更高优先级的消息。

<policyEntry queue='queueName' prioritizeMessages='true'useCache='false' expireMessagesPeriod='0' >

但是,关闭到期检查将使过期消息在存储区中保留的时间更长,因为唯一的到期检查将在发送之前进行,因此请对此进行有根据的决定,并修改所有ActiveMQ设置。 但是,为了朝着严格的顺序优先顺序前进,您需要禁用此功能。

最后,消费者的预取在实现“严格订购”方面发挥了作用。 默认情况下,队列使用者的预取设置为1000,这意味着将批量发送1000条消息。 这有助于加快消费者在使用消息时的速度,但是就优先级而言,从本质上讲,它还像消息的缓存一样(如上所述),可能会导致看不到“严格排序”。 如果您的预取中填充了较低优先级的消息,并且代理中出现了新的高优先级消息,那么您也不会看到它,直到下一条消息分发给消费者为止。 因此,预取越低,在优先级较低的消息之前看到较高优先级的消息的可能性就越大。 预取为1时,您将始终获得商店游标知道的最高优先级消息。

<policyEntry queue='queueName' prioritizeMessages='true'useCache='false' expireMessagesPeriod='0' queuePrefetch='1' >

客户端消息优先级

ActiveMQ还具有消息客户端中内置的优先级支持,并且默认情况下已启用。 这意味着,当将消息发送到您的使用者时(甚至在您的消费者使用预取功能接收到它们之前),它们将被缓存在使用者端,并且默认情况下具有优先级。 这与您是否在代理方使用优先级支持无关。 这可能会影响您在消费者上看到的订购,因此请记住这一点。 要禁用它,请在代理URL上设置以下配置选项,例如tcp://0.0.0.0:61616?jms.messagePrioritySupported=false

但是如上所述,您需要将预取降低到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.html

activemq优先级

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移动通信

通信: 信源和信宿间信息的传输和交换构成了通信。 2)分类通信&#xff1a;固定通信&#xff0c;移动通信移动通信通信双方至少有-方在移动中(或者临时停留在某一非预定的位置 上)进行信息传输和交换。 这包括移动体(车辆、船舶、飞机和行人)和移动体之间的通信&#xff0c;移动…

移动通信(2)

二 移动通信系统工作方式 1)通信系统传输方式: 传输方式&#xff1a;单向&#xff0c;双向&#xff08;单工&#xff0c;半双工&#xff0c;双工&#xff09; 注意移动通信系统中所定义的工作方式与通信原理中并不一致。 2)工作方式类别 (1)单工通信:通信双方电台仅能交替地进行…

Java 9概览

对于许多Java 9来说&#xff0c;它似乎是一个维护版本&#xff0c;它推动了不能在Java 8中实现的项目Jigsaw。但是&#xff0c;随着JDK中的新模块系统以及与之相关的许多内部更改&#xff0c;Java 9也带来了开发人员工具箱中一些很棒的新内容。 以下是重点内容&#xff1a; JS…

数据库(3)——关系

关系的形式化定义和概念 &#xff08;1&#xff09;关系上域的定义Domain1)域是一组具有相同数据类型的值的集合,又称为值域。(用D表示)2)域中所包含的值的个数称为域的基数(用m表示)。 在关系中用域表示属性的取值范围。 D1{李力,王平&#xff0c;刘伟} , m3 ; &#xff08;2&…

数据库(4)——候选码和主键

候选码或候选键&#xff08;Candidate Key&#xff09; 如果在一个关系中&#xff0c;存在一个或一组属性的值能唯一地标识该关系的一个元组&#xff0c;则这个属性或属性组称为该关系的候选码或候选键&#xff0c;一个关系可能存在多个候选码。 候选码性质&#xff1a;唯一性&…

adf开发_了解ADF Faces clientComponent属性

adf开发我相信大多数ADF开发人员都知道ADF Faces属性clientComponent 。 在本文中&#xff0c;我将展示该属性实际上如何影响组件渲染以及它如何改变其行为。 让我们开始考虑一个非常简单的示例&#xff1a; <af:inputText label"Label 1" id"it1" /&g…

通信原理

绪论 1&#xff09;信息&#xff0c;消息&#xff0c;信号通信&#xff1a;利用电&#xff08;或者光&#xff09;信号传输消息中所包含的信息。信息&#xff1a;消息的内涵。 消息&#xff1a;信息的物理表现形式。&#xff08;可分为两类连续消息语音&#xff0c;音乐&#x…

Picocli 2.0:事半功倍

介绍 Picocli是一个单文件命令行解析框架&#xff0c;它使您几乎不需要任何代码即可创建命令行应用程序。 使用Option或Parameters注释应用程序中的字段&#xff0c;picocli将分别使用命令行选项和位置参数填充这些字段。 例如&#xff1a; Command(name "Greet", …

通信原理—通信系统组成

通信系统的组成 1一般模型信源——>发送设备——>信道&#xff08;噪声源&#xff09;——>接收设备——>信宿 通信系统是指传递信息所需的一切设备和信道的总体。 信源 &#xff1a;把消息变化原始电信号&#xff08;基带信号&#xff09;&#xff0c;非电量转化为…

无线通信(补充)

长波通信 长波通信是波长为1 000&#xff5e;10 000m&#xff08;频率为30&#xff5e;300kHz&#xff09;的无线电通信。 主要用于军事上&#xff0c;如潜艇通信、地下通信及导航等。 在一定范围内&#xff0c;长波通信以地波传播为主&#xff0c;当通信距离大于地波的最大传播…

Java 20年

二十年前&#xff0c;在苏黎世的一间公寓里发生了两件事。 我的女儿迈出了第一步&#xff0c;一位年轻的博士后研究员&#xff08;她的父亲&#xff09;迈出了使用Java的第一步。 很难完全理解当时的Java。 在这些时代&#xff0c;TCL盛行&#xff0c;Java时代与冰箱和烤面包机…

数据库设计()

数据库设计1 数据库设计的任务数据库设计是指根据用户需求研制数据库结构和行为的过程。对于一个给定的应用环境&#xff0c;构造最优的数据库模式&#xff0c;建立数据库及其应用系统;有效地存储数据&#xff0c;满足用户的信息要求和处理要求。 2数据库设计的特点 结构源于行…

移动通信—无线波传播

无线波传播 发射天线或自然辐射源所辐射的无线电波,通过自然条件下的媒质到达接受天线的过程称为无线电波传播。无线电波与可见光、X射线与γ射线-.样同属于电磁波,它们都是以电场和磁场为其特征的- -种电场震动。电磁波的频谱范围很宽,从几赫到3X 1023Hz(波长从几十兆米到10-9…

使用Dropwizard度量标准监视和测量无功应用

在上一篇文章中&#xff0c;我们创建了一个简单的索引代码&#xff0c;该代码可以对ElasticSearch进行数千个并发请求。 监视系统性能的唯一方法是老式的日志记录语句&#xff1a; .window(Duration.ofSeconds(1)) .flatMap(Flux::count) .subscribe(winSize -> log.debug(…

移动通信-多径效应,多普勒效应,菲涅尔区,阴影效应,快衰落,慢衰落

多径效应 信号从发射端到接收端常有许多时延不同、损耗各异的传输路径&#xff0c;可以是直射、反射或是绕射。无线电波的多径效应是指不同路径的相同信号在按收端叠加会增大或减小接收信号能量的现象。 时间色散 在无线通信中&#xff0c;无线电波从发射端到接收端会经过直射、…

拆分为流

我正在为我工​​作的公司准备正则表达式教程更新。 原始教程创建于2012年&#xff0c;从那时起Java发生了一点变化。 有新的Java语言版本&#xff0c;尽管Java中的正则表达式处理仍不完善&#xff08;nb。它仍使用非确定性FSA&#xff09;&#xff0c;但仍有一些新功能。 我在…

四旋翼

更新2018/11 1系统设计 硬件总体框架&#xff08;认识四旋翼的基本组成&#xff09; 机架主要的两种&#xff08;x型控制更难&#xff0c;动作灵活&#xff09; 十字型,X字型 桨 7040,8045&#xff08;常用&#xff09;&#xff0c;前四位直径&#xff0c;后四位角度 正反螺旋…

hotspot线程模型_Linux上的HotSpot GC线程CPU占用空间

hotspot线程模型以下问题将测试您对Linux操作系统上运行的Java应用程序的垃圾收集和高CPU故障排除的知识。 当调查过多的GC和/或CPU利用率时&#xff0c;此故障排除技术尤其重要。 它将假定您无权使用高级监控工具&#xff0c;例如Compuware dynaTrace甚至JVisualVM。 将来将介…

数字信号处理实验一

补充2019/10/26 (1)序列的加、减、乘、除和乘方运算。输入A[1 2 3 4]&#xff0c;B[3 4 5 6]&#xff0c;起点n0&#xff0c;求CAB&#xff0c;DA-B&#xff0c;EA.*B&#xff0c;FA./B&#xff0c;GA.^B&#xff0c;并用stem语句画出A&#xff0c;B&#xff0c;C&#xff0c;D…

SRP是骗局

根据罗伯特马丁 &#xff08; Robert Martin&#xff09;的 《 清洁法 》&#xff08; Clean Code&#xff09; &#xff0c;“ 单一责任原则 ”意味着“一个阶级应该只有一个改变的理由”。 让我们尝试解密这个模糊的语句&#xff0c;看看它如何帮助我们设计更好的面向对象软件…