两台机器之间的 JVM 堆复制
2022-09-01 11:02:46
在运行相同 Java 应用程序的同一网络中连接的两台可分离计算机如何通过彼此之间的堆同步来保持相同状态的基本原则是什么?
我相信Terracotta可以完成这项任务,但我不知道一些伪代码会如何描述它的核心功能。
我只是在寻找对这项技术的理解。
在运行相同 Java 应用程序的同一网络中连接的两台可分离计算机如何通过彼此之间的堆同步来保持相同状态的基本原则是什么?
我相信Terracotta可以完成这项任务,但我不知道一些伪代码会如何描述它的核心功能。
我只是在寻找对这项技术的理解。
Terracotta DSO的工作原理是操作类(以及JDK的类等)的字节代码。有关如何以及何时执行此操作的说明是兵马俑配置文件的一部分。
字节码修改会查找某些字节码,例如读取或写入字段或监视器进入或退出。每当出现这些指令时,都会在该位置周围添加代码,以便在分布式存储区中执行适当的操作。例如,当由于同步而获得监视器时,也会获得分布式锁(它是读锁还是写锁取决于配置)。如果写入了共享对象中的字段,则分布式系统必须验证是否持有写锁定,然后将数据值发送到群集服务器,群集服务器将其存储在磁盘上或根据需要通过网络共享。
请注意,Terracotta 不共享整个堆,只共享配置所指示的对象图。通常,共享整个堆没有多大意义。相反,应用程序最好描述分布式应用程序中所需的域对象。
有许多优化措施可以使上述操作高效:只有字段增量通过网络发送,并且比Java序列化更有效,许多增量可以捆绑并批量发送,锁实际上被“签出”到特定的客户端,以便如果应用程序数据跨客户端分区, 大多数分布式锁实际上是不涉及网络调用等的本地操作。
Terracotta确实可以处理,如果你告诉它 - 参见其DSO的描述 - 分布式共享对象。
这听起来很酷,但我更喜欢像EHcache这样的东西(可以再次由Terracotta支持),它的功能更高一些。