2009-07-26 2 views
10

Je suis intriguée par la façon dont les singletons fonctionnent dans Google App Engine (ou tout environnement de serveur distribué). Étant donné que votre application peut être exécutée dans plusieurs processus (sur plusieurs machines) à la fois, et que les requêtes peuvent être routées, ce qui se passe réellement sous le capot quand une application fait quelque chose comme: 'CacheManager.getInstance()'? Je n'utilise que le cache (GAE) CacheManager comme exemple, mais mon point est, il y a une instance d'application globale unique d'un singleton quelque part, alors où vit-il? Un RPC est-il invoqué? En fait, comment l'état de l'application globale (comme les sessions) est-il traité de manière générale?Comment fonctionnent les singletons dans Google App Engine (ou plus généralement dans un environnement de serveur distribué)?

Cordialement, Shane

Répondre

12

Les singletons dans App Engine Java sont par exécution, pas par application Web. Leur but est simplement de fournir un point d'accès unique au service sous-jacent (qui, dans le cas de Memcache et de l'API Users, est accessible via un RPC), mais ce n'est qu'un modèle de conception pour la bibliothèque. partout où ces méthodes accèdent.

+0

C'est comme ça que j'ai prédit que ça marcherait, c'est sympa de l'avoir éclairci. À votre santé. :) – Shane

3

Caches sont généralement liés à une sorte de cache répliqué distribués. Par exemple, GAE utilise une version personnalisée de memcached pour gérer la gestion d'un cache partagé d'objets sur un cluster, tout en maintenant l'état de stockage dans un état cohérent. En général, il y a beaucoup de solutions à ce problème avec beaucoup de compromis à faire en termes de performances et de cohérence du cache (par exemple, est-il critique que tous les caches correspondent à 100% du temps? contre la perte, etc.).

Voici quelques échantillons de produits avec des fonctionnalités de mise en cache distribué (la plupart ont des documents décrivant les compromis de différentes approches en détail:

Comme vous pouvez le voir, il y a eu de nombreux projets qui ont abordé ce problème. Une solution possible consiste simplement à partager un seul cache sur une seule machine, cependant, la plupart des projets rendent possible une sorte de réplication et de basculement distribué.

+0

Merci pour les exemples de cache, mais j'utilisais le cache comme un exemple d'utilisation d'un singleton de développement web. Je pourrais aussi facilement être le singleton des utilisateurs. Comme je l'ai dit dans la réponse ci-dessus, je suis troublé par l'idée qu'un objet singleton persiste après une phase de demande/réponse. Je comprends que vous ne pouvez pas supposer que quelque chose survit à une demande, alors j'essaie de comprendre ce que le singleton signifie réellement, et ce qu'il fait exactement dans un environnement Web distribué. En attendant, je vais étudier le code pour les exemples de cache que vous avez donnés, pour voir ce qu'ils font. – Shane

+0

J'ai donné les exemples de mise en cache, car il n'y a pas de réponse unique à cette question. Si vous voulez que le singleton soit par VM (ou même par requête), vous ne le distribuerez pas du tout. D'un autre côté, si vous souhaitez partager le singleton sur plusieurs machines virtuelles et demandes, vous finirez par utiliser une sorte de solution de mise en cache. La même chose est vraie pour la gestion de session. Je soupçonne que les «singletons» auxquels vous faites allusion ne sont en réalité que des VM individuelles (peut-être même par requête) utilisées pour accéder à un client pour des ressources partagées. – jsight

0

Je ne sais pas sur les détails de GAE, mais généralement dans une application web de cette taille, vous aurez plusieurs processus en cours d'exécution sur plusieurs machines (puis équilibrage de charge entre eux). Dans chaque processus, si vous utilisez un serveur Web multithread, vous pouvez gérer plusieurs demandes. Ainsi, cela vous permettrait de partager des objets entre des demandes au sein du même serveur Web (et un singleton, par exemple, vous instancieriez lorsque le processus de l'application Web commence).

Si le serveur Web n'est pas multi-thread, mais plutôt multi-processus, vous ne pouvez pas partager des objets entre les demandes pour autant que je sache, sans parler d'un processus de mise en cache séparée. Les docs GAE semblent soutenir ce qu'ils appellent "App Caching" qui vous permet essentiellement de faire la même chose, mais je ne comprenais pas clairement à partir des docs s'ils le faisaient en utilisant un web multi-thread. serveurs ou tout autre processus de mise en cache qui s'exécute à côté des serveurs Web.

Je serais intrigués de savoir si CacheManager.getInstance()toujours résout au même objet, ou si elle est seulement le même objet pour les demandes traitées par le même serveur Web. En réalité, cela n'a pas d'importance car c'est seulement utilisé pour parler au processus memcached séparé de toute façon.

+0

J'aurais pensé que la nature même d'un singleton signifierait qu'il doit se résoudre à la même instance d'objet. Quand je pense à la requête, je ne m'attends littéralement jamais à avoir une affinité de processus, en particulier avec Google App Engine. Je m'attends à ce qu'une demande soit envoyée en Australie et que la suivante soit envoyée aux États-Unis, de sorte que la seule méthode que je puisse envisager pour un cas fiable est un RPC à un contrôleur central qui dépose l'objet. Cela me semble tellement anti-échelle, d'où mon intérêt. L'exemple memcache est un cas délicat dans un environnement cloud réparti sur plusieurs centres de données. – Shane

Questions connexes