2011-06-14 140 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