2.2. 分布式缓存
数据网格会尝试将缓存中任何条目的固定副本数配置为 numOwners。这允许分布式缓存线性扩展,在节点添加到集群中时存储更多数据。
当节点加入并离开集群时,当键超过 numOwners 的副本时,会出现一些时间。特别是,如果 numOwners 节点保留了快速成功,则一些条目将会丢失,因此,分布式缓存容许 numOwners - 1 个节点失败。
复制次数代表性能和数据持久性之间的利弊。您维护的副本数越多,较低性能也会降低因为服务器或网络故障而丢失数据的风险。
数据网格将密钥的所有者拆分为一个 主要所有者,后者协调对密钥的写入,以及零个或多个 备份所有者。
下图显示了客户端发送到备份所有者的写入操作。在这种情况下,备份节点会将写操作转发到主所有者,然后将写入复制到备份。
图 2.2. 集群复制

图 2.3. 分布式缓存

读取操作
读取操作从主所有者请求值。如果主所有者在合理的时间内没有响应,Data Grid 也从备份所有者请求值。
如果本地缓存中存在密钥,读取操作可能需要 0 信息,如果所有所有者都很慢,则读取操作可能需要最多 2 * numOwners 信息。
写操作
写入操作最多为 2 * numOwners 信息。从原始机构到主所有者和 numOwners - 1 信息(从主到备份节点)的消息以及相应的确认信息。
缓存拓扑更改可能会导致重试和写入操作的额外信息。
同步或异步复制
不建议使用异步复制,因为它可能会丢失更新。除了丢失更新外,异步分布式缓存还会在线程写入密钥时看到过时的值,然后立即读取相同的密钥。
Transactions
事务性分布式缓存仅将锁定/准备/过量消息发送到受影响的节点,这意味着所有拥有对事务影响的键的节点。作为优化,如果事务写入一个密钥,并且原始器是密钥的主所有者,则不会复制锁定消息。
2.2.1. 读取一致性
即使使用同步复制,分布式缓存也不是线性化的。对于事务缓存,不支持序列化/快照隔离。
例如,线程会执行一个请求:
cache.get(k) -> v1 cache.put(k, v2) cache.get(k) -> v2
但是,另一个线程可能会以不同的顺序看到值:
cache.get(k) -> v2 cache.get(k) -> v1
其原因在于,读取可以从任何所有者返回值,具体根据主所有者回复速度。写入不是在所有所有者中原子的。实际上,仅在从备份收到确认后更新的主要提交。在 primary 正在等待备份的确认消息时,从备份中读取时将看到新值,但从主中读取内容将看到旧信息。