【问题标题】:What is the best way of implementing Log like structure in AppEngine在 AppEngine 中实现类似日志的结构的最佳方法是什么
【发布时间】:2014-01-10 13:39:39
【问题描述】:

我想在 appengine 中实现 datetime 有序实体,很像 Appengine 自己的日志。所以我可能需要某种独特的有序 id 生成算法。

有人对此有什么建议吗?

【问题讨论】:

  • 你真的只有一个时间戳可以使用。你也可以使用日志系统,如果数据只保留一段时间,然后你重新处理它。
  • @husayt - 你应该解释你想要达到的目标。那么我们或许可以提供解决方案。
  • @PeterKnego 购买默认自动生成的 id 是随机均匀分散的数字。您将如何实现用于 Appengine 上的实体的有序 id?

标签: google-app-engine google-cloud-datastore


【解决方案1】:

有类似的需求,我将一个长整数时间戳作为标识符传递给 Entity 构造函数。根据Java Datastore Entities, Properties, and Keys,标识符只能是字符串或长整数。为了在数据存储查看器中查看实际日期和时间,我还将转换为 java.util.Date 的相同值放入未索引的属性中。诚然,有些非规范化的冗余,但在实践中很方便。

【讨论】:

  • 糟糕,我忽略了唯一性。 long int 时间在 Unix 纪元中是毫秒。这里从未出现重复,但可以想象会出现。我建议以微秒、纳秒或皮秒表示时间。 GAE 中没有时间源如此精确,但如果两个事件共享相同的时间,它可能会使用合成的亚毫秒值来区分它们。记录时的唯一时间会很慢(锁定等)。相反,后台任务可以扫描和修复新写入的时间戳,为了更好的时间可用性(布鲁尔的 CAP 定理)而牺牲短期一致性。
【解决方案2】:

使用您要附加的日期。一种方法是将其转换为 unix 时间(自 1970 年以来的毫秒),因此它是数字的。 一种更好但更多代码的方法是不使用数据存储区,而是使用 bigquery。可能更便宜。

【讨论】:

    【解决方案3】:

    我们需要有关您想要做什么的更多信息。

    如果你想制作一些日志,你确实可以使用时间戳。 使用 python 和 ndb 很容易:

    class Log(ndb.Model):
        date = ndb.DateTimeProperty(auto_now_add=True)
        message = ndb.StringProperty()
    

    然后您按日期字段对日志进行排序。 如果您想像 AppEngine 一样制作,可以将您的日志与父键链接,并按日期和父键排序。

    AppEngine Python ndb

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 2023-03-07
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多