Memcacheからデータを読むことが失敗することがあります
質問
私は書いた Gevent- ウェブクライアントがメッセージを迅速にメッセージを交換できるようにするベースのプログラム(したがって、ハブのように機能します)。
私は現時点でのポーリングメカニズムのみをサポートするため、サーバー側の「受信トレイ」の特定のクライアントに配信する必要があるメッセージを保存するためにそれを書きました。クライアントリストはMySQLに保存されていますが、これらの受信トレイはMemcacheに保存され、アクセスを高速にします。クライアントがハブに接続すると、受信トレイに蓄積されたすべてのメッセージをプルします。
質問
問題は、一度だけ受信者が受信トレイの内容を引くときにメッセージを受け取らないことです - 空の配列を受け取ることです。
さらに私を困惑させるのは、ハブを再起動すると、クライアントが受け取っていないメッセージが突然実現し、目的地に配信されることです。
私のコードに明白な欠陥がある場合、あなたは私を向けてもらえますか?この効果について説明はありますか?
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 []
解決
私はそれを手に入れたと思います:それはaです バグ Python-Memcacheモジュールで。
所属していません StackOverflow