Apache Ignite Zero Deployment : vraiment Zero ?

Apache Ignite Zero Deployment : vraiment Zero ?

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. Zero Deployment, 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 Introduction à Apache Ignite : premiers pas 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 getting-started, 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. Application de calcul à 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 hors des paramĂštres de sĂ©curitĂ©.: 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. Premiùre application Ignite Compute., 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.xml

Les 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.

Valentin Kulichenko, Architecte principal chez GridGain Systems, réponse 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 : Denis Magda, Directeur de la gestion produit, GridGain Systems.

Article sur Habr sur les microservices fait rĂ©fĂ©rence Ă  trois articles de Denis Magda : Microservices Partie I, Microservices Partie II, Microservices Partie III 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 MicroServicesExample 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

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster