具有消息状态的 App Engine 消息系统 - 设计模式

发布于 2024-11-15 05:14:57 字数 1454 浏览 4 评论 0原文

我正在构建一个将托管在 Google AppEngine 上的线程消息系统,

我按照 Brett Slatkin 在 在 App Engine 上构建可扩展的复杂应用程序

class Message(db.Model):
  sender = db.StringProperty()
  body = db.TextProperty()

class MessageIndex(db.Model):
  receivers = db.StringListProperty()

我必须确定跟踪消息状态的最有效方法的问题一个用户。 例如,特定用户的消息已读已存档已删除

这是我迄今为止提出的解决方案。

我正在使用 Datastore+ 的 StructuredProperty 向消息添加状态< code>MessageIndex

class Message(model.Model):
  sender = model.StringProperty()
  body = model.TextProperty()

class _DisplayState(model.Model):
  user_key = model.KeyProperty()
  state = model.IntegerProperty(default=0) # 0-unread, 1-read, 2-archived

class MessageIndex(model.Model):
  receivers = model.StructuredProperty(_DisplayState, repeated=True)

此解决方案虽然简单,但却否定了 MessageIndex 的优势。此外,由于 MessageIndex 与消息数据存储位于同一实体组中,写入将受到限制。

完整源代码

完成此任务最有效的方法是什么?添加额外的实体组是否是更好的解决方案?

class MessageState(model.Model):
  user_key = model.KeyProperty()
  message_key = model.KeyPropery()
  message_state = model.IntegerProperty(default=0) # 0-unread, 1-read, 2-archived

I'm building a Threaded Messaging System that will be hosted on Google AppEngine

I've modeled it after the technique described by Brett Slatkin in Building Scalable, Complex Apps on App Engine

class Message(db.Model):
  sender = db.StringProperty()
  body = db.TextProperty()

class MessageIndex(db.Model):
  receivers = db.StringListProperty()

The issue I'm having to determining the most efficient way to track the message state for a User.
For example is a message read, archived, deleted for a particular user.

Here are the solution I have come up with so far.

I'm using Datastore+'s StructuredProperty to add a state to the message MessageIndex

class Message(model.Model):
  sender = model.StringProperty()
  body = model.TextProperty()

class _DisplayState(model.Model):
  user_key = model.KeyProperty()
  state = model.IntegerProperty(default=0) # 0-unread, 1-read, 2-archived

class MessageIndex(model.Model):
  receivers = model.StructuredProperty(_DisplayState, repeated=True)

This solution, while simple, negates the benefit of the MessageIndex. Additionally since the the MessageIndex is in the same entity group as the message datastore writes will be limited.

Full Source Code

What would be the most efficient way to accomplish this? Would adding an additional entity group be a better solution?

class MessageState(model.Model):
  user_key = model.KeyProperty()
  message_key = model.KeyPropery()
  message_state = model.IntegerProperty(default=0) # 0-unread, 1-read, 2-archived

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

谁与争疯 2024-11-22 05:14:57

对于最简单的查询 - 将“接收者”列表拆分为四个不同的列表 -“未读”、“已读”、“已存档”、“已删除”,并根据需要在列表之间调整接收者记录。

For the easiest querying - split your 'receivers' list into four different lists - 'unread', 'read', 'archived', 'deleted' and shuffle the receiver record between the lists as appropriate.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文