Písali API - roztrhli XML (dva)

Prvý API MojeSkladu sa objavil pred 10 rokmi. Po celé toto obdobie pracujeme na existujúcich verziách API a vyvíjame nové. A niekoľko verzií API už stihlo skončiť v zabudnutí.

V tomto článku bude veľa vecí: ako sme vytvorili API, prečo je potrebné pre cloudovú službu, čo prináša používateľom, na aké problémy sme narazili a čo chceme robiť ďalej.

Volám sa Oleg Alexejev oalexeev, som technický riaditeľ a spoluzakladateľ MojeSkladu.

Prečo robiť API pre službu

Naši klienti, a to sú desiatky tisíc podnikateľov, aktívne používajú cloudové riešenia: bankovníctvo, internetové obchody, evidovanie tovaru, CRM. Akonáhle sa pripojíte k jednému, ťažko sa zastavíte. A už je tu piata, ôsma, desiata služba, ktorá uľahčuje prácu podnikateľov, ale dáta medzi týmito cloudovými službami musia používatelia prenášať manuálne. Práca sa mení na nočnú moru.

Zjavné riešenie — dať používateľom možnosť prenášať dáta medzi cloudovými službami. Napríklad importovať a exportovať dáta ako súbory, ktoré je možné následne nahrať do požadovanej služby. Súbory sa zvyčajne upravujú podľa formátu každej služby. To je viac-menej jednoduchá manuálna práca, ale s rastom počtu týchto služieb sa to stáva čoraz zložitejším.

Preto ďalší krok — API. S ním cloudová služba vyhráva tým, že spája niekoľko služieb na jednom mieste. Vznik takej ekosystémy priťahuje nových klientov prostredníctvom dodatočných možností. Produkt s novými funkciami sa stáva výhodnejším a užitočnejším.

Ak vytvoríte vlastné programové rozhrania, priťahuje to nezávislých predajcov v podobe programátorov, ktorí poznajú váš produkt vďaka API. Začínajú budovať riešenia na základe ponúknutého API a zarábajú peniaze na automatizácii úloh svojich klientov.

Evidenčný systém MojeSkladu je založený na jednoduchých procesoch. Hlavné je pracovať s primárnymi dokumentmi, mať možnosť realizovať prijatie a odoslanie tovaru, získavať na základe primárnych dokumentov správy pre podnik. Taktiež máme prenos dát, napríklad do cloudového účtovníctva, a ich prijímanie z bankových systémov alebo maloobchodných miest. Ďalej pracujeme s internetovými obchodmi: získavame informácie o tovaroch a zasielame dáta o zásobách.

Písali API - roztrhli XML (dva)

Prvý API MojeSkladu

Po desaťročnej práci MojeSkladu s API sme nadobudli rôzne integrácie, ktoré umožňujú výmenu údajov, prácu s bankami, vykonávanie platieb a využívanie externých telefónnych služieb.

V prvom roku sme umožnili exportovať akékoľvek údaje vo formáte XML. Vtedy bolo pre používateľov oveľa zrozumiteľnejšie a zvyčajnejšie mať údaje v offline režime, než v nejakom oblaku, a my sme im to poskytli. Export sa spúšťal ručným exportom z rozhrania. Takže API sa ešte nedalo nazvať.

V tom čase sme začali spolupracovať so spoločnosťou Rusagro — už používali "dospelú" ERP na plánovanie výroby a predaja, zatiaľ čo nahrávanie vagónov v továrňach automatizovali v MojeSklade. Tak sme dostali prvé základy skutočného API: výmena medzi našou službou a ERP prebiehala zasielaním veľkého súboru s údajmi o všetkých typoch dokumentov.

To bol celkom dobrý variant pre dávkovú výmenu údajov, ale spolu s dokumentmi bolo potrebné prenášať aj ich závislosti: informácie o tovaroch, obchodných partneroch a skladoch. Takúto zmes nie je ťažké vygenerovať pri exporte, ale dosť ťažké ju roztriediť pri importe, pretože v jednom balíku prichádzajú všetky informácie: a o nových dokumentoch, aj o už existujúcich.

Prvý XML API nevydržal dlho — po dvoch rokoch sme začali s jeho prestavbou. Už na začiatku jeho fungovania sme urobili niekoľko chýb pri vytváraní programového rozhrania.

Písali API - roztrhli XML (dva)
Ako sa robilo XML API: ilustrácia od jedného z našich architektov. Mimochodom, čakajte jeho články.

Tu sú naše hlavné chyby:

  1. JAXB-označenie bolo vykonané priamo na entity beans. Na komunikáciu s databázou používame Hibernate, a na tie isté bány bolo vykonané JAXB-označenie. Táto chyba sa objavila takmer okamžite: akékoľvek aktualizácie štruktúry údajov viedli k potrebe naliehavo informovať všetkých, ktorí používajú API, alebo k vytvoreniu záplat, ktoré by zabezpečili kompatibilitu s predchádzajúcou štruktúrou údajov.
  2. API sa vyvinul ako určitá prídavná súčasť, a pôvodne sme nedefinovali, akú časť produktu predstavuje. Ani sme neuvažovali o tom, či je API niečím dôležitým, či by sme mali udržiavať spätnú kompatibilitu pre jeho prvých používateľov. V určitom okamihu predstavovalo množstvo používateľov API približne 5 % z celkového malého počtu, a nevenovali sme im pozornosť. Vytvorená univerzálna filtrácia viedla k tomu, že sme boli vyžívaní ako backend. Táto filtrácia rozhodne nebola GraphQL, ale niečo podobné — fungovala cez množstvo parametrov v dotazovom reťazci. S takou mocnou pomôckou bolo pre používateľov ťažké sa udržať, a nás prepojili tak, že dotazy boli odosielané priamo z UI ich internetových obchodov. Situácia sa stala nepríjemným prekvapením, pretože poskytovanie takejto služby by malo vyžadovať iné tarifné podmienky a vôbec iné pochopenie samotného API ako produktu.
  3. Keďže API sa nevyvíjalo ako hlavný produkt, dokumentácia k API sa tvorila a publikovala len okrajovo — prostredníctvom reverzného inžinierstva. Takýto prístup sa zdá byť dosť jednoduchý a praktický, ale je v rozpore s prácou na zmluve. To je vtedy, keď existuje nejaká súčasť s prednastaveným spôsobom fungovania. Vývojár ju implementuje podľa tejto schémy a úlohy, súčasť sa testuje, zákazník dostáva produkt, ktorý zodpovedá predstave analytika. Reverzné inžinierstvo však vyhadzuje na trh produkt, ktorý jednoducho existuje: s obmedzeniami, zvláštnymi riešeniami a 'bicyklami' namiesto potrebnej funkcionality.
  4. Celý prúd žiadostí prichádzajúci cez API bolo možné analyzovať maximálne ako log Nginx alebo aplikačného servera. To neumožňovalo vyčleniť predmetné oblasti, maximálne ich rozdeliť podľa používateľov a predplatiteľov. Ak nie je možné regulovať registráciu aplikácie alebo klientov, analýza situácie sa stáva nemožnou. Tento problém najmenej ovplyvnil vývoj API, viac sa týkal pochopenia jeho dopytu a naplnenia funkčností.

Pok attempt číslo dva: REST API

V roku 2010 sme sa snažili vybudovať systém výmeny s online účtovníctvom – BuchSoftom. Neúspešne. V procese integrácie sa však objavil plnohodnotný API: REST služba výmeny, kde chýbali výnimky ako volania operácií v podobe RPC. Všetka komunikácia s API bola zredukovaná na štandardný spôsob pre REST: v dopyte je názov entity a operácia, ktorá sa s ňou vykonáva, je určená pomocou http-metódy. Pridali sme filtrovanie podľa okamihu aktualizácie entít a užívatelia dostali možnosť nastaviť replikáciu so svojimi systémami.

V tom istom roku sa objavil API na export skladových a tovarových zostatkov. Pre užívateľov sa prostredníctvom API stali dostupné najcennejšie časti systému – výmena primárnych dokumentov a výpočtové údaje o zostatkoch a nákladoch na tovary.

V decembri 2015 RetailCRM zverejnil prvú externú knižnicu na prístup k nášmu API. Stala sa dosť aktívne používanou, pričom rastla popularita služby ako celku, záťaž na API rástla rýchlejšie ako záťaž na webovom rozhraní. Raz sa rast premenil na skok záťaže.

Písali API - roztrhli XML (dva)

Písali API - roztrhli XML (dva)

A tento skok, na ktorý ukazuje šípka vľavo, priviedol server obsluhujúci naše API do úplného úžasu. Po dobu jedného týždňa sme zisťovali, čo presne generuje túto záťaž. Ukázalo sa, že ide o tie isté požiadavky, ktoré sú prenášané na naše API z frontov klientov. Všetko to vygenerovalo asi 50 klientov. Tu sme si uvedomili jednu z našich chýb – úplnú absenciu limitov.

Nakoniec sme zaviedli limit na počet súčasných požiadaviek. Z jedného účtu je možné súčasne otvoriť maximálne dva požiadavky. To je dostatočné na prácu v replikácii pre výmenu údajov v dávkovom režime. A tí, ktorí chceli používať nás ako backend, museli od toho momentu viac zodpovedať tarifikácii, pretože sme zaviedli vo svojich programových prostriedkoch prácu s viacerými účtami.

Zarovnávame veci do poriadku

Už od roku 2014 sa dopyt po existujúcom API stal dôležitou súčasťou podnikania, pričom samotný API generoval najväčší objem údajov pri výmene údajov s klientmi. V roku 2015 sme spustili projekt na zarovnanie API do poriadku. Vybrali sme formát JSON namiesto XML a začali sme ho budovať na základe charakteristík, ktoré sme zistili pri realizácii predchádzajúcej verzie:

  1. Možnosť spravovať verzie. Verzionovanie umožňuje vyvinúť novú verziu bez zasahovania do existujúcej aplikácie a bez narušovania práce používateľov.
  2. Možnosť pre používateľa vidieť metadata priamo v odpovedi, ktorú dostáva.
  3. Možnosť výmeny veľkých dokumentov. Ak spracovávame dokument s počtom položiek viac ako 4-5 tisíc, stáva sa to problémom pre server: dlhá transakcia, dlhý http-žiadosť. Vybudovali sme špeciálny mechanizmus, ktorý umožňuje aktualizovať dokument po častiach a spravovať jednotlivé položky tohto dokumentu, ich odosielaním na server.
  4. Nástroje na replikáciu — boli aj v predchádzajúcej verzii.
  5. Limity pre zaťaženie — ako dedičstvo problémov, na ktoré sme narazili v predchádzajúcej verzii. Zaviedli sme limity na počet požiadaviek v určitom časovom intervale, počet paralelných požiadaviek a požiadaviek z jednej ip-adresy.

Od tej doby sme vydali dve menšie verzie API a spustili niekoľko špecializovaných API, ale celkovo prístup ostal bez zmien. Aktualizovaný formát výmeny a nová architektúra umožnili rýchlejšie opravovanie nedostatkov v API.

API MojeSkladu dnes

Dnes API MojeSkladu rieši množstvo úloh:

  • výmenu dát s e-shopmi, účtovnými systémami, bankami;
  • získavanie výpočtových dát, správ;
  • používanie ako backend pre klientské aplikácie — naše mobilné aplikácie a desktopová pokladňa fungujú prostredníctvom API
  • odosielanie oznámení o zmenách dát v MojeSklade — webhooks;
  • telefónia;
  • lojalitné systémy.

Na základe API náš generálny riaditeľ Askar Rakhimberdiev rhino za štyri hodiny napísal telegramového bota, ktorý ťahá cez API zvyšky: github.com/arahimberdiev/com-lognex-telegram-moysklad-stock

Teraz suché čísla.

Tu je naša štatistika k starému REST API:

  • 400 spoločností;
  • 600 používateľov;
  • 2 milióny požiadaviek denne;
  • 200 GB/deň odchádzajúcej prevádzky.

A tu je to, čo sme dosiahli so všetkými API MojeSkladu:

  • viac ako 70 integrácií (časť z nich si môžete pozrieť tu www.moysklad.ru/integratsii);
  • 8500 spoločností;
  • 12 000 používateľov;
  • 46 miliónov požiadaviek denne;
  • 2 TB/deň odchádzajúcej prevádzky.

Čo ďalej

Plány na rozvoj API sú v aktívnej diskusii. Snažíme sa zohľadniť skúsenosti s prevádzkovaním, ktoré nám poskytujú užívatelia. Nie vždy a nie všetko môžeme urobiť hneď, ale nová verzia API s prehľadnejšími metadátami a menej zložitou štruktúrou, ako aj OAuth pre autentifikáciu, je na dosah, vrátane API pre integrované aplikácie.

Novinky môžete sledovať na špeciálnej stránke pre vývojárov integrácií s MoimSkladom: dev.moysklad.ru.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster