私はgeventベースのプログラムを作成しました。これにより、Web クライアントはそれを介してメッセージをすばやく交換できます (したがって、ハブのように機能します)。
現時点ではポーリング メカニズムしかサポートしていないため、特定のクライアントに配信する必要があるメッセージをサーバー側の「受信ボックス」に格納するように記述しました。クライアント リストは 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 []