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,优先级,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消息优先级:克里斯汀·波斯塔( Christian Posta)–软件博客博客上的JCG合作伙伴克里斯蒂安·波斯塔( Christian Posta)的工作方式 。

翻译自: https://www.javacodegeeks.com/2013/04/activemq-message-priorities-how-it-works.html

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

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

相关文章

flask 检测post是否为空_使用Flask搭建一个校园论坛-4

在上一节中完成了注册功能的前期准备工作&#xff0c;在这一节内容中将完成用户注册、登录功能。1.知识预览在本届中将学习到以下内容的知识如何使用wtform来渲染表单如果使用flask-mail来发送邮件2.用户注册在前端中form表单是用的比较多的东西&#xff0c;我们可以使用wtform…

SQL Table 自动生成Net底层-生成数据操作Repository

生成接口类 public static string DataTableToBaseIService(string tableName, string nameSpace, string className){var table SqlTableHelper.GetSQLTableInfo(tableName);StringBuilder reval new StringBuilder();reval.AppendFormat(" using System; using…

CSS3扁平化Loading动画特效

效果预览&#xff1a;http://hovertree.com/texiao/css3/42/ 代码如下&#xff1a; <!doctype html><html><head><meta charset"utf-8"><title>css3旋转加载效果_何问起</title><style>body {background: #263238;backgro…

自定义Spring命名空间使JAXB更容易

首先&#xff0c;让我大声说出来&#xff1a; Spring不再是XML繁重的了 。 事实上&#xff0c;如今&#xff0c;您可以使用大量注释&#xff0c; Java配置和Spring Boot来编写几乎没有XML或根本没有XML的Spring应用程序。 认真地停止谈论Spring和XML&#xff0c;这已经成为过去…

sublime text3运行python不显示内容_sublime text 运行python无法出结果

一、python和sublime text 已经安装完毕。二、用sublime text运行python程序得时候出现三、配置Python环境1、打开Tools > Build System > New Build System..2、点击New Build System后&#xff0c;会生成一个空配置文件&#xff0c;在这个配置文件内覆盖配置信息&#…

利用锚点再点事吧丨

上图 接着HTML代码&#xff1a; <div id"color"> <div id"red">红</div> <div id"yellow">黄</div> <div id"black">黑</div> <div id"green">绿</div> </div>…

JavaScript变量声明与提升

一直以来对变量提升都是比较模糊的&#xff0c;今天特地看了一下这个知识点&#xff0c;总结一下。 1、举个最简单的例子来说一下什么是变量提升吧。  function foo(){console.log(x); // undefinedvar x 12;console.log(x) // 12 } foo(); 由于变量声明提升&#xff0c;其…

javaweb笔记1

转载于:https://www.cnblogs.com/webdev8888/p/9164291.html

重复运行JUnit测试而没有循环

最近&#xff0c;我遇到了一个问题&#xff0c;我不得不编写一种方法的测试&#xff0c;该方法需要计算在一定可能性范围内的随机分布值1 。 更准确地说&#xff0c;如果您假设签名看起来像 interface RandomRangeValueCalculator {long calculateRangeValue( long center, lo…

以太网数据帧的报尾封装字段是什么_16、90秒快速“读懂”数据包的封装、解封装...

数据转发过程概述数据包在相同网段内或不同网段之间转发所依据的原理基本一致。一、数据帧封装TCP封装(四层)当主机建立了到达目的地的TCP连接后&#xff0c;便开始对应用层数据进行封装。主机A会对待发送的应用数据首先执行加密和压缩等相关操作&#xff0c;之后进行传输层封装…

MVP模式在Android实际项目中的应用和优化

注&#xff1a;本文阅读需要对MVP模式有基本了解。 MVP模式已经出现有很长一段时间了&#xff0c;但是火起来是这两年的事情。 关于MVP的概览&#xff0c;介绍&#xff0c;乃至于教程&#xff0c;Demo&#xff0c;实例&#xff0c;网上都有很多&#xff0c;我也有一篇文章专门收…

将训练集构建成ImageNet模型

以下程序实现将训练集构建为ImageNet模型&#xff0c;训练集图片为56个民族 import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintWriter;public class createTxt {public static void createClassInd(){//56个…

CSS基本知识(慕课网)

1、注释 注解&#xff1a;CSS中注释/*这里是注释的文字*/ HTML中注释<!--这里是注释的文字--> 2、外部式css样式&#xff0c;写在单独的一个文件中 注解&#xff1a; 外部式css样式(也可称为外联式)就是把css代码写一个单独的外部文件中&#xff0c;这个css样式文件以“…

JMS和Spring:有时很重要的小事情

JmsTemplate和DefaultMessageListenerContainer是用于访问JMS兼容MOM的Spring帮助器。 他们的主要目标是在JMS API之上形成一层&#xff0c;并处理诸如事务管理/消息确认之类的基础结构&#xff0c;并隐藏JMS API的某些重复和笨拙的部分&#xff08;保留在那里&#xff1a; JMS…

python 音速_webpack多页应用架构系列(十一):预打包Dll,实现webpack音速编译

前言上文说到我们利用webpack来打包一个可配置的bootstrap&#xff0c;但文末留下一个问题&#xff1a;由于bootstrap十分庞大&#xff0c;因此每次编译都要耗费大部分的时间在打包bootstrap这一块&#xff0c;而换来的仅仅是配置的便利&#xff0c;十分不划算。我也并非是故意…

whereis 命令

可以用来查看命令的路径&#xff0c;安装在哪里 whereis命令是定位可执行文件、源代码文件、帮助文件在文件系统中的位置 [rootsalt-server-192 a]# whereis mysql mysql: /usr/bin/mysql /usr/lib64/mysql /usr/share/mysql /usr/share/man/man1/mysql.1.gz 转载于:https://ww…

css实现3D立方体旋转特效

先来看运行后出来的效果 它是在不停运行的一个立方体 先来看html部分的代码 <div class"rect-wrap"> <!--舞台元素&#xff0c;设置perspective&#xff0c;让其子元素获得透视效果。--><div class"container"> <!-- 容器&#…

Eclipse中的Tomcat:6个流行的“如何”问题

学习新技术总是一个艰难的过程。 当您尝试学习将要相互交互的两种技术时&#xff0c;此过程将变得更加困难。 Tomcat和Eclipse是Java EE开发中最流行的先决条件。 因此&#xff0c;要成为一名专业的开发人员&#xff0c;您需要知道如何使用此对执行最需要的操作以及如何进行一些…

adc分辨率和精度的区别_科普 | 传感器的灵敏度、分辨率和精度三者之间有何区别?...

传感器作为一种检测装置&#xff0c;具有微型化、数字化、智能化、多功能化、系统化、网络化的特点。在现代工业生产尤其是自动化生产过程中&#xff0c;需要各种传感器来监视和控制生产过程中的各个参数&#xff0c;使设备工作在正常状态或最佳状态&#xff0c;并使产品达到最…

Node08 - 配置模板引擎 -(route)

1、配置模板引擎 &#xff08;01&#xff09;、输出什么东西        //view engine&#xff1a;视图模板引擎(以何种方式呈现给用户) > 指定输出html           server.set(view engine, html); &#xff08;02&#xff09;、模板文件放在哪 //views: 指定好…