我正在编写Java应用程序的设计文档,其中有两个冗余进程从消息队列中读取项目,并且我们希望它们两个都使用相同的密钥将项目存储到gemfire存储中,目的是要有多个运行连续查询的应用程序会处理这些项目,然后将结果存储到另一个Gemfire区域中。
我刚开始接触Gemfire,目前还没有能力设置多服务器测试平台,因此我认为在进行研究时会问几个问题。
假设两个进程同时将项目存储在gemfire中,这会引起任何问题吗?
如果两次写入密钥,则该项目将被覆盖,并且在锁定密钥的情况下,我是否可能遇到任何问题(性能或其他问题)?
如果我有一个连续的查询运行该项目将匹配,我会在查询上得到两个“匹配” /(事件?),还是仅第一个生成匹配?
如果我有4个进程用相同的键将相同的项目写入商店,那会有什么不同?
最佳答案
如果您要写入的区域已分区,那么您概述的方案将可以正常工作。在这种情况下,只有在不同节点上复制对象所需的时间,主键上才会存在锁定。这里的主要考虑因素是网络的速度。第二次写入将覆盖第一个。至于这是否适合您的性能,将取决于您每秒流式传输多少个对象。
以下是一些可供考虑的替代方案:
1)您可以创建一个持久队列并仅在一个客户端上运行CQ。如果客户端失败,则只需重新启动它,即可保持一致性。
2)在服务器上创建一个分区的“事务”区域。在客户端上,将从CQ返回的对象放入“交易”区域,并将CQ时间戳添加为密钥的一部分。在“事务”区域的异步事件侦听器中,更新您的目标区域并删除“事务”区域中的对象。
3)创建一个与目标区域共存的“事务”分区区域。创建一个函数onRegion(partitionedTransactionRegion).withFilter(key).withArguments(对象和CQ时间戳)。您的客户使用上述签名调用该函数。该功能检查键+时间戳是否已添加在“事务”区域中。如果是这样,请忽略该操作。如果不是,请在“事务”区域中设置密钥(密钥+ CQ时间戳)并更新您的目标区域。在“交易”区域设置过期策略,以在一个小时或一天或您的首选项后过期。
关于java - Gemfire对冲突和重复条目的抵抗力如何?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43607445/