原文地址:openfire 集群原理说明作者:大海巨浪 openfire,做为一个实现xmpp的即时通信服务器端,自身提供了集群的实现,目前,理论上,能支持N个节点的集群,即节点无限制
看了下他集群的实现,他是用到了oracle 的coherence的中间件,关于coherence的话,没有过多研究,大概知道,他是一个缓存中间件,支持缓存集群,而且支持缓存改变事件触发!知道这些就够了,这些就能用来理解openfire集群的原理了 coherence集群开启以后,会为每一个节点生成一个唯一的nodeID,openfire就是使用这个nodeId,来区分当前缓存中对应的Presence,Message等是属于哪一个节点!openfire集群大概工作过程如下: 1,切换缓存实现,这时,缓存层会有其默认的本地缓存,切换到coherence缓存!通过其定义的策略接口,完成这一切换!当然此时,openfire实现的时候,又定义了一个变量用来继续保持本地缓存的实现实例,以便于在openfire的控制台上能再次将缓存层切换为本地缓存。见类 ClusteringPlugin中的代码实现 2,开启coherence集群,这块需要简单了解下coherence集群的使用,具体的可以百度一下!代码见类CoherenceClusteredCacheFactory中的startCluster方法!其中有一段代码,是判断当前最大支持多少个节点!这块以前可能jive打算,集群插件是收费的,所有加了这段代码,不过开源之后,这块就没啥用了,可以直接删除了,都没问题 3,添加member节点事件监听,添加缓存内容监听!代码见类CoherenceClusteredCacheFactory中的startCluster方法。member监听的话,可以监听到当前coherence集群中,有多少个节点,是否有新节点加入或有节点退出等。 下面重点来了,他如果实现,节点a中的用户向节点b中的用户发信息的呢。 首先,我们追踪类 RoutingTableImpl 中的 RoutingTableImpl 方法,看其中一段代码: // This is a route to a local user hosted in other node if (remotePacketRouter != null) { routed = remotePacketRouter .routePacket(clientRoute.getNodeID().toByteArray(), jid, packet); } 就是这段代码,他调用了remotePacketRouter类中的route方法,继续追这个方法的实现类 CoherencePacketRouter 中的方法,有如下实现 CacheFactory.doClusterTask(new RemotePacketExecution(receipient, packet), nodeID); 对,重点就在标红的部分,doClusterTask 我们看他的实现 CoherenceClusteredCacheFactory类中的doClusterTask(final ClusterTask task, byte[] nodeID) 方法 Set setMembers = taskService.getInfo().getServiceMembers(); // Remove all members except requested nodeID for (Iterator it=setMembers.iterator(); it.hasNext();) { Member member = (Member) it.next(); if (!Arrays.equals(member.getUid().toByteArray(), nodeID)) { it.remove(); } } // Check that the requested member was found if (!setMembers.isEmpty()) { // Asynchronously execute the task. taskService.execute(buildInvocable(task), setMembers, null); return true; } 这里,他获得的coherence集群中的所有节点集合,并将非指定nodeID的所有节点移除,并在指定的节点执行了一个任务,task,即ClusterTask接口的实现类 最下面,我标红的部分,就是在指定node上执行指定任务的代码,但里面传的参数是一个Invocable实现,这个是coherence定义的接口。看 buildInvocable 做了哪些工作,看代码: private static Invocable buildInvocable(final ClusterTask task) { return new AbstractInvocable() { public void run() { task.run(); } public Object getResult() { return task.getResult(); } }; } 很简单,这个实现,把openfire定义的ClusterTask包装成了一个Invocable ,这样就可以使用coherence提供的方法,在指定节点上,执行ClusterTask中run的部分 说过了原理部分,我们找一个ClusterTask的实现,看看如何实现的在集群上发送信息 BroadcastMessage 类中的run方法,如下: public void run() { // Broadcast message to client sessions connected to this node XMPPServer.getInstance().getRoutingTable().broadcastPacket(packet, true); } 对,就一行代码,调用本地的RoutingTable,去直接发送信息!重点是,这个代码,不是在本地执行的,而是在指定节点上执行的!
- 大小: 26.9 KB
分享到:
相关推荐
"openfire集群jar包"就是用于实现这一目的的关键组件。 集群化部署Openfire可以带来以下优势: 1. **负载均衡**:通过将用户分发到不同的服务器节点,避免单点过载,提高系统整体性能。 2. **高可用性**:当某一台...
亲测可行的openfire集群实践手册,适合使用openfire做即时通讯方案的工程师做集群方案
下面将详细介绍如何正确配置Openfire集群。 一、准备工作 在配置Openfire集群之前,你需要确保以下几点: 1. 硬件环境:至少两台或多台服务器,每台服务器性能应满足Openfire的基础运行需求。 2. 操作系统:支持...
在构建高可用性Openfire集群时,我们需要确保正确安装和配置一系列关键插件,以实现负载均衡、数据同步以及故障转移等功能。下面将详细介绍在搭建Openfire集群时可能需要的插件及其作用。 1. **Cluster Plugin**: ...
在提供的信息中,提到了四个关键的jar包,它们在Openfire集群部署中扮演着至关重要的角色。 1. coherence.jar:这是Oracle Coherence的主库文件,Coherence是一款分布式数据管理和缓存平台,用于提供高性能、高可用...
在openfire集群中,Oracle Coherence扮演着关键角色,为集群提供高效的数据共享和一致性保证,确保在多节点环境下数据的一致性和可用性。 Openfire 是一个开源的即时通讯服务器,它基于XMPP(Extensible Messaging ...
openfire本身并不支持集群部署,需要通过插件来扩展。因为openfire采用的协议很多,运行时打开端口也很多,所以做负载均衡时也是个很大的挑战。 本方案采用Openfire的Hazelcast插件进行集群部署,采用Haproxy进行...
提供1.3和2.0两个版本插件,分别支持openfire3.9.1以上和3.9.3以上的版本。具体的openfire集群配置请参看考:http://blog.csdn.net/jimoshazhouleng360/article/details/44651177
openfire 集群cluster需要用到的jar包,网上不太好找了,亲测openfire3.7.1版本完全可用,效果很好比较稳定
openfire集群用到的 Oracle Coherence很难找到 Coherence是Oracle为了建立一种高可靠和高扩展集群计算的一个关键部件,集群指的是多于一个应用服务器参与到运算里。Coherence的主要用途是共享一个应用的对象(主要是...
NULL 博文链接:https://chungang.iteye.com/blog/1631878
openfire集群插件包,clustering.jar(1.2.1)
通过以上分析,我们可以看到Openfire集群源码分析涉及的主要知识点包括Openfire的基本架构、XMPP协议、分布式计算的CAP理论、集群数据同步策略以及缓存设计与管理。这些内容对于理解Openfire如何在大规模部署中保证...
在Openfire集群中,Coherence-Work可能用于协调不同节点之间的任务分配,例如用户登录、消息广播等操作,确保这些任务在集群中均匀分布,避免某个节点过载。通过这种方式,Coherence-Work帮助优化资源利用,提高整体...
OpenFire 使用 HazelCast 集群 OpenFire 是一款流行的即时通信服务器软件,而 HazelCast 是一个高性能的分布式内存数据网格。OpenFire 使用 HazelCast 集群可以提高系统的可扩展性和高可用性。本文将从集群概念、两...
Openfire3.10.2集群配置,图文详细描述
openfire + zookeeper实现服务器分布式 集群功能
1. 集群部署:通过集群部署,可以实现Openfire的负载均衡和高可用性,提高服务的稳定性和性能。 2. 数据库复制:在集群环境中,数据库的同步和一致性至关重要,了解并配置数据库复制策略是必要的。 五、Openfire与...