
Ehcache 集群改造-----增加手动发现方式自动增加减机器机制
读取配置文件中的RMI URL值,并存储在一个MAP中,键为URL,值为时间戳。 解析每个URL,提取IP地址和端口信息,存储在另一个MAP中,键为相同的索引值,值为SocketParam对象(包含IP和端口信息)。 RMI URL管理:通过读取properties文件中的RMI URL值,动态注册或反注册Peer Provider。 Socket连接测试:在轮询过程中,通过Java.net.Socket测试目标服务器的连接状态。如果连接成功,则注册Peer Provider;如果连接失败,则反注册Peer Provider。 心跳机制:通过不断测试连接状态,确保集群中的每个节点都能及时更新其状态,避免因网络问题或节点故障导致的缓存同步失败。 读取配置文件:通过@Value注解读取properties文件中的RMI URL值,确保配置文件中的值能够被动态读取和解析。 双重MAP存储:通过两个MAP分别存储URL和SocketParam对象,确保每个URL对应的IP和端口信息能够被快速查找和操作。 轮询机制:通过不死线程不断执行连接测试,确保集群中的每个节点都能及时更新其状态,避免因网络问题或节点故障导致的缓存同步失败。 异常处理:在连接测试过程中,通过try-catch块捕获异常并处理,确保即使出现连接问题,也能及时反注册Peer Provider,避免影响集群的稳定性。 加锁处理:由于MAP是线程安全的,需要确保在多线程环境下进行操作时加锁处理,避免并发操作带来的问题。 异常处理优化:进一步优化异常处理逻辑,确保在连接失败时能够快速反注册Peer Provider。 性能优化:通过优化连接测试的间隔时间和异常处理逻辑,进一步提升系统的运行效率和稳定性。
发布日期:2021-05-06 19:33:00
浏览次数:22
分类:精选文章
本文共 4068 字,大约阅读时间需要 13 分钟。
Ehcache RMI手动发现机制的优化与实现
在前一篇文章中,我们提到了Ehcache基于RMI手动发现集群的搭建方法。然而,传统的手动发现机制存在诸多限制,如无法动态增加机器、操作不够便捷等。因此,我们对Ehcache的机制进行了优化,引入了轮询功能,类似心跳机制,以实现对当前生效链接的监测和管理。
优化思路
Ehcache的手动发现机制在项目启动时,会读取XML配置文件的值,并将其存储在一个MAP中。具体操作如下:
这种双重MAP的设计确保了在URL解析和存储过程中,能够在一次操作中完成IP和端口信息的提取和处理,避免了重复操作,提高了效率。
实现细节
我们基于Ehcache提供的RMICacheManagerPeerProvider类,通过其注册和反注册方法来实现动态管理。具体实现如下:
代码实现
核心代码逻辑
import net.sf.ehcache.CacheManager;import net.sf.ehcache.distribution.RMICacheManagerPeerProvider;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Configuration;import java.net.Socket;import java.util.Map;@Configuration@PropertySource({"classpath:eh.properties"})public class RMIUrlsThread { @Value("${rmiurls}") private String rmiurls; private static final Mapurls = new HashMap<>(); private static final Map paramMap = new HashMap<>(); private static final String RMI_URLS = "rmiUrls"; private static Boolean flag = false; public void loadProps() { int key = 0; String[] split = rmiurls.split("\\|"); for (String s : split) { urls.put(key, s); String substring = s.substring(2); String[] splitS1 = substring.split("\\:"); String IP = splitS1[0]; String s2 = splitS1[1]; String[] s2Split = s2.split("\\/"); String port = s2Split[0]; SocketParam socketParam = new SocketParam(IP, Integer.parseInt(port)); paramMap.put(key, socketParam); key++; } } public void thread() { new Thread() { @Override public void run() { CacheManager cacheManager = EhcacheManager.getCacheManager(); Map cacheManagerPeerProviders = cacheManager.getCacheManagerPeerProviders(); cacheManagerPeerProviders.forEach((k, v) -> { RMICacheManagerPeerProvider provider = (RMICacheManagerPeerProvider) v; while (true) { urls.forEach((key, url) -> { SocketParam socketParam = paramMap.get(key); Socket socket = null; String IP = socketParam.getIp(); Integer port = socketParam.getPort(); try { socket = new Socket(IP, port); socket.close(); provider.registerPeer(url); } catch (Exception e) { provider.unregisterPeer(url); } }); System.out.println("执行一次"); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } } }); } }.start(); } public static void main(String[] args) { }}
关键点分析
优化效果
通过引入轮询机制,我们解决了传统手动发现机制的主要问题,即动态增加机器和操作不便等。现在,系统能够自动检测集群中每个节点的状态,并及时更新Peer Provider的注册信息,从而确保集群的高效运行。
后续工作
通过以上优化,我们的Ehcache RMI手动发现机制已能够更好地支持动态集群管理,减少了因网络问题或节点故障导致的缓存同步失败。