问题标签 [eventual-consistency]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - App Engine 分片计数器和高复制数据存储
我将 App Engine 与最终一致的高复制数据存储一起使用。我也在使用分片计数器。
当我查询所有分片并将它们相加时,我可以假设计数是强一致的吗?也就是说,下面的代码会返回我的分片计数的准确总和吗?
cqrs - 在最终一致的系统中,您如何确保一致的客户端读取?
我正在研究 CQRS,并且正在寻找有关如何在最终一致的系统中解决客户端读取问题的文章。例如,考虑一个网上商店,用户可以在其中将商品添加到他们的购物车中。如果“AddItemToCart”命令的实际处理是异步完成的,如何确保客户端显示购物车中的商品?我了解基于域事件异步调度命令和更新读取模型异步的原则,但是我看不到从客户端的角度来看这是如何处理的。
indexing - RavenDB 中的 MonotonicRead 和 ReadYourWrites 有什么区别?
RavenDB (build 888) 中 DocumentConvention 的默认 ctor 将 DefaultQueryingConsistency 设置为 MonotonicRead。据我了解,这意味着默认情况下,我们将等待索引在写入后更新。不要误会我的意思——这对于简单性来说是个好消息(尤其是在集成测试中),但它违背了我理解的 RavenDB 最终一致性口头禅的一部分。
我已经阅读了 ConsistencyOptions.cs 中引用的文章,但我对 MonotonicRead 和 ReadYourWrites 之间的区别感到困惑——它们对我来说似乎是一样的。
那么:这两种一致性模型有什么区别,这与 RavenDB 的一致性模型有什么关系?
.net - CQRS 如何实现后置条件?
CQRS 如何处理立即一致模型的后置条件?我意识到这样的事情与最终一致的带有事件源等的系统无关。但是如果我只是想将 vanilla CQRS 应用到一个简单的界面,我将如何编写我的后置条件?CQRS 的想法是否总是假设最终的一致性?
增删改查:
CQRS:
mongodb - Mongodb 中的 Read-your-own-writes 一致性
首先,这是Pymongo 文档中所说的
默认情况下,当线程第一次在 MongoDB 上运行操作时,PyMongo 会为每个线程启动一个请求。这保证了 **read-your-writes 的一致性。在一个请求中,线程将继续独占使用同一个套接字,并且没有其他线程将使用这个套接字,直到线程调用 end_request() 或它终止。此时,套接字将返回到连接池以供其他线程使用。
因此,当对 Mongodb 使用异步库(如 Asyncmongo、Motor)时,用户是否会具有类似于阻塞调用或最终一致性的一致性?
java - GAE HDR:在 XG 事务中通过键检索实体最终是否一致?
考虑“用于事务”中的第二个示例(“使用命名键更新实体,或者如果它尚不存在则创建它”):
https://developers.google.com/appengine/docs/java/datastore/transactions
现在考虑这种情况。多人游戏只允许任何两个玩家之间进行单场比赛。为确保这一点,使用玩家的每个键创建一个键。此键用作 UniqueMatch 实体的键。
因此,为了创建匹配,创建了 XG 交易。在本次交易中:
我们检查是否已经没有具有该键的 UniqueMatch 实体。如果使用该键的 datastore.get() 调用没有抛出 EntityNotFoundException,那么我们知道这两个玩家之间已经存在匹配,所以我们 rollback() 并向玩家显示错误消息。
我们 put() 我们需要放置的所有实体以创建匹配。这包括 UniqueMatch 实体,以及其他一些实体。
然后提交事务。
这似乎工作正常。但是,我注意到我可以在短时间内在任意两个玩家之间创建两场比赛。在一小段时间(实际上,在其中一个测试中长达 10-20 秒),我对 datastore.get(key) 的调用会抛出 EntityNotFoundException,即使该键已经被 put()。
这似乎是最终的一致性。但是,实体检索键是否保证是强一致的?这种保证是否受到在 XG 交易中完成这一事实的影响?
提前致谢,
hadoop - 影响长途网络最终一致性的因素有哪些?
我查阅了很多关于最终一致性的资源,他们都谈到了为什么它很重要,以及关于 Paxos 和拜占庭一般问题之类的东西。我更感兴趣的是了解在长途网络上实际实施或确保最终一致性- 需要做什么,挑战是什么,规避和预防和防范任何可能阻碍最终一致性的可能方法。从您的个人经历到您可能知道的链接的任何内容都会非常有用。谢谢!
domain-driven-design - 如何处理跨聚合根的并发约束
恐怕我已经知道答案了,但我希望有人可以提供以前没有找到的替代解决方案。与往常一样,根据有效聚合设计进行 DDD比我想象的要困难,但这是我的场景。
- 我们有两个 AR,User 和 RoleGroup
- 一个用户可以被授予一个特定的角色组,从而获得该角色组中角色(一个集合值对象)提供的权限。角色组的身份作为另一个 VA 保存在用户 AR 中。
- 当从系统中删除 RoleGroup 时,我们会引发一个域事件,处理程序使用该事件来查找引用该 RoleGroup 的所有用户并删除该引用。相应的投影反规范化器将使用相同的事件来更新用户的有效角色。这是授予该用户的各个角色和所有授予 RoleGroup 的角色的组合。
- 这不一定是事务性的(因为它最终可以是一致的)。
- 我们通过 Jonathan Oliver 的 EventStore 3.0 以及 Lokad.CQRS 和 NCQRS 中的元素来使用 Event Sourcing。
因此,理论上,当一个请求(它是一个 ASP.NET MVC 应用程序)正在执行上述场景时,另一个请求可能会将相同的 RoleGroup 授予用户。如果在上述域事件处理程序扫描与该角色组相关的用户之后发生这种情况,则该请求将完成。此时,您有一个已删除的角色组(尽管不是物理删除)和一个仍持有该角色组身份的用户。
你如何防止这种情况发生?我们目前正在考虑将用户的身份授予该 RoleGroup AR 的特定 RoleGroup 一部分,以便删除 RoleGroup 并将其授予用户将导致乐观并发冲突。但不知何故,这感觉不是正确的解决方案。
python - 帮助使用 App Engine 的最终一致性 + 缓存的框架
我相信我有一个相当典型的用例,很难最终保持一致。我想知道是否有人已经创建了一个 python 框架来帮助解决这个问题。
我有一个 GET 请求,它发出一组实体的查询。它们很少更新。我有一个 POST 请求一次更新一个实体,更新实体会影响它们是否/如何出现在 GET 请求中。
由于实体很少更改,我想长时间缓存 GET 请求,比如说几天或几周。因此,在我获得更新实体的 POST 的罕见机会中,我可以清除内存缓存。
如果我处理一个 POST 请求、更新一个实体、清除缓存,然后很快就会收到一个 GET 请求,最终一致的数据存储查询可能仍会显示旧的查询结果,然后这些结果将在接下来的几天内被 memcached或几周。
而不是简单地更新数据存储和清除缓存,我需要:
这似乎是一个足够普遍的问题。是否有任何 python 框架可以帮助缓解这个问题?
ndb 没有帮助,因为数据存储查询绕过了所有缓存。
如果重要的话,我目前正在使用 django-nonrel,django-tastypie 处理 GET 请求。