Sistema de mensajería de motores de aplicaciones con estado de mensaje - Patrón de diseño
-
27-10-2019 - |
Pregunta
Estoy construyendo un sistema de mensajería enhebrado que se alojará en Google Appengine
Lo modelé después de la técnica descrita por Brett Slatkin en Construyendo aplicaciones complejas y escalables en el motor de aplicaciones
class Message(db.Model):
sender = db.StringProperty()
body = db.TextProperty()
class MessageIndex(db.Model):
receivers = db.StringListProperty()
El problema que tengo que determinar la forma más eficiente de rastrear el estado del mensaje para un usuario. Por ejemplo es un mensaje read
, archived
, deleted
para un usuario en particular.
Aquí está la solución que se me ocurrió hasta ahora.
Estoy usando DataStore+S StructuredProperty para agregar un estado al mensaje 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)
Esta solución, aunque simple, niega el beneficio del MessageIndex. Además, dado que el MessageIndex está en el mismo grupo de entidad que el Mensaje DataStore será limitado.
¿Cuál sería la forma más eficiente de lograr esto? ¿Agregar un grupo de entidad adicional sería una mejor solución?
class MessageState(model.Model):
user_key = model.KeyProperty()
message_key = model.KeyPropery()
message_state = model.IntegerProperty(default=0) # 0-unread, 1-read, 2-archived
Solución
Para la consulta más fácil, divida su lista de 'receptores' en cuatro listas diferentes: 'no leído', 'leer', 'archivado', 'eliminado' y baraja el registro del receptor entre las listas según corresponda.