Je suis en train d'écrire une fonction de discussion (comme celle de Faceboook.com) pour un site Google App Engine. J'ai besoin d'un moyen de garder une trace de ce que les utilisateurs ont de nouveaux messages. J'essaie d'utiliser actuellement Memcache:GAE Chat Persistance des données dans Memcache
class Message():
def __init__(self, from_user_key, message_text)
self.from_user_key = from_user_key
self.message_text = message_text
class NewMessages():
def __init__(self):
self.messages = []
def add_message(self, message):
self.messages.append(message)
def get_messages(self):
return self.messages
def messages_sent(self):
self.messages = [] #Clear all messages
def ChatUserManager():
def load(user_key):
manager = memcache.get("chat_user_%s" % user_key)
if manager is not None:
return manager
else:
manager = ChatUserManager(user_key)
memcache.set("chat_user_%s" % user_key, manager)
return manager
def save(self):
memcache.set("chat_user_%s" % user_key, self)
def __init__(self, user_key):
self.online = True
self.new_messages = NewMessages()
self.new_data = False
self.user_key = user_key
def recieve_message(self, message):
self.new_data = True
self.new_messages.add_message(Message(from_user_key, message_text))
def send_message(self, message):
to_manager = ChatUserManager.load(message.from_user_key)
to_manager.recieve_message(message)
def client_receive_success(self):
self.new_data = False
self.new_messages.messages_sent()
Cette discussion est un utilisateur à, comme Facebook ou d'une session de messagerie instantanée, pas le chat de groupe.
Chaque utilisateur interrogera une URL avec ajax pour obtenir de nouveaux messages toutes les x secondes. Le gestionnaire de chat sera chargé sur cette page (ChatUserManager.load (user_key)) et les nouveaux messages seront vérifiés. Lorsqu'ils sont envoyés, le gestionnaire sera informé que les messages ont été envoyés (manager.client_receive_success()), puis sauvegardé dans memcache (manager.save()).
Lorsqu'un utilisateur envoie un message dans le client javascript, il envoie une requête ajax à un URL. L'URL chargera le UserChatManager du client et appellera .send_message (Message (to_user_key, message_string))).
Je suis préoccupé par la praticité de ce modèle. Si tout est dans memcache, comment sera-t-il synchronisé sur différentes pages?
Y a-t-il une meilleure façon de procéder?
Je reconnais que je ne suis pas encore un python pro, donc le code n'est peut-être pas très pythonique, y a-t-il des bonnes pratiques qui me manquent?
L'utilisation de memcache + repli de la banque de données (Vérifier memcache, sinon: obtenir depuis le magasin de données et définir la clé memcache) est-elle efficace? Je me rends compte que memcache est transitoire mais pour une fonctionnalité de discussion, cela ne devrait pas trop poser de problème? J'ai seulement besoin des nouvelles données de message dans memcache à 5min max (je vais mettre l'expiration là aussi). –
Dépend de la "qualité de service" avec laquelle vous pouvez vivre: vous pouvez jouer avec les probabilités et aller avec memcache jusqu'au bout OU écrire sur le datastore & memcache en utilisant différentes stratégies: par ex. accumuler un tas de données dans memcache et faire des "sauvegardes" programmées dans le datastore, etc. – jldupont