jgroups传输消息_使用JGroups进行ElasticMQ消息复制

jgroups传输消息

ElasticMQ是一个消息服务器,具有Scala,Java和与Amazon SQS兼容的接口。 它通过跨服务器群集复制消息来支持有保证的消息传递,并通过日志记录实现消息持久性。
消息复制是ElasticMQ的核心功能之一。 但是,如果您看一下代码,则只有少数几个类,最长的类有76行(请记住,这是Scala,虽然;))。 这是因为ElasticMQ使用JGroups作为基础通信库。 JGroups已经很老了,特别是对于Java库而言-JGroups的第一版是在1999年(!)。 但是,它离过时和过时还差得很远–它具有一个不错的API,可以毫无问题地工作,拥有一个良好的社区。 并且因为任何Java库都可以与Scala很好地协作。
JGroups具有许多有用的功能:
  • 可靠的组播
  • 集群管理
  • 故障检测
  • 节点发现
  • 多年的性能改进
它们广泛用于在ElasticMQ中实施复制。 以下是其完成方式的摘要。
ElasticMQ集群如何工作?
在单个ElasticMQ集群中,一个节点始终是主节点。 您只能对此节点执行操作。 然后将每个操作的结果复制到其他成员。 有两种与阻止相关的选项; 复制可以是完全异步的,也可以等待直到至少一个或所有节点确认该操作。 为了确保在群集分区的情况下不会从不同的分区收到相同的消息,只有具有至少一半+1节点操作的分区处于活动状态。
ElasticMQ中的中心概念是消息存储。 存储器执行命令(例如发送消息命令,删除消息命令等)。 复制层只是任何其他存储的包装。 但是请注意,我们只能复制产生的存储突变(因此在执行命令后),而不是原始命令本身。 例如,如果命令是“接收消息”,则在每台计算机上执行该命令的结果可能会有所不同。 因此,如果接收到消息成功,我们仅复制消息可见性的更改(在ElasticMQ中,类似于Amazon SQS ,如果接收到消息,则在指定的时间段内阻止后续接收该消息)。 您可以在JGroupsReplicatedStorage中看到此基本逻辑。
初始化集群
但是,在我们进行复制本身之前,首先要做的是初始化集群。 这是在ReplicatedStorageConfigurator中完成的。 作为参数,我们需要一个JGroups配置文件,该文件是协议的堆栈。 您实际上并不需要知道每种协议的功能以及所有这些配置参数的含义。 最有用的两个是udp.xml和tcp.xml 。 如果您的网络中有多播,则应使用第一个;如果所有通信都应通过TCP(例如,在EC2上),则应使用第二个。 在后一种情况下,您还需要提供初始IP列表。 该列表不必详尽无遗,只需列出种子即可。
拥有协议栈,ElasticMQ创建一个JChannel并将其连接,这仅意味着连接到集群。 实际上,这就是使用JGroups创建集群所需要做的所有工作-非常简单,对吧? 正如您在ReplicatedStorageConfigurator的末尾看到的那样,连接之后的第一件事是对channel.getState(null,0)的调用。 这将转到当前的主节点(稍后会进行更多有关主节点选举),获取状态(当前的队列和消息)并将其应用于当前的节点(请参阅非常简单的JGroupsStateTransferMessageListener-处理发送和接收)。 这里有两点要注意。 首先,此传输不会阻止整个群集正常运行。 其次,如果在状态转移期间执行了某项操作,则该操作也会被复制。 因此,可能会在新节点上执行一次命令两次。 但这无关紧要,因为每个复制的命令都是幂等的,因此可以多次应用。 在其他情况下,必须实施某些应用程序侧机制以防止此类情况。
复制数据
最后,我们进入核心:复制命令。 在发送方,这由JGroupsReplicationMessageSender处理。 同样,这不是一个非常复杂的类。 它使用来自JGroups的MessageDispatcher “构建块”,除了在整个集群中对消息进行多重处理之外,还使您能够等待,直到指定数量的节点接收到它为止。 在接收方,我们有JGroupsRequestHandler 。 同样,非常简单。 收到消息后,它仅发送到存储。
集群管理
您可能还注意到SetMaster特殊消息。 用户需要此权限才能读取当前主节点的节点地址。 主选举(决定哪个节点是主节点)完全由JGroups处理。 JGroups中没有特定的算法来选举主节点,但是我们可以利用以下事实:每个节点都有相同的集群视图,由JGroups View类表示。 我们要做的只是从该列表中获取第一个(或最后一个或第3个,等等-只要在所有节点上都相同)即可,并将其设置为主节点。
群集视图由最后一个“核心”复制类JGroupsMembershipListener处理 。 那里发生了两件事。 每当新节点加入或离开集群时,都会调用viewAccepted回调。 每个具有View类的实例(很好,等于:))的节点。 主机在单独的线程中广播其地址(这是ElasticMQ服务器地址,而不是内部JGroups集群通信地址)。 在一个JGroups回调方法中执行阻塞操作是一个非常容易的错误。 您绝对不应该那样做,因为整个堆栈都可以锁定。 我们还需要FLUSH协议(该协议始终在集群设置期间添加); 此协议可确保在所有节点都安装新视图之前没有发送新消息,因此,我们确保新节点始终接收主信息。
成员资格侦听器还处理集群合并。 同样,JGroups为我们提供了合并分区的视图以及新的合并视图。 在ElasticMQ中,除了主分区(最大分区)以外的所有分区都请求状态转移,就像连接到集群之后一样。 这样,数据将保持一致状态。
加起来
还值得注意的是,使用ScalaTest对ElasticMQ的复制进行了全面测试。 每个测试都会创建一个内存存储集群,创建新节点或模拟节点崩溃。 请参见JGroupsReplicatedStorageTest类。
有了JGroups的机制,就可以轻松实现集群通信。 但是,与往常一样,您需要记住一些有关并发的陷阱(例如,新节点加入时可能会发生集群活动;分区和合并可能随时发生;正常消息和集群视图更改之间没有顺序) ;可以在状态转移期间发送消息;等等。 但是,JGroups 教程和手册都非常全面,并且得到了论坛的其他帮助(感谢Bela!),您应该一切顺利。
您可以通过下载ElasticMQ的独立发行版或以嵌入式方式运行它来尝试实践复制的工作方式。
参考:来自Adam Warski博客的Blog的 JCG合作伙伴 Adam Warski使用JGroups在ElasticMQ中实现消息复制 。

翻译自: https://www.javacodegeeks.com/2012/06/elasticmq-message-replication-with.html

jgroups传输消息

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

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

相关文章

使用 Element 组件搭建在线学习的课程卡片设计

假如我们要做一个在线课程学习的系统,其中我们需要做的一个功能就是课程信息流的一个展示,以等高卡片列表或者瀑布流的方式呈现。首先我们来罗列下这个卡片内应该包括哪些信息点:课程名称课程简介分类信息课程评分等级课程文件课时观看学习人…

12个很棒的Spring数据教程来启动您的数据项目

Spring Data的任务是为数据访问提供一个熟悉且一致的,基于Spring的编程模型,同时仍保留基础数据存储的特​​殊特征。 它使使用数据访问技术,关系和非关系数据库,map-reduce框架以及基于云的数据服务变得容易。 这是一个总括项目…

python多线程编程(3): 使用互斥锁同步线程

问题的提出 上一节的例子中,每个线程互相独立,相互之间没有任何关系。现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1。很容易写出这样的代码&am…

如何防止水印被恶意删除或者隐藏?

继上篇 Vue3 实现网页背景水印功能 我们了解了常见的网页水印功能是如何实现的,懂原理的都知道水印是通过在网页中添加代码绘制 DOM 元素覆盖在原有的网页上而来的,一旦你打开浏览器中的元素审查,可以通过删除元素或者在元素的样式上操作属性…

jmc线程转储_如何分析线程转储– IBM VM

jmc线程转储本文是我们的线程转储分析系列的第4部分,它将为您提供什么是IBM VM的JVM线程转储以及您将找到的不同线程和数据点的概述。 您将看到和学习​​到,IBM VM Thread Dump格式是不同的,但是提供了更多现成的故障排除数据。 在这一点上&…

Java 8:使用交替接口公开的类型安全地图生成器

动态展示您的课程 当我是Java新手时,我记得当时想过应该有一种方法可以删除或隐藏我不想公开的类中的方法。 就像用private方法或类似方法覆盖public方法一样(哪种情况是不可能的,也不应该是不可能的)。 显然,今天&…

nodejs面试题

1、为什么用Nodejs,它有哪些缺点? 事件驱动,通过闭包很容易实现客户端的生命活期。不用担心多线程,锁,并行计算的问题V8引擎速度非常快对于游戏来说,写一遍游戏逻辑代码,前端后端通用当然Nodejs也有一些缺点…

sts-bundle的使用_使用WS-Trust / STS采样器扩展JMeter

sts-bundle的使用JMeter没有对WS-Security或WS-Trust的任何内置支持,这使我为JMeter开发了此STS采样器–可以在负载测试STS时使任何人的生活变得更好。 首先,您需要拥有Apache JMeter发行版。 我正在使用v2.7。 然后,您可以从此处下载sts.sam…

001_jdk配置

配置JAVA_HOME,CLASSPATH,PATH 其中JAVA_HOME必须的 JAVA_HOMEE:\java\jdk1.8.0_77 CLASSPATH(告诉java程序运行时,你的类或者类库在哪里) .; E:\java\jdk1.8.0_77\lib\dt.jar;E:\java\jdk1.8.0_77\lib\tools.jar;E:\java\jdk1.8.0_77\jre\lib\rt.jar 改成变量 .;%J…

python -- join()

python -- join()pythonjoinos月似当时,人似当时否?总 在 python 中,一共有两个 join 方法,一个是 str.join(),另一个是 os.path.join() ,这里只了解前一种 str.join(iterable) 官方文档 Return a string which is the…

Spark数据倾斜解决方案(转)

本文转发自技术世界,原文链接 http://www.jasongj.com/spark/skew/ Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势 发表于 2017-02-28 | 更新于 2017-10-17 | 本文结合实例详细阐明了Spark数据倾斜的几种场景以及对应的解…

JavaParser入门:以编程方式分析Java代码

我最喜欢的事情之一是解析代码并对其执行自动操作。 因此,我开始为JavaParser做出贡献,并创建了两个相关项目: java-symbol-solver和Effectivejava 。 作为JavaParser的贡献者,我反复阅读了一些非常类似的问题,这些问…

GoldenGate Logdump基本使用

Logdump是GoldenGate复制软件中附带的一个工具软件,在OGG的目录下可以找到。这个工具主要用于分析OGG生成的队列文件,查找记录、统计队列文件中的数据等。 在OGG安装目录下执行logdump.exe or ./logdump即可进入命令行。 开始查找记录之前,先…

.bam.bai的意义_业务活动监视器(BAM)2.0带来的革命

.bam.bai的意义生产兼具精益和企业价值的中间件是一项艰巨的工作。 它要么不存在,要么需要创新的思维(很多),并且需要在实现中反复进行。 业务风险很大,但是如果您做对了,它就会使您领先于其他任何公司。 这…

数据结构和算法之排序五:选择排序

我们上一篇谈到了冒泡排序,其实我也说了,这两个排序方式何其相似,如果掌握了冒泡排序再来进行选择排序的理解我觉得完全没有太大的问题。那么什么叫做选择排序呢?我们可以理解为矮子里面挑高个,比如说呀有一个富翁来到…

Visual Studio Code使用问题

1、打开vscode黑屏 右击vscode快捷方式–>属性–>兼容性—>兼容模式打钩 重启vscode就可以了。 2、vscode终端没有显示路径,不能输入 显示如下图 则关闭VS Code ,右键单击VS Code 图标,选择属性->兼容性,取消勾选 已兼容模式运…

Java社区调查结果:74%的开发人员希望减少详细程度

一个新的JDK增强建议(JEP)在Java社区中风起云涌:JEP286。该建议建议在Java的未来版本中引入局部变量类型推断,以简化Java应用程序的编写。 在下面的文章中,我们将解释它的含义以及它将如何影响您的代码。 新帖&#…

coherence安装_Oracle Coherence:分布式数据管理

coherence安装本文介绍如何使用Oracle Coherence提供分布式(分区)数据管理。 在下面的示例应用程序中,创建了一个名为OTV的新集群,并且在该集群的两个成员之间分配了一个名为user-map的缓存对象。 二手技术: JDK 1.6.…

JavaFX技巧来节省内存! 属性和可观察物的阴影场

在 JavaFX的世界中, Properties API允许UI开发人员将值绑定到UI控件。 这种功能非常容易,但是当对象模型经常使用属性时,应用程序可能会很快耗尽内存。 我通常会编写两个单独的对象,例如pojo类和表示模型对象。 此技术通常在基于S…

如何在Hibernate Search 5.5.2 / Apache Lucene 5.4.x中处理停用词?

停用词,例如[“ a”,“ an”,“ and”,“ are”,“ as”,“ at”,“ be”,“ but”,“ by”,“ for”,“ if”,“在”,“成…