0

我正在使用亚马逊的 SimpleDB 为 iPhone 游戏制作一个简单的高分数据库,并且遇到了一些奇怪的问题,其中 SimpleDB 的响应消息似乎与我发送的请求甚至数据状态不一致服务器。

在应用程序中提交高分的预期事件顺序是:

  1. 创建一个 PutAttributes 请求,该请求尝试用新值覆盖当前分数,但前提是它大于分数的最后一个已知值。

  2. 如果期望值与服务器上的值不匹配,SimpleDB 的响应消息会让应用程序知道实际值是什么,并使用它作为新的期望值创建一个新请求。

  3. 这个过程一直持续到响应表明一切正常,或者直到服务器上的分数高于我们尝试提交的分数(即,如果有人在来回进行时提交了更高的分数)

(如果它是相关的,我使用 ASIHTTPRequest 类来处理请求,并且我通过在创建它们时将每个请求的缓存策略设置为 ASIIgnoreCachePolicy 来明确关闭缓存。)

然而,实际发生的事情有点奇怪……

  1. 第一个响应返回预期的结果。例如,应用程序提交了 200 的分数,并希望服务器上的分数为 0,但实际上是 100。SimpleDB 响应条件检查失败并让应用程序知道服务器上的实际值 (100)。

  2. 应用程序发送一个更新了预期值的请求,但 SimpleDB 响应与第一次相同的响应,即使预期值已更改(例如,响应说实际值为 100,而我们传入的预期值为 0,即使我们刚刚将其更改为 100)。

  3. 应用程序发送第三个请求,其分数/预期值与第二个请求完全相同(例如,两者均为 100),SimpleDB 报告条件再次失败,因为实际值为 200。

所以看起来第二次尝试确实有效,即使 SimpleDB 报告了失败并且对我传入的参数给出了错误的说明。这种奇怪的行为也非常一致 - 每次我尝试使用不期望值更新分数时'与服务器上发生完全相同的序列的不匹配。

我已经为此摸不着头脑了一段时间,而且我完全没有想法,所以如果有人比我有更多的 SimpleDB 经验,可以对此有所了解,我将不胜感激。

下面是请求和响应的示例序列,以防比我上面的折磨解释更好地描述情况(这些值取自实际请求和响应,但我已经编辑了请求的不相关部分)。

请求1
(此时服务器上的分数为100)

Attribute.1.Name=Score
Attribute.1.Replace=true
Attribute.1.Value=200
Expected.1.Name=Score
Expected.1.Value=000
Consistent=true

响应 1
条件检查失败。属性(分数)值为 (100) 但预期为 (000)

请求 2
(应用程序更新到正确的分数,但基于 SimpleDB 的响应似乎忽略了更改)

Attribute.1.Name=Score
Attribute.1.Replace=true
Attribute.1.Value=200
Expected.1.Name=Score
Expected.1.Value=100
一致=true

响应 2
条件检查失败。属性(分数)值为 (100) 但预期为 (000)

请求 3
(这一次 SimpleDB 获得了正确的预期值,但也报告分数已更新,即使所有先前的响应都另有说明)

Attribute.1.Name=Score
Attribute.1.Replace=true
Attribute.1.Value=200
Expected.1.Name=Score
Expected.1.Value=100
一致=true

响应 3
条件检查失败。属性(分数)值为 (200) 但预期为 (100)

更新(2010 年 10 月 21 日)
我检查以确保从服务器返回的 requestID 都是唯一的,并且确实如此。

4

1 回答 1

0

尝试在您的请求中传递 ConsistentRead=true。

于 2010-12-17T10:41:47.867 回答