1

我在 Google App Engine 中编写一个 twitter 应用程序。它接受命令作为直接消息,因此我设置了第三方 cronjob 服务来调用定期处理 DM 的处理程序。我有一个只有一个条目的模型“信息”,它存储了一些在应用程序中的许多地方使用的通用数据(在这种情况下,是最近处理消息的时间)。我的处理程序的一般模式是这样的:

class Info(db.Model):
    msg_polled = db.DateTimeProperty(auto_now_add = True)
    .... More Properties ....

    @classmethod
    def get_info(cls):
        info = cls.all().get()
        if not info:
            info = cls()
            info.put()
        return info
---------------------------------------------------------
info = Info.get_info()
msgs = api.GetDirectMessages(since = info.msg_polled)
if not msgs:
    return
logging.info('Processing Messages since %s ' % str(info.msg_polled))
for msg in msgs:

    ...process commands...

    logging.info('Processed Message :- @%s : %s' % (msg.sender_screen_name, msg.text))

info.msg_polled = datetime.datetime.now()
info.put()

但有时我会得到这样的日志:

I 03-30 07:50AM 10.973
Processing Messages since Sun, 29 Mar 2009 11:41:59 GMT 
I 03-30 07:50AM 11.122
Processed Message :- @foo : Foo_Bar
-------------------------------------------------------
I 03-30 07:46AM 08.014
Processing Messages since Sun, 29 Mar 2009 11:41:59 GMT 
I 03-30 07:46AM 08.130
Processed Message :- @foo : Foo_Bar

在这里,似乎信息没有被提交到数据库。消息被多次处理,有时在 msg_polled 值更改之前多达 10 次以上。但我没有收到任何数据存储异常。这种情况只偶尔发生一次。

任何帮助表示赞赏。

4

2 回答 2

0

Google AppEngine 数据存储在幕后使用 BigTable,这是一个分布式数据库系统。因此,更新可能不会立即可见,因为新数据尚未到达每个分布式表(亚马逊在其 SimpleDB 中称其为“最终一致性”)。几分钟后你应该就好了。

于 2009-04-01T13:50:10.697 回答
0

这是有关 GAE 数据存储中一致性的良好文档:

https://cloud.google.com/developers/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore

结论:

最终一致性是非关系数据库的基本要素,它允许开发人员在可伸缩性、性能和一致性之间找到最佳平衡。重要的是要了解如何处理最终一致性和强一致性之间的平衡,以便为您的应用程序设计最佳数据模型。在 Google Cloud Datastore 中,使用实体组和祖先查询是保证实体范围内高度一致性的最佳方式。如果您的应用程序由于前面描述的限制而无法合并实体组,您可以考虑使用其他选项,例如使用仅键查询或 Memcache。对于大型应用程序,应用最佳实践,例如使用分散的 ID 和减少索引以减少一致性所需的时间。

于 2014-08-30T13:56:42.263 回答