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 组件搭建在线学习的课程卡片设计

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

MySQL多种安装方式选择

1.rpm包安装方式 rpm包的安装方式非常简单,这里以el6平台下的mysql-5.6.34版本为例,首先,要通过上述搜狐镜像地址下载到如下四个MySQL相关软件安装包。 a.下载安装包 MySQL-client-5.6.34-1.el6.x86_64.rpm MySQL-devel-5.6.34-1.el6.x86_64.…

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 lock

多线程访问同一个变量,不进行同步,会造成结果不一致。这里解决方案有很多,使用原子变量。加锁同步,使用synchronized同步。下面是一个lock demo,后面会分析lock实现原理。lock使用的是公平锁还是非公平锁等 import jav…

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…

Spring MVC 4快速入门Maven原型得到了改进–更多Java 8功能

对于所有有兴趣在没有Spring Boot的情况下快速引导Spring 4应用程序的开发人员,请检查刚刚更新的我的Spring MVC 4 Quickstart Maven原型。 原型已经将Java 8用作目标平台已有一段时间了,但是不支持特定的Java 8功能。 最近的更改带来了Thymeleaf&#x…

python -- join()

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

easymock教程_EasyMock教程–入门

easymock教程在本文中,我将向您展示EasyMock是什么,以及如何使用它来测试Java应用程序。 为此,我将创建一个简单的Portfolio应用程序,并使用JUnit&EasyMock库对其进行测试。 在开始之前,让我们首先了解使用…

python 函数、面向对象

一、函数 1、定义个函数,可以对输入的数据进行排序, 通过参数来决定是正向排序还是反向排序。 number input(请输入一串数字:) number_list list(number) def sort_number(*args, s0): if s 0: number_map map(int,args)result sorted…

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的贡献者,我反复阅读了一些非常类似的问题,这些问…

python Django基本介绍

创建Django项目并运行 实验环境: Ubuntu 16.04下安装好Anaconda3 Windows下安装好PyCharm 实验步骤 一、创建django工程 在Ubuntu 16.04下执行下面的命令。 (1)创建一个python3的虚拟环境(如果已经创建,忽略此步&…

Android 热补丁动态修复框架小结

Android 热补丁动态修复框架小结转载于:https://www.cnblogs.com/zhujiabin/p/7923233.html

C语言中关于结构体的理解

在c语言中我们如果需要去表示一个学生的特征,例如名字年龄成绩,这些信息我们就需要用到结构体来描述了。 struct stu{char name[20]; //姓名int age; //年龄float score; //成绩 }; struct(结构体):是由一系列具有相同类型…