我应该如何处理SimpleDB中的最终一致性,特别是在单元测试方面?

joe*_*elg 4 tdd unit-testing eventual-consistency amazon-simpledb

我们正在Amazon Web Services堆栈上构建一个Web应用程序,到目前为止我很喜欢它.

我们也在充分利用测试驱动的开发,这也证明是非常棒的.

我只是希望有人可以帮助我解决我遇到的与Amazon SimpleDB的"最终一致性"相关的问题.

出现此问题的最佳示例是在单元测试中添加用户,然后通过调用获取新添加的用户来检查用户是否已成功添加.

我可以轻松地继续前进,只是为此编写测试,它可以正常工作,但我知道"最终的一致性"以及当我拨打电话获取用户时,用户可能实际上没有补充说.显然,如果调用了fetch用户函数并且用户不在系统中,则它将返回false或failure.

我想知道的是处理这个问题的最佳方法是什么?我已经看到了建立一个函数的建议,这个函数在请求之间休眠5秒并尝试10次.我也看到过具有指数退避的解决方案.什么是最佳解决方案?

Moc*_*cky 5

我建议不要使用实际的SimpleDB服务对您自己的代码进行单元测试.您将测试您的代码+ SimpleDB客户端+网络+ SimpleDB本身.你需要的是模拟SimpleDB客户端来运行单元测试.这样您只需测试需要测试的代码.测试驱动开发要求您不要测试数据库是否在代码的单元测试中工作.

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

但这会带来更大的问题,因为SimpleDB提供了最终的一致性而不是读写一致性.您的代码绝对需要能够处理新添加的项目不会立即从get或查询返回的事实.

我没有理由认为你的代码无法处理它.我只是说当你遇到像测试这样的问题时,作为一般规则,它暗示了需要考虑的代码需要考虑的问题.您可能会发现在应用程序代码和SimpleDB之间需要一个通用的缓存层,或者您可能需要一个可以提供读写一致性的会话缓存.