ActiveMQ 5.x中的消息持久性

我被问了很多关于ActiveMQ如何存储消息(或在某些情况下不存储)的基本知识。 这是它的高级解释。 注意,上下文在JMS中。 如果您使用ActiveMQ的非JMS客户端(即STOMP,AMQP,MQTT等),则在某些情况下行为可能有所不同。

ActiveMQ

在不丢失标记为“持久”的消息方面,JMS持久性保证非常强大。 让我们看看它如何适用于ActiveMQ

主题

主题是一种广播机制。 它们使我们能够在JMS领域中实现发布-订阅语义。 但是,如果我们将消息标记为“持久”并且没有订阅者,会发生什么情况? 在任何普通广播中(即,我去市区并开始大喊ActiveMQ的出色表现),如果没有订阅者(3a,周围没有人听到我的声音……)如果我不在,一定是一个美好的夜晚在3a)会发生什么? 没有。 没有人听到。 然后我们继续前进。 如果您发布消息(持久的或非持久的),并且没有订阅者(没有活动的订阅者和持久的订阅者),ActiveMQ不会对其进行任何处理。

ActiveMQ仅在持久订户(活动或不活动)的情况下存储消息。 对于非活动的持久订阅,ActiveMQ会将标记为“持久”的消息存储到非易失性存储中,并等待订阅者重新加入订阅。 届时它将尝试传递消息。

Queue列

对于队列,ActiveMQ使用简单的默认协议来处理“持久”消息。 我们基本上阻止了主要生产者线程,并等待确认经纪人实际上已收到消息:

制片人:

  • 生产者发送消息
  • 生产者阻止,等待来自代理的ACK
    • 如果成功确认,生产者继续

经纪人:

  • 收到消息
  • 将消息存储到磁盘
  • 发回ACK

持久性

对于“非持久”发送,流程是不同的。 我们以“即发即弃”模式发送邮件。 主生产者线程不会被阻塞,并且在ActiveMQ连接传输线程上异步发生任何ACK或其他响应:

  • 生产者发送消息
  • 生产者继续其线程并且不阻塞
  • 生产者最终在与主生产者线程不同的单独线程上获得ACK
    • 如果失败,则客户端可以订阅JMS ExceptionListener以获得通知

非持久性

交易发送?

通过批量处理多个消息以一次发送,我们可以提高发送给代理的性能。 这样可以更有效地利用网络以及代理存储。 发送交易时,您必须意识到一个重要的区别。 TX会话的打开和关闭(回滚/提交)都是与代理的同步交互, 但是 ,TX窗口中每个消息的发送都是异步发送的。 如果一切正常,这是可以的,因为代理将这些消息分批处理。 但是,如果有运输错误怎么办? 还是代理用完了空间来保存这些消息?

我们需要设置一个ExceptionListener来监视这些发送期间的错误。 我们还需要(或应该)设置一个客户端发送“生产者窗口”,以允许我们在经纪人资源耗尽时实施生产者流控制。 有关更多信息,请参见ActiveMQ生产者流控制 。

amq-tx发送

更改默认值

生产者上有趣的设置,可以更改以下行为:

  • 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.html

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

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

相关文章

5.报错:ImportError: No module named win32api

pip install pypiwin32即可 转载于:https://www.cnblogs.com/caimuqing/p/9016190.html

bind1st bind2nd的使用

bind1st bind2nd的使用 Posted on 2010-07-16 09:14 wanpengcoder 阅读(1882) 评论(0) 编辑 收藏 bind1st和bind2nd函数用于将一个二元算子(binary functor,bf)转换成一元算子(unary functor,uf)。为了达到…

一个select元素自定义设计的新思路:appearance: none之后利用符号制造小箭头

最近工作时解决了一个前端小问题(如下图所示):在Safari中,select的控件之上有不和谐的灰色部分。 刚开始时我以为是backgrand或是border设置不当之类产生的问题,在搜索了很久之后终于找到了问题所在:这个灰…

调整HashMap的大小:未来的危险

最近,我偶然发现了一个错误,该错误是由于多个线程对java.util.HashMap的使用不当引起的。 该错误是抽象泄漏的一个很好的例子。 只有了解数据结构的实现级别详细信息,才能帮助我解决当前的问题。 因此,我希望分享我所面临的问题将…

别的程序员是怎么读你的简历的

别的程序员是怎么读你的简历的 2009年11月9日 陈皓 下面这个图片来源国外,是一个关于程序员面试时的简历,被人事部门和程序员本身评审的角度不同的图片。当然,这是一个从国外面试的视角制作的图片,不过,可以看出&#…

漫谈C++重载运算符

漫谈C重载运算符 1.前置运算符和后置运算符,左值和右值 其实很久以来一直都没有怎么搞清楚左值和右值的区别,只知道左值可以放在等号的左边,也可以放在等号的右边,但是右值却只能放在等号的右边,然后形成一个大概直观…

Zabbix linux agent 安装

系统:Linux Centos 7.3 x64 服务:Zabbix_agent 3.0.16 一.安装Zabbix_agent 服务 1.安装zabbix 3.0 yum源 rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm 2.安装Zabbix_agent yum install zabbix-agen…

io和nio的缓冲_IO与NIO –中断,超时和缓冲区

io和nio的缓冲假设有一个系统有时需要将文件复制到几个位置,但是这种方式在响应能力至关重要的情况下。 换句话说,如果由于某种原因文件系统过载,而我们无法在不到一秒钟的时间内写入文件,它应该放弃。 ExecutorService是一项非常…

直接在apk中添加资源的研究

原文 http://blog.votzone.com/2018/05/12/apk-merge.html 之前接手过一个sdk的开发工作,在开发过程中有一个很重要的点就是尽量使用代码来创建控件,资源文件最好放到assets目录下,如果必须使用res资源,需要通过 getResources().g…

强制类型转换简介

强制类型转换简介 强制类型转换当操作数的类型不同,而且不属于基本数据类型时,经常需要强制类型转换,将操作数转化为所需要的类型。强制类型转换具有两种形式,称为显式强制转换和隐式强制类型转换。强制类型转换不改变原来数据的类…

JavaFX实际应用程序:SkedPal

“真实世界的应用程序”系列中的一个新条目。 这次是SkedPal ,这是一个用于智能管理忙人生活的应用程序。 我一直在咨询SkedPal团队有关JavaFX的事宜,并且在他们决定开始使用我的CalendarFX框架来满足他们的日历要求时,我也在咨询他们。 在下…

url 特殊字符 传递参数解决方法

url 特殊字符 传递参数解决方法 有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了。下表中列出了一些URL特殊符号及编码。十六进制值 1. URL 中号表示空格 %2B 2. 空格 URL中的空格可以用号或者编码 %20 3.…

chromium之histogram.h

histogram不知道是干啥的 // Histogram is an object that aggregates statistics, and can summarize them in // various forms, including ASCII graphical, HTML, and numerically (as a // vector of numbers corresponding to each of the aggregating buckets). google翻…

Java中的功能性FizzBu​​zz Kata

不久前,我使用Java 8流和lambda解决了FizzBu​​zz kata问题。 尽管最终结果是可行的,但中间步骤却没有。 我当然可以做得更好。 与往常一样,让我们​​从失败的测试开始: package remonsinnema.blog.fizzbuzz;import static or…

axis2 wsdl2java 使用方式

axis2 wsdl2java 使用方式(2011-04-15 22:41:43) 说明见:http://hi.baidu.com/aotori/blog/item/ee98efcdc6cc300301e92814.html 用wsdl2java简化客户端的编写 也许有很多读者会说“有没有搞错啊,只调用两个WebService方法用要写这么多代码,…

电脑播放视频的时候有杂音

一开始我还以为是视频本身自带的杂音,但是换了一个其它视频播放测试了一下,发现还是一样的结果。不甘心,又播放了一个音频,结果还是有杂音。 于是想是不是无意中把驱动卸载了,于是下载了驱动精灵补驱动。下载安装之后驱…

Axis2错误

Axis2错误 www.MyException.Cn 发布于:2012-09-18 16:21:42 浏览:70次 Axis2异常异常:java.lang.NoClassDefFoundError: org/apache/neethi/PolicyComponent 缺少:neethi-2.0.4.jar 异常:java.lang.ClassNotFound…

viewobject_只读ViewObject和声明性SQL模式

viewobject介绍 声明式SQL模式被认为是基于实体的视图对象的最有价值的优点之一。 在这种模式下,根据UI中显示的属性在运行时生成VOSQL。 例如,如果某个页面包含一个只有两列EmployeeId和FirstName的表,则查询将生成为“从Employees中选择Emp…

vue数组中对象属性变化页面不渲染问题

问题引入 Vue之所以能够监听Model状态的变化&#xff0c;是因为JavaScript语言本身提供了Proxy或者Object.observe()机制来监听对象状态的变化。但是&#xff0c;对于数组元素的赋值&#xff0c;却没有办法直接监听。 因此&#xff0c;如果我们直接对数组元素赋值 <ul>&l…

webservice生成客户端的方法

2011-11-09 20:33 webservice生成客户端的方法 目前为止webservice生成客户端方法比较多&#xff0c;我本身使用的主要有三种方式&#xff1a; &#xff08;1&#xff09;使用eclipse自带。 file->new->other->web services->web service client PS:这种方式生成的…