问题标签 [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 回答
141 浏览

google-app-engine - Do Cursors deal with Eventual Consistency?

In the App Engine Documentation I found an interesting strategy for keeping up to date with changes in the datastore by using Cursors:

An interesting application of cursors is to monitor entities for unseen changes. If the app sets a timestamp property with the current date and time every time an entity changes, the app can use a query sorted by the timestamp property, ascending, with a Datastore cursor to check when entities are moved to the end of the result list. If an entity's timestamp is updated, the query with the cursor returns the updated entity. If no entities were updated since the last time the query was performed, no results are returned, and the cursor does not move.

However, I'm not quite sure how this can always work. After all, when using the High Replication Datastore, queries are only eventually consistent. So if two entities are put, and only the later of the two is seen by the query, it will move the cursor past both of them. Which will mean that the first of the two new entities will remain unseen.

So is this an actual issue? Or is there some other way that cursors work around this?

0 投票
1 回答
166 浏览

amazon-dynamodb - DynamoDB 或 Riak 中的单客户端写入是强排序的吗?

我有一个客户端按顺序执行以下两个操作:

  1. 使用键“ABC123”创建一个新项目。
  2. 更新项目“newestKey”以包含值“ABC123”。

同时,第二个客户端正在运行以下程序:

  1. 读取item“newestKey”得到最新item的key K。
  2. 阅读 K 项。

第二个客户端是否有可能将“ABC123”作为“newestKey”,但在尝试加载项目“ABC123”时收到未找到错误,因为该项目尚未通过数据库传播?

换句话说,是否保证如果单个客户端对数据库进行两次写入,那么除非它也看到第一次写入,否则没有客户端将看到第二次写入?

0 投票
3 回答
40483 浏览

amazon-web-services - 亚马逊 - DynamoDB 强一致性读取,它们是最新的吗?如何?

在尝试将 Dynamodb 用于其中一个项目时,我对 dynamodb 的强一致性模型有疑问。从常见问题解答

强一致性读取 — 除了最终一致性之外,Amazon DynamoDB 还为您提供灵活性和控制权,以在您的应用程序或应用程序元素需要时请求强一致性读取。强一致性读取返回的结果反映了在读取之前收到成功响应的所有写入。

从上面的定义,我得到的是强一致性读将返回最新的写值。

举个例子:假设 Client1 在 Key K1 上发出写入命令,将值从 V0 更新到 V1。几毫秒后,Client2 发出对 Key K1 的读取命令,然后在强一致性的情况下,将始终返回 V1,但在最终一致性的情况下,可能会返回 V1 或 V0。我的理解正确吗?

如果是,如果写操作返回成功,但数据没有更新到所有副本,我们发出强一致性读,这种情况下如何保证返回最新的写值?

以下链接 AWS DynamoDB 读后写一致性 - 它在理论上是如何工作的?试图解释这背后的架构,但不知道这是否是它的实际工作方式?浏览完这个链接后,我想到的下一个问题是:DynamoDb 是否基于单主多从架构,其中写入和强一致性读取是通过主副本,而正常读取是通过其他副本。

0 投票
1 回答
501 浏览

sql - 分布式 postgresql ID 冲突处理

假设我们有一个带有 ID、CONTENT 和 TIMESTAMP 的分布式表。ID 是 hash(CONTENT) 并且 CONTENT 具有足够的确定性,可以在系统中的多个位置输入,彼此紧随其后。

假设发生了某个现实生活中的事件。就像有人赢得了奥运会一样。然后,它进入这个数据库中的记录,除了时间戳之外,它看起来总是一样的。由于每台机器以略有不同的延迟观察事件。

所以。当机器同步这个分布式表时,他们会想知道“我们已经有了这个确切的 ID!它也不是一个相同的行!我们应该怎么做!?”。我想以以下形式给他们答案:bool compare(row a, row b)或者,最好是row merge(row a, row b)

有谁知道如何做到这一点?我只能找到与合并两个不同表相关的“合并”事物,而实际上这是一张表,只是分布式的。

对我来说,这对于使我的系统“最终保持一致”非常重要。我想利用 postgresql 的分布式数据库机制,因为它们非常可靠,我不想重写它们。

0 投票
1 回答
194 浏览

python - Google Appengine 数据存储何时可以返回陈旧数据?

我可以从这段代码中得到的结果是否有所不同:

与此代码相比:

即,models两者都一样吗?

如果不是,为什么不呢?我曾认为最终一致性用于描述模型索引如何需要一段时间才能更新,因此可能与最近写入的数据不一致。

但是我最近遇到了一个案例,我实际上是从第二个查询中获取过时的数据,其中model.myFlagTrue通过查询检索到的模型,但是False当我实际上是通过键获取模型时。

那么在这种情况下,数据myFlag来自哪里?

是不是通过键获取实体可以确保跨数据存储节点进行复制并返回最新数据,而通过查询获取实体只是从最近的数据存储节点检索数据?

编辑: 我阅读了这篇文章,并假设 Cloud Datastore 与 Appengine Datastore 的工作方式相同,我的问题的答案是肯定的,从查询返回的实体可能具有陈旧的值。

https://cloud.google.com/developers/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore#h.tf76fya5nqk8

0 投票
2 回答
687 浏览

google-app-engine - REST 状态代码和最终一致性?

我有一个在 Google App Engine 上运行的 RESTful Web 服务,并使用 JPA 将实体存储在 GAE 数据存储中。

使用 POST 请求创建新实体(因为服务器将生成实体 ID)。

但是,我不确定返回的最佳状态代码,因为 GAE DS 最终是一致的。我考虑了以下几点:

  • 200 OK:RFC 声明响应正文应包含“描述或包含操作结果的实体”。这是可以实现的,因为实体在持久化到 DS 时会使用其生成的 ID 进行更新,因此可以立即序列化并返回更新的实体。但是,随后按 ID 对该实体的 GET 请求可能会失败,因为所有节点可能尚未达到一致性(这已被视为我的客户端应用程序的现实问题)。
  • 201 Created:如上所述,如果尚未达到一致性,则返回新实体的 URI 可能会导致客户端出现问题。
  • 202 Accepted:将消除上述问题,但无法将新实体的 ID 通知客户端。

在这种情况下,什么被认为是最佳实践?

0 投票
2 回答
12079 浏览

amazon-web-services - 文件上传时的最长 Amazon S3 复制时间是多少?

背景

我们在项目中使用Amazon S3作为客户端上传文件的存储。

出于技术原因,我们使用临时名称将文件上传到 S3,然后处理其内容并在处理完文件后重命名文件。

问题

尽管被重命名的文件已成功上传,但“重命名”操作一次又一次失败并出现错误。404 (key not found)

亚马逊文档提到了这个问题:

Amazon S3 通过在 Amazon 数据中心内的多台服务器之间复制数据来实现高可用性。如果 PUT 请求成功,您的数据将被安全存储。但是,有关更改的信息必须跨 Amazon S3 复制,这可能需要一些时间,因此您可能会观察到以下行为:

我们实施了一种轮询作为解决方法:重试“重命名”操作,直到成功。
轮询在 20 秒后停止。

这种解决方法在大多数情况下都有效:文件在几秒钟内被复制。
有时——很少——20秒是不够的。S3 中的复制需要更多时间。

问题

  • 您观察到在 Amazon S3 上成功执行 PUT 操作和完成复制之间的最长时间是多少?

  • Amazon S3 是否提供“绕过”复制的方法?(直接查询'master'?)

0 投票
0 回答
60 浏览

java - 跨多个实例的 GAE 强一致性异常

我将 GAE SDK 1.8.9 与 Java 1.7(内部版本 45)一起使用。对于数据存储,我使用的是 Datanucleus JDO v2。我已经将代码部署到生产环境中,为每个新的“订单”请求更新计数器,并且出现了一些一致性问题,我认为这些问题与在几秒钟内处理来自不同服务器的请求有关。数据存储实体由一个唯一键(由我的应用程序生成)、几个日期字段和一个 orderId 计数器组成。数据存储区中只有少数这些实体。

这是我的逻辑的一个子集......

keyId 是 StoreWrapper 类中 String 类型的实例变量

StoreWrapper 类中的 newOrderId() 方法应该在数据存储区中获取所需的 Store 实体(基于 keyId),增加实体的 orderId 值,使用更新后的值将实体更新回数据存储区,最后返回更新后的值 (或 0 如果发生错误)给调用者。获取、递增和更新都发生在使用事务的 .begin() 和 .commit() 方法的 JDO 事务中。

Store 类中的 newOrderId() 方法只是增加 orderId 值(加上一些逻辑,以允许它在达到上限时翻转)。

公共 int newOrderId() { int orderId = 0;

}

当我在短时间内提交多个下订单请求时,我注意到订单的另一个数据存储中有重复的订单号。我的研究得出结论,当多个实例正在处理请求时会发生这种情况。在日志中,我可以看到每次发生这种情况时,重复的实例都是不同的。我的理解是实体组默认为根(考虑到实体的简单性质,这​​种情况就是这种情况,因为我在生成密钥时没有指定父级),但我无处可寻至于为什么行为表现得像“最终一致性”而不是“强一致性”。我已经为各种异常设置了几个捕获,但没有看到任何证据表明日志中发生了这些异常。我' 甚至将线程安全设置为“假”,因此每个实例只处理一个请求,并且仍然会发生。是否有一些设置必须设置为跨多个实例强制执行“强一致性”?

0 投票
1 回答
935 浏览

concurrency - 如何通过最终一致性来处理并发?

如何通过最终一致性来处理并发?或者我可以问如何通过最终一致性来确保数据完整性?

通过 CQRS 和事件溯源,最终一致性意味着您将域事件放入队列中,并设置作为投影的事件处理程序。这些预测以异步方式更新读取缓存。现在,如果您使用该读取缓存进行验证,则无法确定验证所依据的信息是否仍然有效。当您发送命令时,队列中可能存在未处理(或未投影?)的域事件,这可能会改变验证的结果。所以这只是另一种并发......你怎么看,如何处理这些罕见的并发问题?域事件已经保存在存储中,所以你不能对它们做任何事情,你不能只是从事件存储中删除它们(因为它应该只写一次),并在电子邮件中告诉用户,对不起,我们下定决心取消了您的请求。或者你可以吗?

更新:

通过事件存储处理并发的可能解决方案:

通过写模型

按阅读模型

通过投影

0 投票
1 回答
622 浏览

c# - RavenDB 中 WaitForNonStaleResultsAsOfNow 的范围是什么

如果我在现有的 RavenDB 会话上运行以下查询:

RavenDB 等待哪些索引?我的假设是它等待所有索引在查询时都是最新的;然而,这是否意味着如果Location其他表上只有一个动态索引但有 20 个索引,我们总是在等待 21 个索引更新?

或者,我是否误解了该方法的功能?