2010-10-20 99 views
0

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

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

  1. 一个PutAttributes请求创建 试图用新的价值,但只有当 它是更大的覆盖当前 比分比最后所知的 值得分。

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

  3. 这个过程一直持续,直到 的答复中说,一切 是确定或直到 比分服务器恢复为比 分数越高,我们正在试图提交 (即如果某人具有较高 而这 来回得分提交是怎么回事)

(如果这是有关我使用ASIHTTPRequest类来处理请求,我已经明确每个请求的缓存策略设置为关闭缓存ASIIgn oreCachePolicy当我创建它们。)

然而,所发生的情况是有点怪......

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

  2. 该应用程序发送一个更新期望值的请求,但即使期望值发生了变化,SimpleDB也会以相同的响应进行响应(例如响应说实际值为100,并且我们传递的期望值即使我们刚刚将它更改为100)也是0。

  3. 该应用程序发送具有完全相同的得分/预期值作为第二请求的第三请求(例如,100为两者)和SimpleDB的报告该状态再次失败,因为实际值为200

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

我一直在这里搔着头一阵子,现在我完全没有想法,所以如果有人比我有更多的SimpleDB经验可以对此有所了解,我会非常感激。

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

请求1
(在服务器上的分数是100在这一点上)

Attribute.1.Name =分数
Attribute.1.Replace =真
Attribute.1.Value = 200
Expected.1.Name =分数
Expected.1.Value = 000
一致=真

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

请求2
(该应用程序的更新,以适当的分数,但基于响应SimpleDB中似乎忽略的变化)

属性。 1.Name =分数
Attribute.1.Replace =真
Attribute.1.Value = 200
Expected.1.Name =分数
Expected.1.Value = 100
一致=真

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

要求3
(这一次的SimpleDB得到的预期值正确,但还报告说,即使所有先前的响应另有说明,比分一直更新)

Attribute.1.Name =分数
Attribute.1.Replace =真
Attribute.1.Value = 200
Expected.1.Name =分数
Expected.1.Value = 100
一致性=真

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

更新(10年10月21日)
我检查,以确保正在从服务器返回的requestIDs都是独一无二的,他们确实是。

回答

0

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