通过运行彼此相同的Java应用程序在同一网络内连接的两台可分离的计算机如何保持它们的状态的基本原理是什么?

我相信Terracotta可以完成此任务,但我不知道某些伪代码将如何描述其核心功能。

我只是想了解这种技术。

最佳答案

Terracotta DSO通过操纵您的类(以及JDK的类等)的字节码来工作。有关如何以及何时执行此操作的说明是Terracotta配置文件的一部分。

字节码修改查找某些字节码,例如字段读或写或监视器进入或退出。只要出现这些指令,就会在该位置周围添加代码,以在分布式存储中执行适当的操作。例如,当由于同步而获得监视器时,也会获得分布式锁定(它是读锁定还是写锁定取决于配置)。如果写入了共享库中的字段,则分布式系统必须验证是否持有写锁,然后将数据值发送到群集服务器,该群集服务器将其存储在磁盘上或酌情通过网络共享。

请注意,Terracotta不共享整个堆,仅共享配置指示的对象图。通常,共享整个堆毫无意义。相反,最好让应用程序描述整个分布式应用程序所需的域对象。

有许多优化措施可以使上述操作更加高效:仅通过有线方式发送字段增量,并且其格式要比Java序列化高效得多,可以 bundle 并批量发送许多增量,实际上,锁是“ check out ”到特定的客户端,因此,如果应用程序数据在客户端之间进行分区,则大多数分布式锁实际上是不涉及网络调用的本地操作等。

10-06 04:51