Я пишу функцию чата (например, Faceboook.com) для сайта Google App Engine. Мне нужен способ отслеживать, какие пользователи получают новые сообщения. В настоящее время я пытаюсь использовать 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()
Этот чат является пользователем для пользователя, как Facebook или сеанс обмена мгновенными сообщениями, а не групповой чат.
Каждый пользователь будет опрашивать URL с помощью ajax, чтобы получать новые сообщения, адресованные ему каждые x секунд. Менеджер чата будет загружен на эту страницу (ChatUserManager.load (user_key)), и будут проверяться новые сообщения. Когда они отправляются, менеджеру сообщают, что сообщения отправлены (manager.client_receive_success ()), а затем сохраняются обратно в memcache (manager.save ()).
Когда пользователь отправляет сообщение в клиенте javascript, он отправляет запрос ajax на URL. URL загрузит клиентский UserChatManager и вызовет .send_message (Сообщение (to_user_key, message_string))).
Меня беспокоит практичность этой модели. Если все находится в memcache, как он будет синхронизироваться на разных страницах?
Есть ли лучший способ сделать это?
Я признаю, что я еще не профессионал в Python, поэтому код может быть не очень питоническим, есть ли какие-то лучшие практики, которые мне не хватает?