Постоянство данных чата GAE в Memcache - PullRequest
1 голос
/ 21 февраля 2010

Я пишу функцию чата (например, 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, поэтому код может быть не очень питоническим, есть ли какие-то лучшие практики, которые мне не хватает?

1 Ответ

3 голосов
/ 21 февраля 2010

Проблема не столько в том, как обмениваться данными между «страницами», сколько в том, как на удобство использования сервиса повлияет использование memcache.

Нет никаких гарантий, связанных с сохранением данных в memcache: в один момент это происходит, а в другое - нет.

...