2011-06-14 111 views
2

我建设,将在谷歌AppEngine上托管一个线程消息系统App Engine的消息系统,消息状态 - 设计模式

我在Building Scalable, Complex Apps on App Engine

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

class MessageIndex(db.Model): 
    receivers = db.StringListProperty() 
由Brett斯拉特金所描述的技术模仿它

我不得不确定追踪用户消息状态的最有效方法。 例如,针对特定用户的消息readarchived,deleted

下面是我到目前为止所提出的解决方案。

我使用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 
+0

你打算发送每封邮件给多少人? – 2011-06-15 03:59:21

+0

@Nick Johnson理想情况下,我希望系统能够处理2个用户之间的私人按摩,以及将在10,000个人的群组通知中的任何内容 – 2011-06-15 05:48:24

回答

2

对于最简单的查询 - 分割你的“接收器”列表分为四个不同的列表 - “未读”,“读”,“存档”,“删除”和洗牌列为相应的接收器记录。

+0

感谢Kevin,我更喜欢这个,现在我拥有了。另一个问题,目前收件箱中包含“未读”和“读”信息。使用你的技术,得到这些消息,你会推荐两个查询,然后在内存合并?或者,最好将'未读'和'读''合并到'收件箱'列表中。然后使用其他技术读取状态,考虑到这是一个更常见的变化属性。 – 2011-06-15 03:01:39

+0

如果您最常用的是阅读和未阅读状态项目,我们会按照您的建议,制作一个组合的“收件箱”列表,该列表仍可与未读列表一起使用。 – 2011-06-15 15:16:34

+0

另外 - 考虑到你对尼克问题的回应,我会考虑在你的消息索引中实现某种分片。 – 2011-06-15 15:18:23