2
我已經寫了一個基於gevent的程序,它允許其Web客戶端通過它快速交換消息(因此它的工作原理類似於集線器)。從memcache中讀取數據有時會失敗
由於此刻我只支持輪詢機制,所以我寫了它來存儲需要在服務器端的「收件箱」中傳遞給特定客戶端的消息。雖然客戶端列表存儲在MySQL中,但這些收件箱存儲在內存緩存中以加快訪問速度。當客戶端連接到集線器時,它將收集收件箱中累積的所有消息。
問題
的問題是,一旦在很短的,而收件人不拉他們的收件箱中的內容時收到他們的郵件 - 他們收到一個空數組。
更讓我感到困惑的是,如果我重新啓動集線器,客戶未收到的消息將突然實現並傳送到目的地。
你能指出我的代碼中是否有明顯的缺陷?你對此有任何解釋嗎?
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是一種緩存機制,如果失敗,數據將會丟失? – 2010-10-11 09:27:06
是的,我是。這些消息的性質允許這種行爲。無論如何,我可以輕鬆添加持久性存儲,但修復此錯誤是當前的優先事項。 – dpq 2010-10-11 09:47:24