问题标签 [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.

0 投票
2 回答
1199 浏览

database - 最终一致的分布式数据库与幂等增加运算符?

是否存在支持对标量值进行幂等操作的分布式高可用性、最终一致的数据库?

如果我们使用正常更新,那么我们有可能在不同的节点上有 2 个不同的值,并且没有一个值是正确的,因为我们需要增加两个交易值的金额。

是否有一个分布式数据库,我可以在其中发送命令 increase(key, attribute[column], diff) 以便当我收到响应时,我可以确定无论帐户的当前值如何,该操作都会在其他副本上执行? 这样,即使 2 个不同的节点增加了不同的值,我也会对增加操作具有最终一致性,因为这种增加会传播到其他副本。

我不是在谈论条件更新,因为它不适用于像 cassandra 这样的高可用性数据库(这就是他们没有该功能的原因),我对原子增加操作感兴趣。

谢谢。

PS在幂等增加的情况下,我将有一个命令增加(key,attribute,diff,lock_key),这样如果db已经收到具有相同lock_key的相同命令,它就不会增加

tl;博士:

有没有办法在分布式 AP 类数据库中进行精确计数器?2 个问题: 1)如果我发送操作以增加计数器但我没有得到响应,我会再次发送该请求但不想增加计数器两次。2)如果该计数器在另一个副本上同时更新,我想最终结合这个增加,而不是覆盖这些值。那么是否有像 increase("John's balance", +5.67, "sdfsdfas") 这样的命令,其中 sdfsdfas 是一个用于丢弃重复更新的字符串。有没有复制这种命令的数据库?

0 投票
2 回答
954 浏览

riak - 为什么有些人说 Riak 最终是一致的

在 Riak 中,默认数据桶被复制到 3 个不同的节点 (N=3)。此外,在读取或写入请求被认为成功之前必须响应的副本数量是 2 个节点(R=2,W=2)。

我们知道当 N 小于或等于 R+W 时,Riak 提供了强一致性。因此通过这些默认值,Riak 提供了强一致性(如 MySQL)。我无法理解为什么有些人说 Riak 不是强一致性,它提供了最终一致性?

0 投票
1 回答
922 浏览

domain-driven-design - 聚合必须是强一致的吗?

我在 DDD 上阅读的所有内容都暗示聚合中的状态必须是高度一致的。

这意味着如果需要冗余,则只能使用强一致性复制(例如 2PC、3PC 或 Paxos)。

您是否允许使用最终一致的复制,例如多主或主从?如果您确实使用了它们,那么在 DDD 术语中您仍然拥有“聚合”吗?这是常见的事情吗?

0 投票
1 回答
261 浏览

locking - 混合最终一致性系统和遗留 ACID 系统

是否有将最终一致性系统与传统 ACID 系统混合的模式?

我想将数据存储在大型机上需要类似 ACID 事务的一些(至少两个)遗留系统中。那些大型机数据库(我们称它们为 OldWorld)在同一进程中的同一事务管理器下运行,因此大型机系统的一致性没有问题。

我有一个事务管理器,可以在非大型机环境(让我们称之为 NewWorld)中使用大型机 tm 和支持 ACID 的关系数据库处理 XA 事务。但我不想使用 XA-Transaction,因为它经常会导致大型机端长时间运行的锁出现问题,而且在许多情况下,我不需要两个世界的所有 ACID 功能。我一直想要一个一致的大型机(旧世界中的所有数据在旧世界中都是一致的)。新世界系统在从主机端读取数据时可以处理不一致的数据(新旧不一致)。用于在 OldWorld 中存储数据的操作很简单,并且保存了不会在功能上失败的“仅添加操作”(它可能在技术上失败,但这应该始终是暂时的失败)。

0 投票
4 回答
847 浏览

event-handling - 没有 CQRS 的领域事件和版本控制

嗨,我有以下 senario,我不明白如何获得最终的一致性:

  1. 用户 1 使用基于任务的 ui 更改客户名称
  2. 应用服务调用聚合上的操作
  3. 客户名称上的聚合触发事件已更改
  4. 总线使用 nservicebus 发送消息
  5. NServicebus 服务终止
  6. 用户 2 获得聚合并调用更改地址
  7. 聚合操作称为
  8. 触发域事件
  9. 信息放在公共汽车上
  10. 巴士重新启动
  11. 消息 2 最先收到
  12. 消息 2 已处理,其他有界上下文已更新为新地址
  13. 现在收到消息 1,这是错误的顺序
  14. 现在会发生什么

在 13 中如果我们在事件中传递聚合的版本会不会出现乐观并发错误?

如果是这样,消息 1 new 将应用于其他上下文中的对象。我们如何保持一致性?

这是阻止我在我的域中应用事件的问题。欢迎大家帮忙。

基本思想是在另一个上下文中更新另一个聚合。我只是停留在这个并发技术上。

我们没有在命令处理程序和总线上推送命令的意义上使用事件源或 CQRS。这只是我们希望异步发生的事件处理,因为我们有一个我们不希望更改的现有设计。

布莱尔

0 投票
1 回答
1016 浏览

python - GAE:等待最终一致性需要多长时间?

我有一个应用程序,我在其中创建大量实体。我不想将它们放在同一个实体组中,因为我可能会在短时间内创建很多它们——比如 24 小时内创建 100 万个。

在某些时候,我想通过这样的查询来获取所有这些实体:

在创建最后一个 Foo 实体后,我需要等待多长时间才能很有可能使用此查询获取所有 Foo 实体?

编辑:

从这个问题来看,我似乎无法立即获得所有实体。很高兴知道我应该等多久。

0 投票
2 回答
497 浏览

distributed-computing - 从分布式数据库读取的一致性

我有一组数据库,分布在网络中的多个位置,例如。一个需要在该数据库中存储一些数据的客户端。

我需要确保我的数据将始终被存储。

我无法使用同步/异步复制组织副本集,因为它会使我连接到一个故障点的主服务器,因此我将数据从客户端发送到我知道的所有数据库。显然,一个数据库可能无法存储,所以我依赖于其他数据库的写入。最后,尽管这些数据集是重叠的,但我得到了存储在 DB 中的不同数据集。(例如 DB1 -> [1, 2, 3],DB2 -> [1, 3],DB3 -> [2,3,4])

从这些数据库读取时如何获得一致的数据?我应该在写入数据的客户端和读取的客户端上应用哪些技术才能成功合并数据集(获取阅读器 [1,2,3,4])?

0 投票
1 回答
897 浏览

nosql - 我如何计算最终一致性需要多长时间才能变得一致?

我开始研究 nosql 和面向文档的数据库来存储我们将在我们的网站上提供的 HTML5 应用程序的资产。这旨在替代仅在文件系统上存储文件。它们将是小型的 Web 优化文件,包括 html、js、css 和 xml 等文本文件,以及图像、声音和字体等二进制文件。

由于我对容错感兴趣,我正在研究的解决方案(riak,Cassandra)使用最终一致性。虽然我在抽象层面理解这个概念,但当我与经理和决策者交谈时,我无法用实际术语解释最终一致性需要多长时间才能保持一致。毫秒?秒?分钟?由于我在这个领域没有任何经验,所以我正在寻找现实世界的经验,这意味着什么。

我知道不同的变量将确切地决定任何配置需要多长时间,但我需要能够开始了解我们需要构建什么样的基础设施来支持我们的需求。所以我正在寻找的是我们是否需要优化网络延迟、节点数量等来支持我们的特定需求。

我们希望达到选择要测试的平台的程度,并且在我们将时间投入任何特定解决方案之前,我们希望能够说“不,这对我们不起作用”。

我们现在拥有使用严格一致性的系统(例如我们的网络服务器上的文件系统和我们的 mysql 数据库),因此我们的管理习惯于加载和超时等概念,以及“关闭”的事情。但我无法与他们沟通“是的,数据现在不可用,但它没有关闭;它最终会可用”。他们想知道“嗯,‘最终’有多长”?

我如何判断最终一致的系统是否会在我们的网站上实际运行?

0 投票
2 回答
2147 浏览

database - 处理 Cassandra 写入失败的常见做法是什么?

在文档 [1] 中,据说

所以假设只有 2 个副本收到更新,写入失败。但由于最终一致性,所有节点最终都会收到更新。

那么,我应该重试吗?还是就这样吧?

有什么策略吗?

[1] http://www.datastax.com/docs/1.0/dml/about_writes

0 投票
5 回答
1294 浏览

cqrs - CQRS 最终一致性事件依赖

我是 CQRS 和最终一致性模型的新手,如果这是一个愚蠢的问题,请原谅我。

鉴于我刚刚开始,我在内存中有一个本地 CommandBus 和 EventPublisher。我的事件被持久化到 RavenDB 数据库用于重播,但是事件被发布并且处理程序在本地调用(不是通过 NServiceBus 等在外部排队)。EventPublisher 确实以异步方式发布事件(例如 Task.Factory.StartNew)。

有时我的事件有依赖关系(例如,必须先将 OrderReceived 事件处理到 ReadModel 中,然后才能将 OrderShipmentStatusUpdated 事件正确处理到 ReadModel 中)。

我该如何处理这种情况?使用传奇?如何在如上所述的简单内存模型中使用 Sagas?“推迟”一个事件是否被认为是可以接受的(也许将其标记为推迟并简单地尝试“偶尔”重新处理所有推迟的事件)?

有哪些应对策略?

谢谢你。