activemq消息持久化_ActiveMQ 5.x中的消息持久性

activemq消息持久化

我被问了很多关于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

activemq消息持久化

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

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

相关文章

【安卓开发 】Android初级开发(十一)Android中多线程

线程的创建 1.创建一个Thread类,或者创建一个Thread子的对象; 2.创建一个Runnable接口的类对象; 传入Runnable对象创建线程 package com.sina.baode;import android.util.Log;/** 自定义一个继承于Runnable*/public class DemoThread implements Run…

td 内单选框不可用_在TD,我和曾经的老师变成了同事,也收获了最满意的“课外活动”...

早就想找个时间好好写一篇文章记录一下我在TD的学习工作经历了,同时表达一下我对TD深深的爱和感谢。一、结缘TD一年前,我第一次报了TD的AP环境科学寒假班。由于当时我在冲刺三月的SAT,整个寒假我一心扑在了SAT上,没来得及听TD的直…

activiti脚本任务_Activiti中的安全脚本如何工作

activiti脚本任务最近的Activiti 5.21.0版本的突出特点之一是“安全脚本”。 Activiti用户指南中详细介绍了启用和使用此功能的方法 。 在这篇文章中,我将向您展示我们如何实现其最终实现以及它在幕后所做的事情。 当然,因为这是我通常的签名风格&#x…

C++ 11 深度学习(八)重定义override

1.动态联编&#xff0c;本质是在运行时多态的表现。 2.其本质是因为维护了一张虚函数表&#xff0c;虚函数表以链表的形式存在。每个结点存储了对象指针的地址&#xff0c;通过一个指针进行遍历索引。 #include <iostream> #include <armadillo> using namespace …

逻辑回归模型_联邦学习体系下——逻辑回归模型

联邦学习的体系我们在前期介绍过&#xff0c;这里我们简单回顾一下纵向联邦学习的定义&#xff1a;在两个数据集的用户重叠较多而用户特征重叠较少的情况下&#xff0c;将数据集按照纵向 (即特征维度)切分&#xff0c;并取出双方用户相同而用户特征不完全相同的那部分数据进行训…

C++ 11 深度学习(九)C++文件IO

1.将数据写入文件 #include <iostream> #include <fstream> using namespace std;int main() {ofstream p1;p1.open("outfile.txt");p1 << "向文件写入信息" << endl;p1.close();return 0; } 2.将数据从文件中读出 #inclu…

plsql例外_大例外背后的真相

plsql例外异常可能是最被滥用的Java语言功能。 这就是为什么 让我们打破一些神话。 没有牙仙子。 圣诞老人不是真实的。 TODO评论。 finalfinalversion-final.pdf。 无皂肥皂。 而且…例外实际上是例外。 后者可能需要更多说服力&#xff0c;但是我们可以帮助您。 在这篇文章…

滴滴java开发面试题_Java开发经典面试题(十二)

好久没有来更新我的面试题了&#xff0c;不知道关注我的小伙伴有没有失联啊&#xff1f;&#xff01;呼叫&#xff01;好了开始我们今天的正题分享&#xff01;1、如何从FutureTask不阻塞获取结果get(long timeout,TimeUnit unit)&#xff0c;超时则返回轮询&#xff0c;先通过…

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

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

apache spark_Apache Spark软件包,从XML到JSON

apache sparkApache Spark社区为扩展Spark付出了很多努力。 最近&#xff0c;我们希望将XML数据集转换为更易于查询的内容。 我们主要对每天进行的数十亿笔交易之上的数据探索感兴趣。 XML是一种众所周知的格式&#xff0c;但是有时使用起来可能很复杂。 例如&#xff0c;在Apa…

【OpenGL从入门到精通(七)】OpenGL中的数学

1.向量单位化 2.三维向量点乘/点积&#xff08;结果为标量&#xff09; 3.三维向量叉乘&#xff08;叉积&#xff09;结果为向量 3.坐标平移 因为在OpenGL中使用的都是齐次坐标&#xff0c;即x , y , z , w 如果使得点(0, 0, 0) 平移到(1, 2, 3)位置。将坐标表示为矩阵的形式&…

javafx窗体程序_JavaFX实际应用程序:SkedPal

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

kafka 发布订阅_在Kafka中发布订阅模型

kafka 发布订阅这是第四个柱中的一系列关于同步客户端集成与异步系统&#xff08; 1&#xff0c; 2&#xff0c; 3 &#xff09;。 在这里&#xff0c;我们将尝试了解Kafka的工作方式&#xff0c;以便正确利用其发布-订阅实现。 卡夫卡概念 根据官方文件 &#xff1a; Kafka是…

apache camel_使用Apache Camel进行负载平衡

apache camel在此示例中&#xff0c;我们将向您展示如何使用Apache Camel作为系统的负载平衡器。 在计算机世界中&#xff0c;负载平衡器是一种充当反向代理并在许多服务器之间分配网络或应用程序流量的设备。 负载平衡器用于增加容量&#xff08;并发用户&#xff09;和应用程…

lombok 自动使用_Lombok,自动值和不可变项

lombok 自动使用我喜欢布兰登&#xff08;Brandon &#xff09;在博客文章中比较Project Lombok &#xff0c; AutoValue和Immutables的建议 &#xff0c;而这篇文章试图做到这一点。 我已经简要概述了Project Lombok &#xff0c; AutoValue和Immutables &#xff0c;但是这篇…

邮箱批量登录接验证码_记一次莫名的需求(临时邮箱|企业邮箱)

目录&#xff1a;前言行情伪需求过程1.前戏2.买域名3.网易企业邮箱4.模糊的需求5.晚饭后6.临时邮箱16.临时邮箱27.域名版临时邮箱8.遇见问题8.1.DNSPOD8.2.换种思路拓展1.思路2.后续2.1.简单2.2.自建临时邮箱后话记一次需求不明的亏看完这篇文章你会学到&#xff1a; 免费企业邮…

java 补充日期_Java 9对可选的补充

java 补充日期哇&#xff0c;人们真的对Java 9对Stream API的添加感兴趣。 想要更多&#xff1f; 让我们看一下…… 可选的 可选::流 无需解释&#xff1a; Stream<T> stream();想到的第一个词是&#xff1a; 终于 &#xff01; 最后&#xff0c;我们可以轻松地从可选…

【Python科学计算系列】行列式

1.二元线性方程组求解 import numpy as np a np.array([[3, -2], [2, 1]]) b np.array([12, 1]) d np.linalg.solve(a, b) print(d) 2.三阶行列式求值 import numpy as np a np.array([[1, 2, -4], [-2, 2, 1], [-3, 4, -2]]) d np.linalg.det(a) print(d) 3.行列式的余…

【Python科学计算系列】矩阵

1.矩阵的幂计算&#xff08;设计思想&#xff1a;递归&#xff09; #!/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np def matrixPow(Matrix,n):if(type(Matrix)list):Matrixnp.array(Matrix)if(n1):return Matrixelse:return np.matmul(Matrix,matrixPow(…

swarm 本地管理远程_带有WildFly Swarm的远程JMS

swarm 本地管理远程我再次在博客中谈论WildFly群&#xff1f; 简短的版本是&#xff1a;我需要对远程JMS访问进行测试&#xff0c;并且拒绝设置复杂的功能&#xff08;如完整的应用程序服务器&#xff09;。 这个想法是要有一个简单的WildFly Swarm应用程序&#xff0c;该应用程…