La question est claire comme vous le voyez dans le titre, je serais ravi d'entendre vos idées sur adv./disadv. différences entre eux.
MISE À JOUR: J'ai décidé d'utiliser Hazelcast en raison des avantages comme le mécanisme de mise en cache/verrouillage distribué ainsi que la configuration extrêmement facile tout en l'adaptant à votre application.
Nous avons essayé les deux pour l'une des plus grandes annonces en ligne et plateforme de commerce électronique. Nous avons commencé avec ehcache/terracotta (baie de serveurs) car il est bien connu, soutenu par Terracotta et bénéficie d'un plus grand support communautaire que Hazelcast.
.
Hazelcast est très simple, il fait ce qu'il dit et fonctionne très bien sans aucune surcharge de configuration.
Notre couche de mise en cache est au-dessus de Hazelcast depuis plus d'un an, nous en sommes très satisfaits.
Même si Ehcache a été populaire parmi les systèmes Java, je le trouve moins flexible que les autres solutions de mise en cache. J'ai joué avec Hazelcast et oui, il a fait le travail, il était facile de s'exécuter, etc. et il est plus récent qu'Ehcache. Je peux dire qu'Ehcache a beaucoup plus de fonctionnalités que Hazelcast, est plus mature et a un grand support derrière.
Il existe également plusieurs autres bonnes solutions de cache, avec toutes les différentes propriétés et solutions telles que le bon vieux Memcache, Membase (maintenant CouchBase), Redis, AppFabric, même plusieurs solutions NoSQL qui fournissent des magasins de valeurs clés avec ou sans persistance. Ils ont tous des caractéristiques différentes dans le sens où ils mettent en œuvre le théorème CAP ou le théorème BASE avec les transactions.
Vous devriez vous préoccuper davantage de la fonctionnalité dont vous avez besoin dans votre application, encore une fois, vous devriez considérer le théorème CAP ou le théorème BASE pour votre application.
Cette test a été réalisée très récemment avec Cassandra sur le cloud par Netflix. Ils ont atteint millions d'écritures par seconde avec environ 300 instances. Cassandra n'est pas un cache mémoire mais votre modèle de données est comme un cache, qui est composé de paires de valeurs clés. Vous pouvez également utiliser Cassandra comme cache mémoire distribué .
Hazelcast a été un cauchemar à grande échelle et la stabilité est toujours un problème majeur.
Le client dédié aux choix de composants de réseau est
Si un hôte pouvait demander des enregistrements à partir de cette grille de données, ce serait une conception douce, mais vous êtes coincé avec ces deux options terne pour en tirer quelque chose.
De plus, plusieurs problèmes avec les pools de threads de base de données se bloquant sur des membres individuels et n'écrivant rien dans les bases de données, entraînant une perte permanente d'enregistrements, sont un problème fréquent et nous devons souvent arrêter le tout pendant des heures pour actualiser l'une des machines virtuelles Java. Le split brain est également toujours un problème, bien qu'en 1.9.6 il semble s'être un peu calmé.
Se rallier pour passer à Ehcache et améliorer la couche de base de données au lieu de l'utiliser comme un pansement.
Hazelcast a été un cauchemar pour moi. J'ai pu le faire "fonctionner" dans un environnement Websphere en cluster. J'utilise vaguement le terme "travailler". Tout d'abord, toute la documentation de Hazelcast est obsolète et ne montre que des exemples utilisant des appels de méthode obsolètes. Essayer d'utiliser le nouveau code sans commentaires dans les Javadocs et aucun exemple dans la documentation est très difficile. En outre, le code de conteneur J2EE ne fonctionne tout simplement pas à ce stade car il ne prend pas en charge les transactions XA dans Websphere. Une erreur est levée en appelant du code qui suit explicitement leur seul exemple J2EE (il semble que Milestone 3.0 résout ce problème). J'ai dû oublier de rejoindre Hazelcast pour une transaction J2EE. Il semble que Hazelcast soit définitivement adapté à un environnement de conteneur non EJB/Non J2EE. Faire des appels à Hazelcast.getAllInstances () ne conserve aucune information sur l'état de Hazelcast lors du passage d'une entreprise Java bean à une autre. Cela m'oblige à créer une nouvelle instance Hazelcast juste pour exécuter des appels qui donnent moi l'accès à mes données. Cela provoque le démarrage de nombreuses instances Hazelcast sur la même machine virtuelle Java. En outre, la récupération de données à partir de Hazelcast n'est pas rapide. J'ai essayé de récupérer des données à la fois avec Native Client et directement en tant que membre du cluster. J'ai stocké 51 listes, ne contenant chacune que 625 objets dans Hazelcast. Je ne pouvais pas effectuer une requête directement sur une liste et je ne voulais pas stocker une carte juste pour avoir accès à cette fonctionnalité (les opérations SQL peuvent être effectuées sur une carte). une demi-seconde pour récupérer chaque liste de 625 objets parce que Hazelcast sérialise la liste entière et l'envoie sur le fil plutôt que de simplement me donner le delta (ce qui a changé). Une autre chose, j'ai dû passer à une configuration TCPIP et lister explicitement l'ip adresses des serveurs Je voulais être dans le cluster. La configuration de multidiffusion par défaut n'a pas fonctionné et à partir des discussions de groupe dans Google, d'autres personnes rencontrent également cette difficulté. Pour résumer; J'ai finalement réussi à faire communiquer 8 machines dans un cluster à travers de nombreuses heures de configuration programmatique tortueuse et d'essais et d'erreurs (la documentation ne sera pas d'une grande aide) mais quand je l'ai fait, je n'avais toujours aucun contrôle sur le nombre d'instances et de partitions créées sur chaque JVM en raison de la nature à moitié finie de Hazelcast pour EJB/J2EE et c'était TRÈS LENT. J'ai implémenté un cas d'utilisation réel dans l'application d'assurance chômage sur laquelle je travaille et le code a été beaucoup plus rapide pour appeler directement la base de données. Cela aurait été cool si Hazelcast fonctionnait comme annoncé parce que je ne voulais vraiment pas utiliser un service séparé pour implémenter ce que j'essaie de faire. J'ai beaucoup utilisé MongoDB, je peux donc ignorer le tout dans le cache mémoire et simplement sérialiser mes objets en tant que documents dans un référentiel séparé.
Hazelcast sérialise tout à chaque fois qu'il y a un nœud (standard-un), donc les données que vous enregistrez dans Hazelcast doivent implémenter la sérialisation.
Un des avantages d'Ehcache est qu'il est soutenu par une entreprise (Terracotta) qui effectue des tests étendus de performances, de basculement et de plate-forme dans un grand laboratoire de performances. La terre cuite fournit un soutien, une indemnité, etc. Pour de nombreuses entreprises, ce genre de chose est important.
Je n'ai pas utilisé Hazelcast mais j'ai entendu dire qu'il est facile à utiliser et qu'il fonctionne. Je n'ai rien entendu concernant l'évolutivité ou les performances de Hazelcast vs Terracotta/Ehcache, mais étant donné la quantité d'évolutivité et de tests de basculement que Terracotta fait, il est difficile pour moi d'imaginer que Hazelcast serait compétitif dans un déploiement de production. Mais je suppose que cela fonctionnerait bien pour des utilisations plus petites.
[Biais: je suis un ancien employé de Terracotta.]