Som celkom nový v oblasti mikroservisov a asynchrónnych architektúr a zaujímam sa, ako v takýchto prostrediach funguje typická požiadavka / odozva.
Príklad 1:
- Povedzme, že mám webovú aplikáciu, ktorá odosiela požiadavku POST na adresu / example / doStuff a očakáva, že odpoveď bude vedieť, či bola táto žiadosť úspešne dokončená alebo nie.
- Microservice A "s api manipulácia / doStuff má logiku, ktorá hovorí, že kedykoľvek / doStuff sa požaduje, pošlite doStuffInitiated správu o udalosti na správu maklérov.
- V dôsledku udalosti doStuffInitiated, mikroservice B a C reagujú na túto správu nastavením príznaku v db atď. A generujú správu doStuffCompleted pre makléra
- Toto je miesto, kde som uviazol: Existuje spôsob, ako urobiť mikroservis A čakaťdoStuffCompleted, ktorý bude spotrebovaný pred odoslaním odpovede na webovú aplikáciu, ktorá vytvorila pôvodnú žiadosť? Je to ten správny spôsob, ako na to ísť?
Príklad 2:
- Klient čelia webovú aplikáciu robí GET žiadosť / Príklad / getStuff
- Microservice Api spracováva getStuff odoslaním stuffRequested udalosť kafka.
- Aby sa údaje vrátili k objektu „veci“, údaje sa vyžadujú z 2 externých zdrojov údajov. Microservice B má na starosti manipuláciu s týmito 2 zdrojmi dát, takže spotrebuje stuffRequested udalosti, dostane údaje z 2 zdrojov údajov a pošle stuffRequestCompleted udalosť (s "veci" dáta v užitočnom zaťažení) pre mikroservice A konzumovať tak, aby mohol vrátiť "veci" objekt do aplikácie klienta.
- Toto je miesto, kde som uviazol: Keď sa to všetko odohráva v pozadí asynchrónne, ako môžem „pozastaviť“ odosielanie odpovede, kým nebudem môcť spotrebovať stuffRequestCompleted a pošlite späť požadované údaje?
Vopred ďakujem.
odpovede:
2 pre odpoveď č. 1Namiesto čakania na asynchrónnu časťkompletný (čo považujem za antipattern), urobil by som službu A na odpoveď okamžite - hovoriac, že požiadavka bola prijatá a proces za tým bol spustený.
Potom máte dve možnosti:
- na front-periodicky kontrolovať (žiadať) stav operácie,
- implementovať server do klientskej komunikácie s websocketom.