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

时间:2011-06-14 20:13:23

标签: google-app-engine messaging non-relational-database

我正在构建一个将在Google AppEngine上托管的线程邮件系统

我按照Brett Slatkin在Building Scalable, Complex Apps on App Engine

中描述的技术对其进行了建模
class Message(db.Model):
  sender = db.StringProperty()
  body = db.TextProperty()

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

问题我必须确定跟踪用户的消息状态的最有效方法。 例如,针对特定用户的消息readarchiveddeleted

这是我到目前为止提出的解决方案。

我正在使用Datastore+的StructuredProperty为消息添加状态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位于同一实体组中,因此消息数据存储区写入将受到限制。

Full Source Code

实现这一目标的最有效方法是什么?添加额外的实体组会是更好的解决方案吗?

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

1 个答案:

答案 0 :(得分:2)

对于最简单的查询 - 将“接收者”列表拆分为四个不同的列表 - “未读”,“读取”,“存档”,“删除”并在适当的位置随机播放接收者记录。