メッセージステータスを備えたアプリエンジンメッセージングシステム - デザインパターン
-
27-10-2019 - |
質問
Google Appengineでホストされるスレッドメッセージングシステムを構築しています
Brett Slatkinが説明したテクニックをモデルにしました アプリエンジンにスケーラブルで複雑なアプリを構築します
class Message(db.Model):
sender = db.StringProperty()
body = db.TextProperty()
class MessageIndex(db.Model):
receivers = db.StringListProperty()
ユーザーのメッセージ状態を追跡する最も効率的な方法を決定しなければならない問題。たとえば、メッセージです read
, archived
, deleted
特定のユーザーの場合。
これが私がこれまでに思いついた解決策を紹介します。
私は使用しています DataStore+メッセージに状態を追加するための構造化されたプロパティ 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はメッセージDataStoreが書いているメッセージと同じエンティティグループにあるため、制限されます。
これを達成するための最も効率的な方法は何ですか?追加のエンティティグループを追加することはより良いソリューションでしょうか?
class MessageState(model.Model):
user_key = model.KeyProperty()
message_key = model.KeyPropery()
message_state = model.IntegerProperty(default=0) # 0-unread, 1-read, 2-archived
解決
最も簡単なクエリの場合 - 「受信機」リストを4つの異なるリストに分割します - 「未読」、「読み取り」、「アーカイブ」、「削除」、必要に応じてリスト間で受信者レコードをシャッフルします。
所属していません StackOverflow