PROJET AUTOBLOG


Shaarli - Les discussions de Shaarli

Archivé

Site original : Shaarli - Les discussions de Shaarli du 23/07/2013

⇐ retour index

Hazelcast.org

jeudi 25 juin 2015 à 16:38

Hazelcast permet de monter des clusters Java pour distribuer des maps (associations clé<->valeur). Le tout est stocké en mémoire donc c'est supposé être rapide.

À la base, je voulais qu'une même map soit recopiée intégralement sur tous les membres de mon cluster. L'idée est que j'ai un point d'injection et N points de lecture. L'idée est que l'intégralité des données soit au plus près du code qui va en avoir besoin car 1) je ne sais pas quelle donnée je peux avoir besoin parmi l'ensemble à un instant T car ça dépend du trafic réseau entrant ; 2) j'ai besoin que ça aille vite puisque derrière c'est une topologie Storm qui a besoin des données pour faire un traitement sur un échantillon de paquets réseau entrant... Chaque worker (unité de traitement sur un membre du cluster) Storm lance un client Hazelcast qui se connecte au serveur standalone local qui, lui, fait partie du cluster global avec les autres membres du cluster Storm/Hazelcast.

Hazelcast permet cela avec son implémentation ReplicatedMap. Mais plusieurs problèmes :
   - c'est encore récent et donc pas forcément aussi fiable et performant que le reste des fonctionnalités Hazelcast ;

   - la cohérence des données entre les membres du cluster n'est pas assurée, c'est écrit dans la doc. Pas de retransmit au niveau réseau, rien de rien, contrairement aux map distribuée "standard". Et ça se voit et, dans mon cas d'usage, c'est juste inutilisable ;

   - le client (le worker Storm), se connecte bien au serveur lourd local mais se fait rediriger vers un autre membre du cluster ! Ce qui fait que si tous les autres membres tombent, alors ce client ne pourra pas récupérer la map alors que le serveur standalone a une copie complète de la map en local ! Je n'ai trouvé aucune option de configuration à passer lors de la création d'un ClientConfig pour corriger ce comportement...

   - les ReplicatedMap ne sont pas encore accessibles avec l'API REST (HTTP) http://docs.hazelcast.org/docs/latest/manual/html/restclient.html


Je me suis replié sur une Map distribuée avec un « backup-count » = au nombre de membres dans le cluster Hazelcast. Ainsi, la map est bien répliquée sur chaque membre. On peut aussi se débrouiller avec le near cache (http://docs.hazelcast.org/docs/latest/manual/html/map-nearcache.html) mais je n'ai pas réussi.

L'injection dans une map est longue et bloquante (indépendamment du backup-count) donc je vous recommande donc de créer votre map en local puis de faire un mapHazelcast.putAll(mapLocale) quand vous l'aurez remplie puis de continuer l'actualisation (retrait/ajout d'une entrée de temps en temps) directement dans la map Hazelcast. Ça gagne un temps monstrueux sur 4 map de 750000 entrées (plusieurs heures à 15 mns !).


Bref, ça fonctionne, très bonne lib Java... mais Hazelcast est quand même extrêmement consommateur en RAM.


Je n'ai pas testé les solutions concurrentes comme ehcache qui ont l'air bougrement compliquées avec des dépendances...
(Permalink)