
Nous sommes le dĂ©partement de dĂ©veloppement technologique du rĂ©seau de vente au dĂ©tail. Un jour, la direction a fixĂ© l'objectif d'accĂ©lĂ©rer le calcul volumique en utilisant Apache Ignite en conjonction avec MSSQL, et a montrĂ© un site avec de superbes illustrations et des exemples de code Java. Le site m'a immĂ©diatement plu. , dont la description promet des merveilles : vous n'avez pas besoin de dĂ©ployer manuellement votre code Java ou Scala sur chaque nĆud de la grille et de le redĂ©ployer chaque fois qu'il change. En cours de route, il s'est avĂ©rĂ© que le Zero Deployment a des spĂ©cificitĂ©s d'utilisation, dont j'aimerais partager les particularitĂ©s. Sous le cut, rĂ©flexions et dĂ©tails de mise en Ćuvre.
1. Formulation du problĂšme
L'essence du problÚme est la suivante. Il existe un référentiel de points de vente SalesPoint et un référentiel de produits Sku (Stock Keeping Unit). Un point de vente a un attribut « typeMagasin » avec des valeurs « petit » et « grand ». Pour chaque point de vente, un assortiment (liste de produits du point de vente) est connecté (chargé depuis la base de données) et des informations sont fournies sur le fait qu'à partir de la date spécifiée, le produit spécifié
est exclu de l'assortiment ou est ajouté à l'assortiment.
Il est nĂ©cessaire d'organiser un cache partitionnĂ© des points de vente et d'y stocker des informations sur les produits connectĂ©s un mois Ă l'avance. La compatibilitĂ© avec le systĂšme de production exige du nĆud client Ignite qu'il charge les donnĂ©es, qu'il calcule un agrĂ©gat du type (typeMagasin, codeProduit, jour, nombre_de_points_de_vente) et qu'il les exporte de nouveau dans la base de donnĂ©es.
2. Ătude de la littĂ©rature
Je n'ai pas encore d'expérience, donc je commence par les bases. C'est-à -dire par un aperçu des publications.
L'article de 2016 contient un lien vers la documentation du projet Apache Ignite et un reproche concernant l'ambiguïté de cette documentation. Je l'ai relu plusieurs fois, la clarté n'est pas au rendez-vous. Je me tourne vers le tutoriel officiel , qui
qui promet de maniÚre optimiste « Vous serez opérationnel en un rien de temps ! ». J'examine les paramÚtres des variables d'environnement, je regarde deux vidéos sur Apache Ignite Essentials, qui se sont révélées peu utiles pour mon problÚme spécifique. Je réussis à lancer Ignite depuis la ligne de commande avec le fichier standard « example-ignite.xml », et à créer ma premiÚre application. à l'aide de Maven. L'application fonctionne et utilise Zero Deployment, quelle beauté !
Je lis davantage, et lĂ , l'exemple utilise tout de suite affinityKey (créé prĂ©cĂ©demment via une requĂȘte SQL), et en plus, il applique un mystĂ©rieux BinaryObject :
IgniteCache<BinaryObject, BinaryObject> people
= ignite.cache("Person").withKeepBinary(); J'ai lu : format binaire â quelque chose comme la rĂ©flexion, accĂšs aux champs d'objet par nom. Peut lire la valeur d'un champ sans dĂ©sĂ©rialiser complĂštement l'objet (Ă©conomie de mĂ©moire). Mais pourquoi BinaryObject est-il utilisĂ© Ă la place de Person, surtout avec Zero Deployment ? Pourquoi IgniteCache<Key,Person> se traduit-il par IgniteCache<BinaryObject, BinaryObject> ? Pas encore clair.
Je réadapte l'application Compute à mon cas. La clé primaire du répertoire des points de vente dans MSSQL est définie comme [id] [int] NOT NULL, je crée le cache par analogie.
IgniteCache<Integer, SalesPoint> salesPointCache=ignite.cache("spCache")Dans le fichier de configuration XML, j'indique que le cache est partitionné.
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="spCache" />
<property name="cacheMode" value="PARTITIONED" />
< /bean>La partition par points de vente suppose que l'agrĂ©gat requis sera construit sur chaque nĆud du cluster pour les enregistrements existants dans salesPointCache, aprĂšs quoi le nĆud client effectuera une somme finale.
Je lis le tutoriel. , je fais par analogie. Sur chaque nĆud du cluster, je lance IgniteRunnable(), Ă peu prĂšs comme ça :
@Override
public void run() {
SalesPoint sp=salesPointCache.get(spId);
sp.calculateSalesPointCount();
..
}J'ajoute la logique d'agrégation et d'exportation, je fais un test sur un ensemble de données. Tout fonctionne localement sur le serveur de développement.
Je lance deux serveurs de test CentOs, j'indique les adresses IP dans default-config.xml, j'exécute sur chacun.
. /bin/ignite.sh config/default-config.xmlLes deux nĆuds Ignite se lancent et se voient. J'indique les adresses nĂ©cessaires dans le fichier de configuration XML de l'application cliente, elle se lance, ajoute un troisiĂšme nĆud Ă la topologie et les nĆuds retombent immĂ©diatement Ă deux. Le journal indique «ClassNotFoundException: model.SalesPoint» Ă la ligne
SalesPoint sp=salesPointCache.get(spId);StackOverflow dit que la raison de l'erreur est que la classe utilisateur SalesPoint n'est pas prĂ©sente sur les serveurs CentOs. Ăa, c'est dommage. Comment cela se fait-il que «you donât have to manually deploy your Java code on each node» et ainsi de suite ? Ou «your Java code» ne concerne-t-il pas SalesPoint ?
Je pense que j'ai probablement manquĂ© quelque chose â je recommence Ă chercher, lire et Ă chercher encore. Avec le temps, j'ai l'impression d'avoir lu tout ce qui concerne le sujet, rien de nouveau n'est disponible. En cherchant, j'ai trouvĂ© plusieurs remarques intĂ©ressantes.
, Architecte principal chez GridGain Systems, sur StackOverflow, avril 2016 :
Les classes modÚle ne sont pas déployées par paire, mais vous pouvez utiliser le drapeau withKeepBinary() sur le cache et interroger les BinaryObjects. De cette façon, vous éviterez la désérialisation du cÎté serveur et n'obtiendrez pas de ClassNotFoundException.Une autre opinion authoritative : , Directeur de la gestion produit, GridGain Systems.
Article sur Habr fait rĂ©fĂ©rence Ă trois articles de Denis Magda : , , 2016-2017. Dans le deuxiĂšme article, Denis propose de dĂ©marrer un nĆud de cluster via MaintenanceServiceNodeStartup.jar. Il est Ă©galement possible d'utiliser un dĂ©marrage avec une configuration xml et une ligne de commande, mais dans ce cas, il faut placer manuellement les classes utilisateur sur chaque nĆud de cluster dĂ©ployĂ© :
VoilĂ . DĂ©marrez (..) le nĆud en utilisant le fichier MaintenanceServiceNodeStartup ou passez le fichier maintenance-service-node-config.xml aux scripts ignite.sh/bat d'Apache Ignite. Si vous prĂ©fĂ©rez cette derniĂšre option, assurez-vous de construire un fichier jar contenant toutes les classes des rĂ©pertoires java/app/common et java/services/maintenance. Le jar doit ĂȘtre ajoutĂ© au classpath de chaque nĆud oĂč le service pourrait ĂȘtre dĂ©ployĂ©.En effet, c'est ça. VoilĂ donc pourquoi ce format binaire mystĂ©rieux existe !
3. SingleJar
Denis a pris la premiĂšre place dans mon classement personnel, c'est de loin le tutoriel le plus utile parmi tous ceux disponibles. Dans son sur GitHub, se trouve un exemple entiĂšrement prĂȘt Ă configurer des nĆuds de cluster, qui se compile sans avoir besoin d'ajouts supplĂ©mentaires.
Je fais à l'image et à la ressemblance et j'obtiens un seul fichier jar qui lance un « data node » ou un « client node » selon l'argument de la ligne de commande. La construction démarre et fonctionne. Zero Deployment est vaincu.
Le passage de mĂ©gaoctets de donnĂ©es de test Ă des dizaines de gigaoctets de sessions rĂ©elles a montrĂ© que le format binaire existe pour une raison. Il a fallu optimiser la consommation de mĂ©moire sur les nĆuds et c'est lĂ que BinaryObject s'est avĂ©rĂ© trĂšs utile.
4. Conclusions
La premiÚre critique rencontrée concernant l'incompréhension de la documentation du projet Apache Ignite s'est révélée juste, depuis 2016, peu de choses ont changé. Il n'est pas facile pour un débutant de créer un prototype fonctionnel à partir du site et/ou du dépÎt.
Au terme du travail accompli, j'ai eu l'impression que Zero Deployment fonctionne, mais seulement au niveau systĂšme. Ă peu prĂšs ainsi : BinaryObject est utilisĂ© pour instruire les nĆuds distants du cluster Ă travailler avec des classes utilisateur ; Zero Deployment est un mĂ©canisme interne
d'Apache Ignite lui-mĂȘme et distribue des objets systĂšme dans tout le cluster.
J'espÚre que mon expérience sera utile aux nouveaux utilisateurs d'Apache Ignite.
Source : habr.com
