2010-10-11 3 views
2

J'ai écrit un programme basé sur le gevent qui permet à ses clients Web d'échanger rapidement des messages (il fonctionne donc comme un concentrateur). Comme je ne prends en charge que le mécanisme d'interrogation, je l'ai écrit pour stocker les messages qui doivent être remis à un client spécifique dans sa «boîte de réception» côté serveur. Alors que la liste des clients est stockée dans MySQL, ces boîtes de réception sont stockées dans memcache pour un accès plus rapide. Lorsqu'un client se connecte au concentrateur, il extrait tous les messages qui se sont accumulés dans sa boîte de réception.La lecture des données de memcache échoue parfois

La question
Le problème est qu'une fois sur un court alors que les destinataires ne reçoivent pas leurs messages en tirant le contenu de leur boîte de réception - ils reçoivent un tableau vide.
Ce qui me surprend encore plus, c'est que si je redémarre le concentrateur, les messages qui n'ont pas été reçus par les clients se concrétiseront soudainement et seront livrés à leur destination.
Pouvez-vous me signaler s'il y a un défaut flagrant dans mon code? Avez-vous des explications à ce sujet?

push est la méthode qui est exécutée pour placer un message dans la boîte de réception d'un client. pull est la méthode qui récupère la liste de tous les messages accumulés sous forme de liste et les renvoie à la fonction de traitement principale.

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 [] 
+0

Question évidente: vous savez, bien sûr, que memcache est un mécanisme de mise en cache et qu'en cas d'échec, les données seront perdues? –

+0

Oui, je suis. La nature de ces messages permet un tel comportement. En tout cas, je peux facilement ajouter du stockage persistant, mais la correction de ce bug est actuellement une priorité. – dpq

Répondre

0

Je pense que je l'ai compris: c'est un bug dans le module python-memcache.

Questions connexes