【发布时间】:2015-10-10 04:44:16
【问题描述】:
我在下面找到了一些讨论这种情况的线程。
- Firebase: How do I update multiple resources atomically
- Firebase data consistency across multiple nodes
- How to store users and groups for a chat using Firebase
但是仍然在努力寻找,如果有任何推荐的数据结构设计。 我看到了一个多写库firebase-multi-write,它说在大多数情况下你可能不需要这个。
但我认为我确实需要这个,我的场景是:3 个用户
/users/A : {credit:20}
/users/B : {credit:3}
/users/C : {credit:10}
每个用户都可以同时窃取彼此的积分。,
- A 抢断 B 学分看起来像 {21, 2}
- C 学分中的 B 抢断看起来像 {3, 9}
- A 学分中的 C 抢断看起来像 {11, 20}
现在我需要更新每个用户的信用以保持这种一致性,以便每个窃取操作本质上是原子的。
在 Java 中保持数据完整性的同时,处理这种情况的最佳方法是什么?
【问题讨论】:
-
您的第一个链接线程讨论了另一种方法(事件溯源-martinfowler.com/eaaDev/EventSourcing.html)。您将编写一个事件来捕获所有三个窃取事件,然后当您需要查找当前信用余额时,您将加载初始状态(可能为 0 信用),然后播放事件历史记录,直到您最终到达最终状态。奖励积分 - 你有所有“偷窃”的历史。这是不可接受的原因吗?
-
谢谢,我提到的场景是我设想的工作流的简化版本。这是简单游戏应用程序的一部分,其中 A 抢断 B,然后 B 将其抢回,C 和 D 玩家混合在一起。所以对于一个简单的原子更新来说计算太多了??
-
我对您的场景知之甚少,无法知道原子操作是否有效 - 但您所描述的内容对我来说听起来不像原子操作。如果 A 从 B 拿走然后“在下一刻” B 把它偷回来……那不是原子的。这是两个不同的操作,碰巧发生在彼此附近。
-
确实如此。这些听起来像是不同的操作。对于这个用例,事务就足够了。 queue 或事件溯源将最好地处理原子事务更改。简单的multiple-path writes 现在可以用于更简单的情况,目标只是一次更新所有 3 条路径。