10
votes

Comment les singletons de Google App Moteur (ou plus généralement dans un environnement de serveur distribué)?

Je suis intrigué de la manière dont SingletSons fonctionnent dans Google App Moteur (ou tout environnement de serveur distribué). Compte tenu de votre application, vous pouvez exécuter plusieurs processus (sur plusieurs machines) à la fois et les demandes peuvent être acheminées tout de l'endroit, ce qui se passe réellement sous la hotte quand une application fait quelque chose comme: 'Cachemanager.getinstance ()'?

J'utilise simplement le (Gae) Cachemanager à titre d'exemple, mais mon point est, il existe une seule instance d'application globale d'un singleton quelque part, alors où vit-il? Un RPC est-il invoqué? En fait, comment l'état de l'application global (comme des sessions) a-t-il réellement manipulé en général?

Cordialement, Shane


0 commentaires

3 Réponses :


3
votes

Les caches sont généralement liées à une sorte de cache répliquée distribuée. Par exemple, GAE utilise une version personnalisée de MEMCACHED pour gérer le maintien d'une cache d'objets partagée sur un cluster , tout en maintenant l'état de stockage dans un état cohérent. En général, il existe de nombreuses solutions pour ce problème avec de nombreux compromis différents à effectuer en termes de performance et de cohérence de cache (par exemple, il est essentiel que tous les caches correspondent à 100% du temps, le cache doit être écrit sur le disque pour protéger contre la perte, etc.).

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

  • MEMCACHED - C avec beaucoup d'API clients et de ports de langue
  • ehcache - Cache Java OSS, avec adoption généralisée
  • JBoss Cache - une autre solution Java OSS de Java
  • cohérence Oracle (anciennement tangosol cohérence) - Probablement le meilleur Cache commerciale Java connue.
  • indexus cache - une solution populaire .NET OSS
  • NCache - probablement la solution de mise en cache commerciale la plus populaire .NET

    Comme vous pouvez le constater, de nombreux projets ont abordé ce problème. Une solution possible consiste simplement à partager un seul cache sur une seule machine. Cependant, la plupart des projets apportent une sorte de réplication et de basculement distribué possible.


2 commentaires

Merci pour les exemples de cache, mais j'utilisais le cache comme un exemple d'une utilisation de développement Web Singleton. Je pourrais aussi facilement être les utilisateurs singleton. Comme je le dis dans la réponse ci-dessus, je suis confus par l'idée de certains objets singleton persistant après une phase de demande / de réponse. C'est ma compréhension que vous ne pouvez pas assumer rien survivre à une demande. J'essaie donc de comprendre ce que signifie le singleton et ce qu'il fait exactement dans un environnement Web distribué. En attendant, j'étudierai le code des exemples de cache que vous avez donnés, pour voir ce qu'ils font.


J'ai donné des 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 demande), vous ne le distribueriez pas du tout. D'autre part, si vous souhaitez partager le singleton sur plusieurs ordinateurs virtuels et demandes, vous finiriez par utiliser une sorte de solution de mise en cache. Il en va de même pour la manipulation de la session. Je soupçonne que les "singletons" que vous faites référence sont vraiment juste par VM (éventuellement même par demande) singulons utilisés pour accéder à un client pour des ressources partagées.



0
votes

Je ne suis pas sûr des spécificités de GAE, mais généralement dans une application Web cette taille, vous aurez plusieurs processus en cours d'exécution sur un certain nombre de machines (puis de l'équilibre de chargement entre eux). Dans chaque processus, si vous utilisez un serveur Web multi-threadé, vous pouvez gérer plusieurs demandes. Cela vous permettra donc de partager des objets entre les demandes dans le même serveur Web (et un singleton, par exemple, vous serez instancier lorsque le processus d'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 autant que je sache, sans parler à un processus de mise en cache distinct.

Les Docs GAE semblent supporter ce qu'ils appellent "Application de l'application", ce qui vous permet essentiellement de faire la même chose, mais cela ne m'a pas clairement clair que celui-ci en utilisant des serveurs Web multi-threads , ou un autre processus de mise en cache qui se déroule aux côtés des serveurs Web.

Je serais intrigué de savoir si Cachemanager.getinstance () toujours est résolu au même objet, ou s'il n'est que le même objet pour les demandes traitées par le même serveur Web. En réalité, peu importe que cela ne soit utilisé que pour parler du processus memcached distinct de toute façon.


1 commentaires

J'aurais pensé que la nature même d'un singleton signifierait qu'il doit se résoudre à la même instance d'objet. Lorsque je pense que je pense que je ne m'attends pas littéralement que si elle ait une affinité de processus, en particulier avec Google App Moteur. Je m'attends à ce que la simple demande d'aller en Australie et à la suivante pour aller aux États-Unis, donc sur cette base, la seule méthode que je peux penser pour un cas fiable est un RPC à une sorte de contrôleur central qui pleure l'objet. Cela semble tellement anti-échelle pour moi, d'où mon intérêt. L'exemple MemCache est un cas délicat dans un environnement nuageux réparti sur plusieurs centres de données.



13
votes

Les singletons du moteur d'application Java sont per-runtime et non par webApp. Leur objectif est simplement de fournir un seul point d'accès au service sous-jacent (qui, dans le cas de l'API MemCache et des utilisateurs, est accessible via un RPC), mais c'est purement un modèle de conception pour la bibliothèque - il n'y a pas de singleton Per-App n'importe où que ces méthodes accèdent.


1 commentaires

C'est comme ça que j'ai prédit que cela fonctionnerait, c'est bien de le faire effacer cependant. À votre santé. :)