APIs Ă©crits — XML dĂ©chirĂ© (deux)

La premiÚre API de MoegoSklada est apparue il y a 10 ans. Depuis tout ce temps, nous travaillons sur les versions existantes de l'API et en développons de nouvelles. Déjà plusieurs versions de l'API ont été mises au rebut.

Cet article contiendra beaucoup de choses : comment l'API a été créée, pourquoi elle est nécessaire pour un service cloud, ce qu'elle apporte aux utilisateurs, sur quelles embûches nous avons trébuché et ce que nous voulons faire ensuite.

Je m'appelle Oleg Alexeev oalexeev, je suis directeur technique et cofondateur de MoegoSklada.

Pourquoi créer une API pour le service

Nos clients, qui comptent des dizaines de milliers d'entrepreneurs, utilisent activement des solutions cloud : services bancaires, boutiques en ligne, gestion des stocks, CRM. Une fois connectĂ© Ă  l'un, il devient difficile de s'arrĂȘter. Et voilĂ  dĂ©jĂ  le cinquiĂšme, le huitiĂšme, le dixiĂšme service qui facilite le travail des entrepreneurs, mais les utilisateurs doivent transfĂ©rer manuellement les donnĂ©es entre ces services cloud. Le travail se transforme en cauchemar.

La solution Ă©vidente est de permettre aux utilisateurs de transfĂ©rer des donnĂ©es entre les services cloud. Par exemple, importer et exporter des donnĂ©es sous forme de fichiers, qui peuvent ensuite ĂȘtre tĂ©lĂ©chargĂ©s dans le service appropriĂ©. Les fichiers sont gĂ©nĂ©ralement adaptĂ©s au format de chaque service. C'est un travail manuel plus ou moins simple, mais avec l'augmentation du nombre de ces services, il devient de plus en plus difficile de le rĂ©aliser.

Ainsi, la prochaine étape est l'API. Avec cela, le service cloud bénéficie de la connexion de plusieurs services en un seul point. L'apparition d'un tel écosystÚme attire de nouveaux clients grùce à des fonctionnalités supplémentaires. Un produit avec une nouvelle fonctionnalité devient plus rentable et utile.

En créant des interfaces de programmation propres, cela attire des vendeurs tierce partie sous la forme de programmeurs qui connaissent votre produit grùce à l'API. Ils commencent à construire des solutions basées sur l'API proposée et gagnent de l'argent en automatisant les tùches pour leurs clients.

Le systÚme de comptabilité de MoegoSklada est construit sur des processus simples. L'essentiel est de travailler avec des documents de base, la possibilité de recevoir et d'expédier des marchandises, puis d'obtenir des rapports pour les entreprises basés sur ces documents. Il y a aussi le transfert de données, par exemple vers une comptabilité cloud, et leur réception depuis des systÚmes bancaires ou des points de vente. De plus, nous travaillons avec des boutiques en ligne : nous obtenons des informations sur les produits et envoyons des données sur les stocks.

APIs Ă©crits — XML dĂ©chirĂ© (deux)

PremiĂšre API de MonInventaire

Au cours de ses 10 années d'activité avec l'API, MonInventaire a développé toutes sortes d'intégrations permettant d'échanger des données, de travailler avec des banques, de traiter des paiements et d'utiliser la téléphonie externe.

Dans la premiĂšre annĂ©e, nous avons rendu possible l'exportation de toutes les donnĂ©es au format XML. À l'Ă©poque, il Ă©tait bien plus comprĂ©hensible et habituel pour les utilisateurs de conserver les donnĂ©es hors ligne plutĂŽt que dans un cloud, et nous leur avons donnĂ© cette opportunitĂ©. L'exportation Ă©tait lancĂ©e manuellement depuis l'interface. On ne pouvait donc pas encore parler d'une vĂ©ritable API.

À cette Ă©poque, nous avons commencĂ© Ă  collaborer avec l'entreprise Rusagro — ils utilisaient dĂ©jĂ  un ERP 'mature' pour la planification de la production et de la vente, tandis que nous avons automatisĂ© le chargement des wagons dans les usines avec MonInventaire. Ainsi, nous avons eu nos premiers balbutiements d'une vĂ©ritable API : l'Ă©change entre notre service et l'ERP se faisait par l'envoi d'un grand fichier contenant les donnĂ©es sur tous les types de documents.

C'est une option pas mal pour l'échange de données en lot, mais avec les documents, il fallait également transmettre leurs dépendances : des informations sur les produits, les partenaires et les entrepÎts. Ce genre de fouillis n'est pas si difficile à générer lors de l'exportation, mais c'est plutÎt compliqué à déchiffrer lors de l'importation, car dans un seul paquet se trouvent toutes les informations : à la fois sur les nouveaux documents et sur ceux déjà existants.

La premiĂšre API XML n'a pas durĂ© longtemps — aprĂšs deux ans, nous avons commencĂ© Ă  la reconstruire. DĂšs le dĂ©marrage de son fonctionnement, nous avons fait plusieurs erreurs dans la conception de l'interface du programme.

APIs Ă©crits — XML dĂ©chirĂ© (deux)
Comment l'API XML a été réalisée : illustration d'un de nos architectes. D'ailleurs, attendez-vous à ses articles.

Voici nos principales erreurs :

  1. Le balisage JAXB a Ă©tĂ© fait directement sur les entitĂ©s beans. Pour communiquer avec la base de donnĂ©es, nous utilisons Hibernate, et le balisage JAXB a Ă©galement Ă©tĂ© fait sur ces mĂȘmes beans. Cette erreur a Ă©mergĂ© presque immĂ©diatement : toute mise Ă  jour de la structure des donnĂ©es nĂ©cessitait d'informer d'urgence tous ceux qui utilisaient l'API, ou de construire des bĂ©quilles pour assurer la compatibilitĂ© avec la structure de donnĂ©es prĂ©cĂ©dente.
  2. L'API a Ă©mergĂ© comme un complĂ©ment, et au dĂ©part, nous n'avons pas dĂ©fini quelle part du produit il reprĂ©sentait. Nous n'avons pas non plus rĂ©flĂ©chi Ă  savoir si l'API Ă©tait quelque chose d'important, ni s'il Ă©tait nĂ©cessaire de maintenir la compatibilitĂ© avec les premiĂšres versions. Pendant un moment, le nombre d'utilisateurs de l'API reprĂ©sentait environ 5 % d'un nombre total dĂ©jĂ  faible, et ils n'ont pas attirĂ© notre attention. La filtration universelle mise en place Ă  l'Ă©poque a conduit Ă  ce que nous soyons utilisĂ©s comme backend. Cette filtration n'Ă©tait pas vĂ©ritablement GraphQL, mais quelque chose de similaire — elle fonctionnait Ă  travers une multitude de paramĂštres de la chaĂźne de requĂȘte. Avec un outil aussi puissant, il Ă©tait difficile pour les utilisateurs de s'en passer, et nous avons commencĂ© Ă  recevoir des requĂȘtes directement depuis l'interface utilisateur de leurs boutiques en ligne. La situation s'est rĂ©vĂ©lĂ©e ĂȘtre une mauvaise surprise, car la fourniture d'un tel service devrait nĂ©cessiter une tarification diffĂ©rente et une comprĂ©hension totalement diffĂ©rente de l'API en tant que produit.
  3. Étant donnĂ© que l'API s'est dĂ©veloppĂ©e non pas comme un produit principal, la documentation de l'API a Ă©tĂ© produite et publiĂ©e de maniĂšre rĂ©siduelle — par ingĂ©nierie inverse. Ce chemin semble assez simple et pratique, mais est en contradiction avec le travail contractuel. C'est lorsqu'il y a un certain composant avec un schĂ©ma de travail prĂ©dĂ©fini. Le dĂ©veloppeur le met en Ɠuvre conformĂ©ment Ă  ce schĂ©ma et Ă  cet objectif, le composant est testĂ©, le client reçoit un produit conforme Ă  la vision de l'analyste. L'ingĂ©nierie inverse, quant Ă  elle, met sur le marchĂ© un produit qui existe simplement : avec des solutions de contournement, des dĂ©cisions Ă©tranges et des solutions improvisĂ©es au lieu de la fonctionnalitĂ© requise.
  4. Tout le flux de requĂȘtes reçues via l'API ne pouvait ĂȘtre analysĂ© que par les journaux de Nginx ou du serveur d'application. Cela ne permettait pas de distinguer les domaines d'application, sauf Ă  les classer par utilisateurs et abonnĂ©s. En l'absence de possibilitĂ©s pour rĂ©guler l'enregistrement des applications ou des clients, il devient impossible d'analyser la situation. Ce problĂšme a eu peu d'impact sur le dĂ©veloppement de l'API, il est davantage liĂ© Ă  la comprĂ©hension de sa demande et de sa fonctionnalitĂ©.

Tentative numéro deux : REST API

En 2010, nous avons tentĂ© de construire un systĂšme d'Ă©change avec la comptabilitĂ© en ligne — BoukhSoft. Cela n'a pas dĂ©collĂ©. Cependant, au cours de l'intĂ©gration, nous avons dĂ©veloppĂ© une API complĂšte : un service REST d'Ă©change, oĂč il n'y avait pas de libertĂ©s telles que les appels RPC. Toute communication avec l'API a Ă©tĂ© rĂ©duite Ă  un mode standard pour REST : le nom de l'entitĂ© est contenu dans la chaĂźne de requĂȘte, et l'opĂ©ration qui s'applique Ă  elle est dĂ©finie Ă  l'aide de la mĂ©thode HTTP. Nous avons ajoutĂ© un filtrage basĂ© sur le moment de la mise Ă  jour des entitĂ©s, et les utilisateurs ont eu la possibilitĂ© de construire une rĂ©plication avec leurs systĂšmes.

La mĂȘme annĂ©e, nous avons introduit une API pour l'exportation des stocks et des articles. Les utilisateurs ont dĂ©sormais accĂšs via l'API aux parties les plus prĂ©cieuses du systĂšme — l'Ă©change de documents primaires et les donnĂ©es de calcul concernant les stocks et le coĂ»t des articles.

En décembre 2015, RetailCRM a publié sa premiÚre bibliothÚque tierce pour accéder à notre API. Elle a été assez activement utilisée, tandis que la popularité du service en général augmentait, la charge sur l'API augmentait plus rapidement que celle sur l'interface web. Un jour, cette croissance s'est transformée en un saut de charge.

APIs Ă©crits — XML dĂ©chirĂ© (deux)

APIs Ă©crits — XML dĂ©chirĂ© (deux)

Et ce saut, que montre la flĂšche Ă  gauche, a complĂštement stupĂ©fiĂ© le serveur qui servait notre API. Nous avons passĂ© une semaine Ă  examiner quelle charge Ă©tait rĂ©ellement gĂ©nĂ©rĂ©e. Il s'est avĂ©rĂ© qu'il s'agissait de ces mĂȘmes requĂȘtes, traduites vers notre API depuis les fronts des clients. Environ 50 clients ont consommĂ© toute la charge. C'est Ă  ce moment-lĂ  que nous avons compris une de nos erreurs — l'absence totale de limites.

Au final, nous avons introduit une limite sur le nombre de requĂȘtes simultanĂ©es. Avec un seul compte, il n'Ă©tait plus possible d'ouvrir plus de deux requĂȘtes en mĂȘme temps. Cela suffit pour fonctionner en mode de rĂ©plication pour l'Ă©change de donnĂ©es en mode batch. Quant Ă  ceux qui voulaient nous utiliser comme backend, ils ont dĂ» se conformer davantage aux tarifs, car nous avons introduit dans leurs moyens logiciels le travail sur plusieurs comptes.

Mettre en ordre

Depuis 2014, la demande pour l'API existante est devenue une partie importante des affaires, et la propre API gĂ©nĂ©rait le plus grand volume de donnĂ©es dans les Ă©changes avec les clients. En 2015, nous avons lancĂ© un projet de mise en ordre de l'API. Nous avons choisi le format JSON au lieu de XML et avons commencĂ© Ă  le construire en fonction des caractĂ©ristiques que nous avons identifiĂ©es lors de la mise en Ɠuvre de la version prĂ©cĂ©dente :

  1. La possibilité de gérer les versions. La versionnage permet de développer une nouvelle version sans affecter l'application existante et sans perturber le travail des utilisateurs.
  2. La possibilitĂ© pour l'utilisateur de voir les mĂ©tadonnĂ©es dans la rĂ©ponse mĂȘme qu'il reçoit.
  3. La possibilitĂ© d'Ă©changer de gros documents. Si nous traitons un document contenant plus de 4-5 mille lignes, cela devient un problĂšme pour le serveur : une transaction longue, une longue requĂȘte http. Nous avons construit un mĂ©canisme spĂ©cial permettant de mettre Ă  jour le document par parties et de gĂ©rer les Ă©lĂ©ments individuels de ce document, en les envoyant au serveur.
  4. Les outils de réplication étaient déjà présents dans la version précédente.
  5. Limites de charge - hĂ©ritage des erreurs commises dans la version prĂ©cĂ©dente. Des limites ont Ă©tĂ© mises en place concernant le nombre de requĂȘtes par pĂ©riode de temps, le nombre de requĂȘtes parallĂšles et les requĂȘtes provenant d'une seule adresse IP.

Depuis, nous avons publiĂ© deux versions mineures de l'API et lancĂ© plusieurs API spĂ©cialisĂ©es, mais notre approche est restĂ©e essentiellement la mĂȘme. Le format d'Ă©change mis Ă  jour et la nouvelle architecture ont permis de corriger les dĂ©fauts de l'API beaucoup plus rapidement.

L'API de MonStock aujourd'hui

Aujourd'hui, l'API de MonStock résout de nombreuses tùches :

  • Ă©change de donnĂ©es avec des boutiques en ligne, des systĂšmes comptables, des banques;
  • rĂ©cupĂ©ration de donnĂ©es calculĂ©es, de rapports;
  • utilisation comme backend pour des applications client - nos applications mobiles et le point de vente de bureau fonctionnent via l'API
  • envoi de notifications sur les changements de donnĂ©es dans MonStock - webhooks;
  • tĂ©lĂ©phonie;
  • systĂšmes de fidĂ©litĂ©.

Sur la base de l'API, notre directeur général Askar Rakhimberdiev rhino a écrit en quatre heures un bot Telegram qui récupÚre les stocks via l'API : github.com/arahimberdiev/com-lognex-telegram-moysklad-stock

Voici maintenant des chiffres précis.

Voici nos statistiques concernant l'ancien API REST :

  • 400 entreprises;
  • 600 utilisateurs;
  • 2 millions de requĂȘtes par jour;
  • 200 Go/jour de trafic sortant.

Et voici oĂč nous en sommes avec toutes les API de MonStock :

  • plus de 70 intĂ©grations (une partie d'entre elles peut ĂȘtre consultĂ©e ici www.moysklad.ru/integratsii);
  • 8500 entreprises;
  • 12 000 utilisateurs;
  • 46 millions de requĂȘtes par jour;
  • 2 To/jour de trafic sortant.

Que faire ensuite

Les plans de dĂ©veloppement de l'API sont en discussion active. Nous essayons de prendre en compte l'expĂ©rience d'exploitation fournie par nos utilisateurs. Tout ne peut pas ĂȘtre mis en Ɠuvre immĂ©diatement, mais une nouvelle version de l'API avec des mĂ©tadonnĂ©es plus pratiques et une structure moins encombrante, ainsi que l'OAuth pour l'authentification et une API pour les applications intĂ©grĂ©es dans l'interface, est proche.

Pour suivre les nouvelles, vous pouvez consulter le site spécial pour les développeurs d'intégrations avec MonStock : dev.moysklad.ru.

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