Question

Je travaille sur un jeu multijoueur et il nécessite une file de messages (c'est-à-dire, les messages entrants, les messages sortants, aucun doublon ni les messages supprimés en supposant qu'il n'y ait pas d'expulsions inattendues dans le cache). Voici les files d’attente basées sur memcache:

J'ai appris le concept de la file d'attente memcache auprès de cet article de blog :

Tous les messages sont enregistrés avec un entier comme clé. Il existe une clé qui a la clé suivante et une autre qui contient la clé du message le plus ancien de la file d'attente. Pour y accéder, la méthode incrémentation / décrémentation est utilisée comme méthode atomique. Il existe donc deux clés qui agissent comme des verrous. Ils sont incrémentés, et si la valeur de retour est 1, le processus est verrouillé, sinon, il continue d’augmenter. Une fois le processus terminé, il redéfinit la valeur sur 0. Simple mais efficace. Un inconvénient est que l'entier va déborder, il y a donc une logique en place qui définit les clés utilisées sur 1 une fois que nous sommes proches de cette limite. Comme l'opération d'incrémentation est atomique, le verrou n'est nécessaire que si deux ou plusieurs memcaches sont utilisés (pour la redondance), afin de garder ceux-ci synchronisés.

Ma question est la suivante: existe-t-il un service de file d'attente de messages basé sur memcache pouvant s'exécuter sur App Engine?

Était-ce utile?

La solution

Je serais très prudent en utilisant Google App Engine Memcache de cette manière. Vous avez raison de vous inquiéter à propos des "expulsions de cache inattendues".

Google s’attend à ce que vous utilisiez le memcache pour mettre en cache les données et non pas le stocker . Ils ne garantissent pas de garder les données dans le cache. Dans la documentation GAE :

.
  

Par défaut, les éléments n'expirent jamais.   les articles peuvent être expulsés en raison de la mémoire   pression.

Modifier: Le service de file d'attente simple d'Amazon est toujours présent. Toutefois, il se peut que cela ne réponde pas aux niveaux prix / performances, notamment:

  1. Il y aurait une latence d'appels de Google vers des serveurs Amazon.
  2. Vous devrez payer deux fois pour tout le trafic de données. Vous devrez payer pour que Google quitte Google, puis payer à nouveau pour qu'elle passe sur Amazon.

Autres conseils

J'ai lancé une file d'attente Memcached Simple Python, cela pourrait être utile: http://bitbucket.org/epoz/python-memcache-queue/

Si vous êtes satisfait de la possibilité de perdre des données, ne vous gênez pas. Cependant, gardez à l'esprit que même si memcache a généralement une latence inférieure à celle du magasin de données, comme tout le reste, elle souffrira si vous souhaitez exécuter un nombre élevé d'opérations atomiques sur un seul élément. Ce n'est pas un problème de banque de données, c'est simplement un problème de sérialisation de l'accès.

À défaut, le SQS d'Amazon semble être une option viable.

Pourquoi ne pas utiliser la file d'attente des tâches:
https://developers.google.com/appengine/docs/python/taskqueue/< a>
https://developers.google.com/appengine/docs/java/taskqueue/

Cela semble résoudre le problème sans perte probable de messages dans la file d'attente basée sur Memcached.

Jusqu'à ce que Google mette en place une file d'attente appropriée, pourquoi ne pas utiliser le magasin de données? Comme d’autres l’ont dit, memcache est juste un cache et peut perdre des éléments de la file d’attente (ce qui serait .. mauvais)

Le magasin de données devrait être suffisamment rapide pour répondre à vos besoins - vous n’auriez qu’un modèle de travail simple, plus flexible que memcache, car vous n’êtes pas limité aux paires clé / valeur

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top