Google 数据存储建模 - "Chat to Many - with individual last activity time"?

Google Datastore Modeling - "Chat to Many - with individual last activity time"?

我有一个 Google App Engine 应用程序,它允许两个用户彼此启动 ChatSession。每次他们互相发送消息时,我都会更新一个包含 LastActivity 值的实体,该值是 ChatSession 最后一次 activity.

的时间

这很好,因为只有两个给定用户之间的聊天消息才会导致更新该 LastActivity 实体。

但是现在我正在尝试实现 af "Send same message to multiple users" 功能。我仍然希望为每个 ChatSession 更新 LastActivity 实体。现在可能有许多用户试图更新同一个 LastActivity 实体。在我的性能测试中,由于实体每秒写入 1 次的限制,我开始看到失败的事务。

所以我的问题是:您如何为 "Chat to Many" 功能建模并能够保留查看两个用户最后一次互动的时间的选项?

最后想问一下:给定用户在过去24小时内activity参与的所有ChatSession给我

我想到了两种可能的解决方案。

方案一:多个LastActivity实体,不共享一个实体组

与多个用户共享一个 LastActivity 实体不同,每个 ChatSession 可以有多个与其关联的 LastActivity 实体,聊天中的每个用户一个。

class LastActivity(ndb.Model):
    user_id = ndb.IntegerProperty()
    chat_id = ndb.IntegerProperty()
    time = ndb.DateTimeProperty()

当您希望检索用户的信息时,您可以在 LastActivity 上进行查询,其中不等式检索过去 24 小时内的信息。

如果您注意不要使用子实体,那么它们将不会属于同一实体组,也不会出现争用。

解决方案 1 - 编辑

要获取用户在过去 24 小时内参与的所有聊天会话的列表,您可以执行以下操作:

one_day_ago = datetime.datetime.now() - datetime.timedelta(days=1)
chats = LastActivity.query(LastActivity.user_id == user_id, LastActivity.time > one_day_ago).fetch()
for chat in chats:
    # Do something with chat.chat_id

解决方案 2:任务队列

使用任务队列更新 LastActivity 值。如果任务因争用而失败,它将使用指数退避并重试。