我最初熟悉的是关系型数据存储。我现在正在研究NoSQL并尝试了解其用例。以下是最近一直困扰着我的问题。
如何使用典型的NoSQL产品执行以下操作?
- 读取多个输入 - 为它们计算新值(每个输出都依赖于所有输入) - 将值写回
过去处理其他问题的示例是,您有一个带有各种用户帐户的Web游戏。用户可以互相发起攻击,攻击公式是复杂的黑盒游戏逻辑,根据两个输入和随机性确定相互结果。您需要强制执行攻击以原子方式发生,并且输入反映了序列化后的攻击序列中的一致时间点,输出也是如此。
重要的是:
- 所有输出以某种我们无法分解的复杂方式依赖于所有输入(即我们不能将其转换为标准的银行账户到事务分类帐示例,我们不能仅使用先前记录日志等)。 - 换句话说,我们不是在做P1 + = $10,P2- = $10这样的操作。 - 更像是我们正在(基本上是一些复杂/不可约的东西)进行[P1,P2] =(sha1(P1 + P2),sha1(P1-P2))的操作,其中我们希望获得P1和P2的值的一致快照[并不是说该行是实际游戏的好示例]。 - 输入将是小记录子集的任意选择,因此我们不能只使用复合记录。 - 外部观察者在所有操作之前或之后看到统一/一致的状态,但不在其间。
我们遇到了这个问题。我们实际上正在使用关系型数据库,但我们没有像应该那样使用其事务功能。结果,在线玩家互相攻击时往往会生成错误的结果,并为攻击者生成虚假资源。
在关系模型中,我会使用事务来完成这项工作。想想看,这可能是事务的标准示例。
如何在NoSQL中实现这一点?
以下是我在SO和其他地方看到的答案,我认为它们不适用于此特定实例:
- 忽略竞态条件的可能性 - 重新设计游戏,使其不成问题 - 使用数据存储实现2PC、面包店算法等 - 使用外部锁定服务
如果您认为它们中的任何一个或全部都是好的解决方案,请告诉我如何以及为什么。
我希望能够获得有关如何在实践中实现此类内容的指南。
谢谢!
如何使用典型的NoSQL产品执行以下操作?
- 读取多个输入 - 为它们计算新值(每个输出都依赖于所有输入) - 将值写回
过去处理其他问题的示例是,您有一个带有各种用户帐户的Web游戏。用户可以互相发起攻击,攻击公式是复杂的黑盒游戏逻辑,根据两个输入和随机性确定相互结果。您需要强制执行攻击以原子方式发生,并且输入反映了序列化后的攻击序列中的一致时间点,输出也是如此。
重要的是:
- 所有输出以某种我们无法分解的复杂方式依赖于所有输入(即我们不能将其转换为标准的银行账户到事务分类帐示例,我们不能仅使用先前记录日志等)。 - 换句话说,我们不是在做P1 + = $10,P2- = $10这样的操作。 - 更像是我们正在(基本上是一些复杂/不可约的东西)进行[P1,P2] =(sha1(P1 + P2),sha1(P1-P2))的操作,其中我们希望获得P1和P2的值的一致快照[并不是说该行是实际游戏的好示例]。 - 输入将是小记录子集的任意选择,因此我们不能只使用复合记录。 - 外部观察者在所有操作之前或之后看到统一/一致的状态,但不在其间。
我们遇到了这个问题。我们实际上正在使用关系型数据库,但我们没有像应该那样使用其事务功能。结果,在线玩家互相攻击时往往会生成错误的结果,并为攻击者生成虚假资源。
在关系模型中,我会使用事务来完成这项工作。想想看,这可能是事务的标准示例。
如何在NoSQL中实现这一点?
以下是我在SO和其他地方看到的答案,我认为它们不适用于此特定实例:
- 忽略竞态条件的可能性 - 重新设计游戏,使其不成问题 - 使用数据存储实现2PC、面包店算法等 - 使用外部锁定服务
如果您认为它们中的任何一个或全部都是好的解决方案,请告诉我如何以及为什么。
我希望能够获得有关如何在实践中实现此类内容的指南。
谢谢!