10.11. 基于密钥的重新哈希感知 operator
迭代器、分割 器和每个 操作都与其他终端运算符不同,因为重新哈希感知必须跟踪每个片段已处理哪些键,而不是只是网段。这是为了保证一次(迭代和分割器)或至少一次(每个行为(每个)在集群成员资格更改时,也是如此。
远程节点上调用时 迭代器和 运算符将返回条目批处理,其中下一个批处理仅在最后使用后发回发送。完成此批处理,以限制给定时间在内存中有多少个条目。用户节点将保存在其处理的密钥以及给定片段完成后,它将从内存中释放这些密钥。这就是为什么首选使用迭代方法进行后续处理,因此一次仅在内存中保存一小部分片段密钥,而不是从所有节点保存。
分割 器
for every () 方法也会返回批处理,但它会在至少处理完成密钥后返回批量密钥。这样,原始节点可以知道已经处理哪些密钥,以减少处理同一条目的几率。不幸的是,当节点意外停机时,至少有可能有至少一次的行为。在这种情况下,节点可以处理批处理,但还没有完成,这些条目在重新哈希失败操作时将再次运行,但不会在完成批处理中再次运行。请注意,添加节点不会导致这个问题,因为重新哈希故障转移只有在收到所有响应前不会发生。
这些操作批处理大小都由相同的值控制,可以通过在 CacheStream 上调用 distributedBatchSize 方法来配置。这个值将默认为以状态传输配置的 chunkSize。不幸的是,这个值对内存用量与至少一次的性能造成权衡,并且您的鼠标可能会不同。
使用带有复制和分布式缓存的 迭代器
当节点是分布式流的所有请求片段的主或备份所有者时,Data Grid 会在本地执行 迭代 或 分割 器终端操作,这会优化性能,因为远程迭代更为密集型。
这种优化适用于复制和分布式缓存。但是,当使用 共享 并启用了 write-behind 的缓存存储时,Data Grid 会远程执行迭代。在这种情况下,执行迭代可以远程确保一致性。