代码之家  ›  专栏  ›  技术社区  ›  bpapa

谷歌应用引擎-你如何处理一个datastoretimeoutexception?

  •  0
  • bpapa  · 技术社区  · 15 年前

    我已经在谷歌应用引擎上构建了一些东西,作为iPhone应用程序的后端。在应用程序中,有一些交互通过其API被推送到社交网络。所以典型的工作流程是这样的:

    1. 用户使用iPhone应用程序做“一些事情”
    2. 应用引擎应用程序通过HTTP发出警报
    3. 应用引擎会提醒社交网络用户做了“一些事情”。如果用户要检查他们在该网络上的配置文件,则会显示他们通过应用程序进行的活动。因此,就用户而言,他们所做的可能有效。
    4. 应用程序引擎需要自己做一些持久性,但是当它尝试时,会抛出一个datastoreTimeException。现在数据处于一种奇怪的状态。

    那么,有什么好方法来处理这个问题呢?从问题的本质上来说,我很想把它包装成一个“交易”,但是没有办法回滚发送到社交网络的内容。所以,我在考虑如何处理DatastoreTimeException?我应该把它包在一个试块里再试试吗?向用户显示一个错误,然后当他们再次尝试时,“跳过”社交网络交互,这样它就不会被推出两次,这是一个更好的主意吗?还有什么我不想在这里的想法吗?

    3 回复  |  直到 15 年前
        1
  •  1
  •   Steve Jessop    15 年前

    http://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/DatastoreTimeoutException.html

    如果试图放置、获取或删除太多的实体或属性太多的实体,或者数据存储超载或出现问题,则可能会发生这种情况。

    如果您经常看到异常,我想这是因为数据存储操作太大了,所以重试并没有什么帮助。如果您只是为了防范可能引发异常的风险而进行编码,那么您可以再试一次(可能是通过将要执行的任务排队)。但是,如果你不能访问数据存储,谁会说你可以将任务排队呢?

    如果你想成为防弹强悍,并且你可以确保你在社交网络上执行的操作是等量的(可以重复),那么:

    • 请注意,您需要执行社交网络操作。
    • 如果注释存储失败,则中止并返回失败。
    • 否则,尝试社交网络操作。
    • 如果成功,请删除注释。
    • 有某种任务或循环可以在将来重试任何剩余的笔记。

    当然,您必须对返回给iPhone客户端的响应代码保持谨慎,因为成功可能需要 长的 时间-比iPhone应用程序发出请求的持续时间长。所以你希望你的应用引擎请求也是等幂的,你可能想要某种取消。

    如果你从社交网络中得到的只是成功或失败,而如果成功的话,你的操作就不能重复,那么你就有麻烦了。这是一个在网络上提供的垃圾API,因为仅仅因为Web服务器向您发送成功的响应并不意味着您收到了它,所以有时调用方无法知道他们已经成功了,即使成功创造了责任。但它确实发生了。

        2
  •  0
  •   kasuku    15 年前

    我觉得这个说法令人担忧: 在实践中,重试通常是成功的;即使对于小型操作,也会定期获得数据存储超时。1月23日14:59

    如果GAE存在可靠性问题,如何认真对待它?通常情况下,您是否发现数据存储速度较慢?你对这些例外的频率估计是多少?

        3
  •  0
  •   Nick Johnson    15 年前

    这是任何分布式系统的基本问题。一般来说,没有简单的“防弹”解决方案。如果可能的话,最好的选择是确保您的一个或两个操作都是等幂的——也就是说,多次执行它们没有任何效果。对于数据存储来说,这相当容易:如果您指定了一个密钥名,多个PUT将简单地相互覆盖。如果可能的话,你也应该在你的社交API中使用等幂,这样你就可以在失败的情况下安全地重新执行。