我正在为Google App Engine网站编写聊天功能(如Faceboook.com)。我需要一种方法来跟踪用户有什么新消息。我目前正在尝试使用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或IM会话,而不是群聊。
每个用户都会使用ajax轮询一个网址,每隔x秒就会收到一封发给他们的新邮件。聊天管理器将加载到该页面(ChatUserManager.load(user_key)),并将检查新消息。当它们被发送时,管理器将被告知已经发送了消息(manager.client_receive_success()),然后保存回memcache(manager.save())。
当用户在javascript客户端发送消息时,它会向URL发送ajax请求。 url将加载客户端的UserChatManager并调用.send_message(Message(to_user_key,message_string)))。
我很担心这个模型的实用性。如果所有内容都在memcache中,它将如何在不同页面之间同步?
有更好的方法吗?
我承认我还不是python pro,所以代码可能不是非常pythonic,有没有我缺少的最佳实践?
答案 0 :(得分:3)
问题不在于如何在“页面”之间共享数据,而是使用memcache
将如何影响服务的可用性。
在memcache中没有与数据持久性相关的保证:有一次它在那里,另一个它可能没有。