我们正在建设一个网页应用程序上的亚马逊的网服务堆,我爱它那么远。

我们还充分利用试验驱动的发展,也证明是非常美妙的。

我只是希望有人可以帮我一个问题,我已经遇到其中涉及亚马逊SimpleDB的"最终一致性".

最好的例子的问题,是在一个单元的测试,增加了一个用户,然后检查的用户加入成功地通过打电话来获取,新加入的用户。

我可以很容易地去吧,只是写的试验,并且它能所有的工作很好,但我所知道的"最终一致性"和可能性,当我打个电话来获取用户,用户可能不实际上已经增加。显然,如果取用户的功能和对用户不在的系统,它将返回的虚假或失败。

我想知道是什么是最好的方式来处理这个吗?我已经看到建议的制作功能,可供5秒之间的请求和试图的10倍。我也看到的解决方案与指数退避。什么是最佳的解决方案吗?

有帮助吗?

解决方案

我建议不要使用实际的SimpleDB服务进行单元测试自己的代码。您将测试代码+ SimpleDB的客户端+网络+ SimpleDB的本身。你需要的是模拟SimpleDB的客户端对运行单元测试。这样,你只是在测试的代码,需要进行测试。测试驱动开发呼吁你们为不可以测试如果数据库工作在单元测试代码。

如果您正在测试自己的SimpleDB的客户端代码,您可以使用一个模拟的SimpleDB服务或类似的 M / DB 的是,你可以在本地运行一个SimpleDB的克隆。

但是,这带来了一个更大的问题,因为SimpleDB的提供最终的一致性,而不是读你 - 写入数据的一致性。您的代码将绝对需要能够应付的事实,新增加的项目不会立即从GET或查询返回的。

我没有理由认为你的代码不能处理它。我只是说,当你运行与测试,如这些问题的一般规则,但它暗示了需要的代码被测试考虑的问题。您可能会发现,你想要么您的应用程序代码和SimpleDB的或你们之间的缓存可能希望能够提供会话缓存的总层读取您的-写入数据的一致性。

其他提示

所以你是测试数据库或违背它的代码?如果您正在测试违背数据库的代码,那么你应该有一个预期的代码添加一个用户测试,直到说,时间一些随机量已经过去了那么不返回用户。显然,这是最容易建立使用假DB持续跟踪时间量自上次请求,只因为初始请求已过返回指定时间后的预期值。你必须在假设置为从不返回值,设置返回它的时候了类似的测试等仪器你假跟踪的相互作用,您可以在您的测试设置你希望你的代码的行为,以便代码遵循预期的行为(至少两次轮询,例如)。

首先,如@Mocky指出,打击真实的数据库单元的测试是错误的。你可能会这样做,在一体化试验,但这些工作,因为所有单元的测试通过。

关于单元的测试都知道最终一致性,这里有一些想法:

  1. 测试,用户返回自simpledb后编写的(没有效果的e-c) 把用户 获得用户 测试千篇一律

  2. 测试,用户不是返回自simpledb后编写的(e-c效果) 把用户 获得用户 接受一个错误

  3. 测试的错误ec处理 获得用户+接受的错误 测试的错误处理

我想用一层缓存(或elasticcache)提供一个缓存的用户,这样用户使用时写入simpledb他们被送到缓。当simpledb发生错误的缓检查下一步之前,代码的决定有真的没有这样的用户。

(实际上很想听听你怎么想,最后段落)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top