在 Chronicle 地图上执行操作的观察者模式

Observer Pattern for operations performed on Chronicle Map

我期待将 Chronicle Map 用作 datastore/data 缓存并打算与其他 JVM 进程共享它 运行 在同一个盒子上以减少每个其他 JVM 进程的内存占用否则每个 JVM 进程将加载相同的数据。每当从数据存储中添加或删除条目时,是否可以在每个 JVM 进程上获得通知?它真的会减少内存占用吗?因为,每个 JVM 进程无论如何都会创建一些域对象。

我查看了 API 和文档,但我不太清楚如何实现我的用例。 MapMethods 和 remoteOperations 最接近它,也许是要走的路。我想知道获得预期功能的正确方法是什么,或者我偏离了方向。

如果我在正确的轨道上,那么,我猜测 mapMethods/remoteOperations 只需要在观察者端提供,而不是在主数据存储上提供。我说得对吗?

Is it really going to reduce the memory footprint? Because, each JVM process anyway going to create some domain objects.

是的,是的。首先,您可以使用享元模式来避免实际 serialization/deserialization 并直接访问堆外内存,请参阅 example in the Chronicle Map tutorial and Chronicle Values.

但是即使您发现这不可能实现或实现起来太复杂,您也可以在反序列化对象时重用对象以在 JVM 中访问它们,方法是 map.getUsing(),或者更好的是 inside context sections,其中对象重用是自动的(如果值类型序列化程序确实允许重用对象)。

但是即使你不能重用值对象,e。 G。因为它们像 String 一样是不可变的,反序列化堆外内存时创建的对象很可能是短暂的,不会从年轻代提升,GC 将有效地收集它们,您将有效地重用内存.而如果您有每个 JVM 映射,则每个副本都永久驻留在内存中,不会重复使用。

所以在任何情况下,在 JVM 之间共享 Chronicle Map 对机器的整体内存使用和性能都是一件好事。

Is it possible to get notification on each JVM process whenever an entry is added or deleted from the datastore?

开源版本不可能开箱即用。有可能order这样的功能。你提到的 remoteOperations 也是一样,这个特性不再在开源支持中。然而,remoteOperations 并不是您所需要的。

编辑 请注意,根据您的吞吐量要求和更新频率,您可以通过将对 Chronicle Map 所做的更新复制到 Chronicle Queue or Aeron IPC 之类的多播 IPC,然后在其他 JVM 中读取它们来相对轻松地自行实现。您可以只复制更新的键,不复制值。

此解决方案可能比 Chronicle Map 可以提供的解决方案更糟糕(甚至无法正常工作)"natively",如果您的地图更新频率如此之高(每秒更新数十万次及以上)以至于您无法真正处理所有更新,并且希望通过在已经对同一键进行更新时忘记对某些键的陈旧更新来自然地限制事件。但在你的情况下,这可能根本不需要。

MapMethods and remoteOperations came closest to it and maybe, the way to go. I want to know what's the right way to get the intended functionality or am I way off.

MapMethods 的目标很窄——使用 Chroncile Map 的上下文和较低级别的操作覆盖 Map 方法的默认实现。它与远程通信、事件和监听毫无共同之处。您可以覆盖 MapMethods.put() e。 G。添加一些日志记录或事件通知,但您可以在每次调用 chronicleMap.put() 后通过日志记录或通知来完成此操作,结果几乎相同。

RemoteOperations 允许重新定义当某个节点上的条目 put/removed/updated 并且此事件到达另一个节点时应该发生的操作。默认情况下,事件在接收方节点上重新播放,如果它的时间戳晚于接收方节点中事件密钥的条目的最后更新时间戳,即。 e. "last write wins"。但它可以被覆盖以定义不同的策略,i。 e.如果该值包含一些计数,则写入计数最高的值。