database - Aerospike ACID - 如何知道超时事务的最终结果?
问题描述
我是 Aerospike 的新手。
我想知道在所有可能的超时情况下,如此链接中所述:
https://discuss.aerospike.com/t/understanding-timeout-and-retry-policies/2852
客户端无法通过指定的超时时间 (timeout=) 连接。超时为零意味着没有设置超时。
客户端在指定的超时 (timeout=) 前未收到响应。
服务器在自己的处理过程中使事务超时(如果客户端未指定超时,则默认为 1 秒)。要对此进行调查,请确认服务器事务延迟不是瓶颈。
由于节点失败或连接失败而没有错误时,客户端在 M 次重试迭代后超时。
N 次重试后,客户端无法获得有效节点(从您的客户端设置重试)。
重试 X 次后,客户端无法获得有效连接。重试计数通常是限制因素,而不是超时值。原因是,如果您在 R 重试后无法获得连接,那么您将永远不会,所以请提前超时。
在提到的所有超时情况中,在哪些情况下我可以绝对确定事务的最终结果是失败的?
如果客户端没有响应,Aerospike 是否提供任何东西,即回滚事务?
在最坏的情况下,如果我不能确定最终结果,我怎么能确定交易的最终状态呢?
提前谢谢了。
编辑: 我们想出了一个临时解决方案:
为该记录保留 [generation -> value read] 的映射(可能是后台线程不断读取记录等),然后在超时时,我们将定期检查映射(键 = 预期生成)以查看是否真实写入value 实际上是放在地图上的那个。如果相同,则表示写入成功,否则表示写入失败。
大家觉得有必要这样做吗?还是有其他方法?
解决方案
首先,超时不是您应该关注的唯一错误。较新的客户端有一个与错误关联的“ inDoubt ”标志,表明写入可能已应用或未应用。
没有一种内置的方法可以将可疑交易解决为明确的答案,如果网络是分区的,AP 中就没有办法严格解决可疑交易。'强一致性'模式确实存在严格的方法,相同的方法可用于处理常见的AP场景,但它们在分区下会失败。
我使用的方法如下:
- 每条记录都需要一个列表 bin,列表 bin 将包含最后 N 个事务 id。
- 对于我的用例,我给每个客户端一个唯一的 2 字节标识符——每个客户端线程一个唯一的 2 字节标识符——每个客户端线程都有一个 4 字节计数器。因此,特定的事务 ID 看起来会从 2 个 ID 和计数器中屏蔽一个 8 字节的标识符。
- * 使用getHeader api 读取记录元数据 - 这避免了从存储中读取记录箱。
- 注意 - 我的用例不是增量,所以我实际上必须读取记录并使用生成检查写入。对于计数器用例,这种模式应该更有效。
- 使用 operation 和gen-equal将记录写入使用以下操作的读取生成:增加整数 bin,添加到txns 列表,并修剪txns 列表。您将在您的 txns 列表中添加您的事务 ID,然后将该列表修剪为您选择的列表的最大大小。
- N 需要足够大,以便记录可以确保有足够的时间来验证其事务,因为存在密钥争用。N 会影响记录的存储大小,因此选择太大会消耗磁盘资源,选择太小会导致算法无效。
- 如果交易成功,那么你就完成了。
- 如果交易是“不确定”,则读取密钥并检查 txns 列表中的交易 ID。如果存在,那么您的交易“肯定成功”。
- 如果您的事务 ID 不在 txns 中,请重复步骤 3,并从步骤 5 中读取返回的生成。
- 返回到第 3 步 - 除了第 5 步中的“生成错误”也需要被视为“不确定”,因为它可能是最终应用的先前尝试。
还要考虑在步骤 5 中读取记录并且在 txns 中找不到事务 ID 并不能确保事务“肯定失败”。如果您想保持记录不变,但具有“绝对失败”的语义,则需要观察到该代已超过先前写入的 gen-check 策略。如果没有,您可以用触摸替换步骤 6 中的操作 - 如果成功,则初始写入“肯定失败”,如果您收到生成错误,您将需要检查您是否参与了初始事务的应用程序初始写入现在可能“绝对成功”。
同样,对于“强一致性”,“绝对成功”和“绝对失败”的提及是准确的陈述,但在 AP 中,这些陈述具有失败模式(尤其是在网络分区周围)。
推荐阅读
- unity3d - 从特定相机 Unity 中读取每一帧的像素
- parsing - 在 Windows 7 中识别映射驱动器的 ip 并重新连接它
- swift - 模块“Alamofire”在迁移后没有名为“upload”的成员错误
- mysql - 创建新列时出现错误“将 varchar 转换为数字数据类型的算术溢出错误”。
- r - 使用 R 根据来自另一个数据帧的两列在数据帧中查找一个值
- kotlin - 如何一次迭代列出两个项目?
- ansible - Ansible:列表未定义时跳过循环
- regex - Extract Decimal and Integer numbers from sentences using Perl
- docker - 为什么我无法从 Kubernetes 容器之间的共享 PersistentVolumeClaim 中读取文件?
- mongodb - 使用 mongodb 中的查找记录的 $cond 获取 $size 计数