RakstÄ«jām API — plēŔam XML (divas)

ManaSistēmas pirmā API versija parādÄ«jās pirms 10 gadiem. Visu Å”o laiku mēs strādājam pie esoÅ”ajām API versijām un izstrādājam jaunas. Dažas API versijas jau ir ātri nokavētas.

Å ajā rakstā bÅ«s daudz interesantu lietu: kā tika izveidota API, kāpēc tā ir nepiecieÅ”ama mākoņu pakalpojumiem, ko tā sniedz lietotājiem, kādas grÅ«tÄ«bas esam piedzÄ«vojuÅ”i un ko plānojam darÄ«t tālāk.

Mani sauc Oļegs Aleksejevs oalexeev, es esmu tehniskais direktors un viena no ManaSistēmas dibinātājiem.

Kāpēc veidot API pakalpojumam

MÅ«su klienti, kas ir desmitiem tÅ«kstoÅ”u uzņēmēju, aktÄ«vi izmanto mākoņa risinājumus: bankoÅ”ana, interneta veikali, preču uzskaite, CRM. Pievienojoties vienam pakalpojumam, ir grÅ«ti apstāties. Un jau piektais, astotais, desmitais pakalpojums padara uzņēmēja darbu vieglāku, tomēr dati starp Å”iem mākoņa pakalpojumiem tiek pārvietoti manuāli. Darbs kļūst par Å”ausmām.

AcÄ«mredzams risinājums ir dot lietotājiem iespēju pārsÅ«tÄ«t datus starp mākoņu pakalpojumiem. Piemēram, importēt un eksportēt datus kā failus, kurus tad var augÅ”upielādēt vajadzÄ«gajā pakalpojuma veidā. Faili parasti tiek pielāgoti katra pakalpojuma formātam. Tas ir vairāk vai mazāk vienkārÅ”s manuāls darbs, bet ar Å”o pakalpojumu skaita pieaugumu to realizācija kļūst aizvien grÅ«tāka.

Tāpēc nākamais solis ir API. Ar to mākoņa pakalpojums gÅ«st labumu, jo sasaista vairākus pakalpojumus vienā vietā. Šādas ekosistēmas parādīŔanās piesaista jaunus klientus, pateicoties papildu iespējām. Produkts ar jauniem funkcionalitātes elementiem kļūst izdevÄ«gāks un noderÄ«gāks.

Ja izveidojam savus programmatÅ«ras saskarnes, tas piesaista treÅ”o puÅ”u pārdevējus kā programmētājus, kuri uzzina par jÅ«su produktu, pateicoties API. Viņi sāk veidot risinājumus, pamatojoties uz piedāvāto API un pelna naudu, automatizējot savu klientu uzdevumus.

ManaSistēmas uzskaites sistēma balstās uz vienkārŔām procesu struktÅ«rām. Galvenais ir darbs ar pamata dokumentiem, iespēja veikt preču pieņemÅ”anu un izsniegÅ”anu, saņemt biznesa ziņojumus, izmantojot pamata dokumentus. Tāpat ir datu nodoÅ”ana, piemēram, uz mākoņa grāmatvedÄ«bu, un saņemÅ”ana no banku sistēmām vai mazumtirdzniecÄ«bas vietām. Vēl mēs strādājam ar interneta veikaliem: saņemam informāciju par precēm un nosÅ«tām datus par atlikumiem.

RakstÄ«jām API — plēŔam XML (divas)

Mans pirmais API

Pēdējo 10 gadu laikā, strādājot ar API, mēs esam iegūti dažādas integrācijas, kas ļauj apmainīties ar datiem, strādāt ar bankām, veikt maksājumus un izmantot ārējo telefonsakaru pakalpojumus.

Pirmajā gadā mēs iespēju eksportēt jebkādus datus XML formātā. Tajā laikā lietotājiem bija saprotamāk un ierastāk turēt datus ārpus tieÅ”saistes, tādēļ mēs viņiem to nodroÅ”inājām. Eksportu varēja uzsākt manuāli no saskarnes. Tādēļ to vēl nevarēja saukt par API.

Tajā paŔā laikā mēs uzsākām sadarbÄ«bu ar uzņēmumu Rus agro — viņi jau izmantoja ā€œpiebrieduÅ”oā€ ERP ražoÅ”anas plānoÅ”anai un pārdoÅ”anai, bet vagonu iekrauÅ”ana rÅ«pnÄ«cās tika automatizēta mÅ«su platformā. Tādējādi mums radās pirmie Ä«stā API sākumi: apmaiņa starp mÅ«su pakalpojumu un ERP notika, nosÅ«tot lielu datu failu par visiem dokumentu veidiem.

Å is ir pieņemams variants datu partiju apmaiņai, taču kopā ar dokumentiem bija jānodod to atkarÄ«bas: informācija par precēm, sadarbÄ«bas partneriem un noliktavām. Šādu kravu nebija grÅ«ti Ä£enerēt eksportēŔanas laikā, bet diezgan grÅ«ti analizēt importēŔanas laikā, jo vienā paketē ieradās visa informācija: gan par jauniem dokumentiem, gan par jau esoÅ”ajiem.

Pirmais XML API nedzÄ«voja ilgi — pēc diviem gadiem mēs uzsākām tā pārbÅ«vi. Pat tā darba sākumā mēs pieļāvām vairākas kļūdas, veidojot programmatÅ«ras interfeisu.

RakstÄ«jām API — plēŔam XML (divas)
Kā tika veidots XML API: ilustrācija no viena no mūsu arhitektiem. Starp citu, gaidiet viņa rakstus.

Šeit ir mūsu galvenās kļūdas:

  1. JAXB marķējums tika izveidots tieÅ”i uz entity beans. Mēs sazināmies ar datu bāzi, izmantojot Hibernate, un uz Å”iem paÅ”iem bim izveidota JAXB marķējums. Å Ä« kļūda uzveicās gandrÄ«z uzreiz: jebkāda datu struktÅ«ras atjaunināŔana radÄ«ja nepiecieÅ”amÄ«bu steidzami informēt visus, kuri izmanto API, vai veidot pagaidu risinājumus, kas nodroÅ”ināja saderÄ«bu ar iepriekŔējo datu struktÅ«ru.
  2. API tika izstrādāts kā kaut kas papildus, un sākotnēji mēs nebijām noteikuÅ”i, kādu daļu produkta tas veido. Mēs arÄ« nedomājām, vai API ir kaut kas svarÄ«gs, vai ir nepiecieÅ”ams saglabāt atpakaļsavienojamÄ«bu pirmajiem klientiem. Uz kādu laiku API lietotāju skaits bija apmēram 5% no kopējā nelielā skaita, un to neievēroja. Laikā, kad tika izstrādāta universāla filtrēŔana, mēs kļuvām par backend risinājumu. Å Ä« filtrēŔana nebija gluži GraphQL, bet kaut kas lÄ«dzÄ«gs — tā strādāja ar neskaitāmiem pieprasÄ«juma parametriem. Ar tik jaudÄ«gu rÄ«ku lietotājiem bija grÅ«ti atturēties, un viņi pārsÅ«tÄ«ja pieprasÄ«jumus tieÅ”i no saviem interneta veikaliem. Situācija kļuva nepatÄ«kams pārsteigums, jo Ŕādas pakalpojuma sniegÅ”ana prasa citu cenu nospiedumu un vispār citu izpratni par API kā produktu.
  3. Tā kā API attÄ«stÄ«jās nevis kā galvenais produkts, dokumentācija par API tika izstrādāta un publicēta pēc atlikumu principa — caur reverso inženieriju. Šāds ceļŔ Ŕķiet pietiekami vienkārÅ”s un ērts, bet tas ir pretrunā lÄ«guma izpildei. Tas ir tad, kad ir kāda sastāvdaļa ar iepriekÅ” noteiktu darba shēmu. Izstrādātājs to Ä«steno saskaņā ar Å”o shēmu un uzdevumu, sastāvdaļa iziet testēŔanu, klients saņem produktu, kas atbilst analÄ«tiÄ·a iecerei. Reversā inženierija tomēr tirgÅ« izmet produktu, kas vienkārÅ”i ir: ar risinājumiem uz balstiem, dÄ«vainiem risinājumiem un velosipēdiem, nevis nepiecieÅ”amo funkcionalitāti.
  4. Visu pieprasÄ«jumu plÅ«smu, kas nāca caur API, varēja analizēt ne vairāk kā kā Nginx vai lietojumprogrammas servera žurnālu. Tas neļāva izcelt priekÅ”metu jomas, vienÄ«gi sadalÄ«t pēc lietotājiem un abonentiem. Ja nav iespēju regulēt pieteikuma vai klientu reÄ£istrāciju, situāciju analizēt kļūst neiespējami. Å Ä« problēma mazāk ietekmēja API attÄ«stÄ«bu, tā vairāk attiecās uz izpratni par tā pieprasÄ«jumu un funkcionalitāti.

Otrā mēģinājuma: REST API

2010. gadā mēs mēģinājām izveidot apmaiņas sistēmu ar tieÅ”saistes grāmatvedÄ«bu — BuxSoft. Neizdevās. Taču integrācijas procesā parādÄ«jās pilnvērtÄ«gs API: REST pakalpojums apmaiņai, kurā nevēlējāmies izmantot brÄ«vÄ«bu, piemēram, RPC izsaukumiem. Visa komunikācija ar API tika samazināta lÄ«dz standarta REST režīmam: pieprasÄ«juma rindā ir entitātes nosaukums, bet operācija, kas ar to tiek veikta, tiek noteikta, izmantojot http metodi. Mēs pievienojām filtrēŔanu pēc entitāŔu atjaunoÅ”anas brīža, un lietotājiem radās iespēja veidot replikāciju ar savām sistēmām.

Tajā paŔā gadā tika izveidots API krājumu un preču atlikumu eksportam. Lietotājiem caur API kļuva pieejamas visvērtÄ«gākās sistēmas daļas — sākotnējo dokumentu apmaiņa un aprēķinu dati par atlikumiem un preču paÅ”izmaksu.

2015. gada decembrÄ« RetailCRM publicēja pirmo treÅ”o puÅ”u bibliotēku piekļuvei mÅ«su API. To sāka diezgan aktÄ«vi izmantot, un tajā paŔā laikā auga pakalpojuma popularitāte, slodze uz API pieauga ātrāk nekā slodze uz tÄ«mekļa interfeisu. Reiz augums pārvērtās par slodzes pieaugumu.

RakstÄ«jām API — plēŔam XML (divas)

RakstÄ«jām API — plēŔam XML (divas)

Un Å”is pieaugums, uz kuru norāda bultiņa pa kreisi, izbrÄ«nÄ«ja serveri, kas apkalpo mÅ«su API. Mēs nedēļu izpētÄ«jām, kādu slodzi tā Ä£enerē. IzrādÄ«jās, ka tie ir tie paÅ”i pieprasÄ«jumi, kas tiek nosÅ«tÄ«ti uz mÅ«su API no klientu frontiem. To visu radÄ«ja apmēram 50 klienti. TieÅ”i tad mēs sapratām vienu no savām kļūdām — pilnÄ«gu limitu trÅ«kumu.

Galu galā mēs ieviesām ierobežojumu uz vienlaicÄ«gu pieprasÄ«jumu skaitu. No viena konta tagad varēja vienlaikus atvērt ne vairāk kā divus pieprasÄ«jumus. Tas bija pietiekami, lai strādātu replikācijas režīmā datu apmaiņai pakotņu režīmā. Bet tie, kas vēlējās izmantot mÅ«s kā aizmuguri, no Ŕī brīža bija spiesti labāk atbilst tarifiem, jo ​​ieviesa savās programmās darbu ar vairākiem kontiem.

Uzlabojam

Jau kopÅ” 2014. gada pieprasÄ«jums pēc esoŔā API ir kļuvis par svarÄ«gu biznesa daļu, un pats API Ä£enerēja vislielāko datu apjomu datu apmaiņā ar klientiem. 2015. gadā mēs uzsākām projektu API sakārtoÅ”anai. Mēs izvēlējāmies JSON formātu, nevis XML, un sākām to izstrādāt, ņemot vērā iepriekŔējās versijas realizācijas laikā atklātās Ä«patnÄ«bas:

  1. Iespēja pārvaldÄ«t versijas. Versiju pārvaldÄ«ba ļauj izstrādāt jaunu versiju, nepārtraucot esoÅ”o lietojumprogrammu un netraucējot lietotāju darbu.
  2. Iespēja lietotājam redzēt metadatus tieÅ”i atbildē, ko viņŔ saņem.
  3. Iespēja apmainÄ«ties ar lieliem dokumentiem. Ja mēs apstrādājam dokumentu ar vairāk nekā 4-5 tÅ«kstoÅ”iem pozÄ«ciju, tas kļūst par problēmu serverim: gara transakcija, garÅ” http pieprasÄ«jums. Esam izveidojuÅ”i Ä«paÅ”u mehānismu, kas ļauj atjaunināt dokumentu pa daļām un pārvaldÄ«t atseviŔķās Ŕī dokumenta pozÄ«cijas, nosÅ«tot tās uz serveri.
  4. Replikācijas rÄ«ki – tie bija arÄ« iepriekŔējā versijā.
  5. Noslēgtie slodzes ierobežojumi – kā mantojums no grābekļiem, uz kuriem uzkāpa iepriekŔējā versijā. Ieviesām ierobežojumus pieprasÄ«jumu skaitam laika posmā, paralēlo pieprasÄ«jumu skaitam un pieprasÄ«jumiem no viena ip adrese.

No tā brīža esam izlaidusi divas mazās API versijas un palaiduÅ”i vairākas specializētas API, taču kopumā pieeja palikusi nemainÄ«ga. Atjaunotais apmaiņas formāts un jaunā arhitektÅ«ra ļāva labot trÅ«kumus API daudz ātrāk.

MansKrājums API Ŕodien

Šodien MansKrājums API risina daudz uzdevumu:

  • datu apmaiņa ar interneta veikaliem, uzskaites sistēmām, bankām;
  • aprēķinu datu, ziņojumu saņemÅ”ana;
  • izmantoÅ”ana kā aizmugures daļa klientu lietojumprogrammām – mÅ«su mobilās lietojumprogrammas un darbvirsmas kases strādā caur API
  • paziņojumu sÅ«tīŔana par datu izmaiņām MansKrājumā – webhooks;
  • telefoni;
  • lojalitātes sistēmas.

Balstoties uz API, mūsu ģenerāldirektors Askars Rahimberdijevs rhino četru stundu laikā uzrakstīja telegram botu, kas iegūst atlikumus caur API: github.com/arahimberdiev/com-lognex-telegram-moysklad-stock

Tagad sausie cipari.

Lūk, mūsu statistika par veco REST API:

  • 400 uzņēmumu;
  • 600 lietotāju;
  • 2 miljoni pieprasÄ«jumu dienā;
  • 200 Gb/dienā izejoŔā trafika.

Un Å”eit ir tas, ko mēs sasniedzām visos MansKrājums API:

  • vairāk nekā 70 integrāciju (daļu no tām var skatÄ«t Å”eit www.manskrājums.lv/integrācijas);
  • 8500 uzņēmumu;
  • 12 000 lietotāju;
  • 46 miljoni pieprasÄ«jumu dienā;
  • 2 Tb/dienā izejoŔā trafika.

Kas notiek tālāk

API attÄ«stÄ«bas plāni Å”obrÄ«d ir aktÄ«vā apspriedē. Mēs cenÅ”amies ņemt vērā lietotāju sniegto ekspluatācijas pieredzi. Ne vienmēr un ne visu var izdarÄ«t uzreiz, bet jauna API versija ar ērtākiem metadatiem un vienkārŔāku struktÅ«ru, kā arÄ« OAuth autentifikācijai un API tiem, kas integrējas lietotņu interfeisā, ir tuvu.

Sekot jaunumiem var speciālā mājaslapā, kas paredzēta integrāciju izstrādātājiem ar MoimSklad: dev.moysklad.ru.

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster