Чтение данных из Memcache иногда терпит неудачу
Вопрос
Я написал Гевент-На основе программы, которая позволяет своим веб -клиентам быстро обмениваться через него сообщения (так что она работает как концентратор).
Поскольку в данный момент я поддерживаю только механизм опроса, я написал его для хранения сообщений, которые необходимо доставлять конкретному клиенту в его «почтовом ящике» на стороне сервера. В то время как список клиентов хранится в 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 []
Решение