【发布时间】:2011-04-23 16:53:18
【问题描述】:
我编写了一个基于 gevent 的程序,它允许其网络客户端通过它快速交换消息(因此它就像一个集线器一样工作)。
由于我目前只支持轮询机制,所以我编写了它来将需要传递给特定客户端的消息存储在服务器端的“收件箱”中。虽然客户端列表存储在 MySQL 中,但这些收件箱存储在 memcache 中以便更快地访问。当客户端连接到集线器时,它会提取其收件箱中累积的所有消息。
问题
问题是,收件人在提取收件箱的内容时没有收到他们的消息 - 他们收到一个空数组。
更让我困惑的是,如果我重新启动 hub,客户端没有收到的消息会突然实体化并传递到他们的目的地。
如果我的代码有明显的缺陷,你能指出我吗?你对这个效果有什么解释吗?
push 是执行将消息放入客户端收件箱的方法。 pull是将所有累积消息的列表作为列表检索并返回给主处理函数的方法。
def __push(self, domain, message, tid=None):
if tid:
try:
messages = self.mc.get("%s_inbox" % tid.encode('utf8'))
except:
logging.error("__push memcached failure", exc_info=1)
if messages:
messages = fromjson(messages)
messages.append(message)
self.mc.set("%s_inbox" % tid.encode('utf8'), tojson(messages))
print "Pushed to", "%s_inbox" % tid.encode('utf8')
def __pull(self, tid):
try:
messages = self.mc.get("%s_inbox" % tid.encode('utf8'))
if messages:
self.mc.set("%s_inbox" % tid.encode('utf8'), "[]")
return fromjson(messages)
else:
return []
except:
logging.error("__pull failure", exc_info=1)
return []
【问题讨论】:
-
显而易见的问题:您当然知道,memcache 是一种缓存机制,如果发生故障,数据将丢失?
-
是的,我是。这些消息的性质允许这种行为。在任何情况下,我都可以轻松添加持久存储,但修复此错误目前是当务之急。