2008-09-22 9 views
7

J'évalue Terracotta pour m'aider à faire évoluer une application qui est actuellement limitée par la RAM. Il s'agit d'un filtre collaboratif qui stocke environ 2 kilo-octets de données par utilisateur. Je veux utiliser l'EC2 d'Amazon, ce qui signifie que je suis limité à 14 Go de RAM, ce qui me donne une limite supérieure par serveur d'environ 7 millions d'utilisateurs. Je dois être capable d'évoluer au-delà de ça. D'après ma lecture jusqu'à présent, je pense que Terracotta peut avoir un tas groupé plus grand que la RAM disponible sur chaque serveur. Serait-il viable d'avoir un tas groupé efficace de 30 Go ou plus, où chacun des serveurs ne supporte que 14 Go?Puis-je utiliser Terracotta pour mettre à l'échelle une application gourmande en RAM?

Les données par utilisateur (dont la majeure partie sont des tableaux de flottants) changent très fréquemment, potentiellement des centaines de milliers de fois par minute. Il n'est pas nécessaire que chacun de ces changements soit synchronisé avec les autres nœuds du cluster au moment où ils se produisent. Est-il possible de synchroniser uniquement certains champs d'objet périodiquement?

+0

Un cluster redis fragmenté pourrait être une approche plus simple, cela aurait-il pu fonctionner dans ce scénario? – cobbzilla

Répondre

4

Je dirais que la réponse est un oui qualifié pour cela. Terracotta vous permet de travailler avec des tas groupés plus grands que la taille d'une seule JVM bien que ce ne soit pas le cas d'utilisation le plus courant.

Vous devez toujours garder à l'esprit a) la taille de l'ensemble de travail et b) la quantité de trafic de données. Pour a), il y a un ensemble de données qui doivent être en mémoire pour effectuer le travail à un moment donné et si la taille de l'ensemble de travail> la taille du tas, la performance va évidemment souffrir. Pour b), chaque donnée ajoutée/mise à jour dans le tas groupé doit être envoyée au serveur. Terracotta est le meilleur lorsque vous modifiez les champs à grain fin dans les graphiques pojo. Travailler avec de gros tableaux ne tire pas le meilleur parti des capacités de Terracotta (ce qui ne veut pas dire que les gens ne l'utilisent pas parfois).

Si vous créez beaucoup de déchets, les gestionnaires de mémoire Terracotta et le garbage collector distribué doivent être en mesure de suivre ce rythme. Il est difficile de dire sans l'essayer si vos volumes de données dépassent la bande passante disponible.

Votre application bénéficiera énormément si vous exécutez plusieurs serveurs et que les données sont partitionnées par le serveur ou ont une certaine quantité de localité de référence. Dans ce cas, vous n'avez besoin que des données pour la partition d'un serveur en tas et le reste n'a pas besoin d'être mis en mémoire. Il sera bien sûr blâmé si nécessaire pour le basculement/disponibilité si d'autres serveurs tombent en panne. Cela signifie que dans le cas de données partitionnées, vous ne diffusez pas sur tous les nœuds, mais seulement sur le serveur. D'un point de vue numérique, il est possible d'indexer 30 Go de données, ce qui n'est pas proche d'une limite stricte.

+0

Suivi rapide: J'ai entendu dire que si vous utilisez une HashMap avec Terracotta, les valeurs peuvent être distribuées, mais les clés seront reflétées partout. Est-ce vrai? Est-ce qu'une autre collection de cartes se comportera différemment? – sanity

+0

Correct. HashMap, ConcurrentHashMap, etc. maintiendra un jeu de clés complet sur tous les nœuds. Si nous ne le faisons pas, il est difficile de savoir si l'absence d'une clé est due à une clé non locale ou à une clé manquante. Une solution de rechange courante consiste à créer des cartes de cartes pour permettre l'extraction de plus de données. –

+0

Je dois souligner que c'est un détail d'implémentation qui est ponctuel. Alex a raison de dire que c'est plus facile de faire comme ça mais rendre le jeu de clés virtuel n'est pas impossible c'est juste du travail;) –

Questions connexes