gpt4 book ai didi

python - 在 GAE/P 中创建您自己的事件日志

转载 作者:太空狗 更新时间:2023-10-30 01:19:08 26 4
gpt4 key购买 nike

我想在我的应用程序中记录用户事件,以便向用户展示并用于管理目的。我的客户是公司,所以我可能会在三个级别展示事件:

  1. 单个用户的事件
  2. 公司所有用户的事件
  3. 所有事件

为了进行日志记录,我会创建一个模型来存储日志条目。我看到有几种方法可以做到这一点。

首先,我可以将每个记录的事件存储在其自己的实体中,然后根据需要进行查询:

class Activity(ndb.Model):
activity = ndb.StringProperty()
user_id = ndb.StringProperty()
company_id = ndb.StringProperty()

其次,我可以将用户的所有事件存储在单个实体中:

class UserActivity(ndb.Model):
activity = ndb.StringProperty(repeated=True) # Note this is now a list
company_id = ndb.StringProperty()

第三,我可以将一家公司的所有事件存储在一个实体中:

class CompanyActivity(ndb.Model):
activity = ndb.StringProperty(repeated=True) # Would store user_id here somehow

这三个选项的功能/性能权衡是什么?我知道如果有频繁的看跌交易,第二个和第三个选项可能存在争用问题,但为了讨论起见,我们假设这不是问题。

对于第二个和第三个选项,减少数据存储实体的总数是否有任何显着优势(因为它们将合并为更少的实体)?还是我应该选择第一个选项?

最佳答案

使用 repeated 属性的唯一好处是可以避免最终一致性问题:无论何时阅读 UserActivityCompanyActivity 实体,您都会知道您会得到所有事件的完整列表。使用第一种方法时,您必须进行查询才能获得此类列表,并且该列表可能会错过最近的事件,因为相应的查询索引可能尚未更新以反射(reflect)它们。

但是,除了您提到的潜在争用问题之外,重复属性方法还需要考虑另一个缺点:随着越来越多的事件被添加到列表中,这些实体的规模将逐渐增加,这意味着进入:

  • get()/put() 时间逐渐变慢,因此整体应用性能逐渐恶化
  • 达到最大数据存储实体大小的风险(~ 1MB,参见 Limits ),这将需要额外的逻辑来将列表拆分到多个实体

特别是第三种方法还需要一种不太简单的方法来获取每个用户的事件报告。

我会坚持使用第一种方法,它是最灵活和可扩展的方法,缺点也很小:

  • 最终的一致性问题是恕我直言,而不是阻碍(并且可能有减少其影响的方法)
  • 额外的存储空间(用于存储在每个 Activity 实体中的用户/公司 ID 属性加上由于实体数量较多而导致的更大索引)非常值得恕我直言(存储很便宜)。<

关于python - 在 GAE/P 中创建您自己的事件日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49556022/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com