Чтение данных из Memcache иногда терпит неудачу

StackOverflow https://stackoverflow.com/questions/3904547

  •  29-09-2019
  •  | 
  •  

Вопрос

Я написал Гевент-На основе программы, которая позволяет своим веб -клиентам быстро обмениваться через него сообщения (так что она работает как концентратор).

Поскольку в данный момент я поддерживаю только механизм опроса, я написал его для хранения сообщений, которые необходимо доставлять конкретному клиенту в его «почтовом ящике» на стороне сервера. В то время как список клиентов хранится в 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 []
Это было полезно?

Решение

? ?????, ??? ? ??????? ???: ??? ?????? ? python- Memcache ??????.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top