Middleware

PLATÍ PRO: SDK v4

Middleware je jednoduše třída, která se nachází mezi adaptérem a logikou robota a která se během inicializace přidá do kolekce middlewaru adaptéru. Sada SDK umožňuje psát vlastní middleware nebo přidávat middleware vytvořený někým jiným. Přes middleware procházejí všechny příchozí i odchozí aktivity robota.

Adaptér zpracovává a směruje příchozí aktivity prostřednictvím kanálu middlewaru robota do logiky robota a pak se znovu vrátí. Když jednotlivé aktivity přicházejí do robota a odcházejí z něj ven, všechny části middlewaru můžou aktivity zkoumat nebo na ně reagovat před spuštěním i po spuštění logiky robota.

Než se pustíte do middlewaru, je důležité pochopit roboty obecně a jak zpracovávají aktivity.

Používá se pro middleware

Otázka se často objevuje: "Kdy mám implementovat akce jako middleware a použít normální logiku robota?" Middleware vám poskytuje další příležitosti k interakci s tokem konverzací uživatelů před a po každém odevzdání konverzace. Middleware vám také umožňuje ukládat a načítat informace týkající se konverzace a v případě potřeby volat další logiku zpracování. Níže jsou uvedeny některé běžné scénáře, které ukazují, kde může být middleware užitečný.

Sledování nebo jednání na všech aktivitách

Existuje spousta situací, které vyžadují, aby robot udělal něco pro každou aktivitu nebo pro každou aktivitu určitého typu. Můžete například chtít protokolovat každou aktivitu zpráv, kterou robot obdrží, nebo poskytnout záložní odpověď, pokud robot jinak nevygeneroval odpověď na tento obrat. Middleware je skvělým místem pro takové procesy s možností jednat před i po spuštění logiky robota.

Úprava nebo vylepšení kontextu otáčení

Některé konverzace můžou být mnohem plodnější, pokud má robot více informací než to, co je v aktivitě poskytováno. Middleware v tomto případě by se mohl podívat na informace o stavu konverzace, které zatím obsahuje, dotazovat externí zdroj dat a připojit ho k objektu kontextu turn před předáním spuštění do logiky robota.

Sada SDK definuje protokolovací middleware, který může zaznamenávat příchozí a odchozí aktivity, ale můžete také definovat vlastní middleware.

Kanál middlewaru robota

Pro každou aktivitu adaptér volá middleware v pořadí, ve kterém jste ho přidali. Adaptér předá kontextový objekt pro turn a dalšího delegáta a middleware volá delegáta, aby předal řízení dalšímu middlewaru v kanálu. Middleware má také příležitost dělat věci poté, co se další delegát vrátí před dokončením metody. Můžete si to představit jako každý middleware objekt má první a poslední šanci jednat s ohledem na middlewarové objekty, které ho následují v kanálu.

Příklad:

  • První obslužná rutina objektu middlewaru před voláním dalšího spustí kód.
    • Druhá obslužná rutina objektu middlewaru před voláním dalšího spustí kód.
      • Obslužná rutina odevzdání robota se spustí a vrátí.
    • Obslužná rutina druhého objektu middlewaru před vrácením spustí veškerý zbývající kód.
  • První obslužná rutina objektu middlewaru před vrácením spustí veškerý zbývající kód.

Pokud middleware nevolá dalšího delegáta, adaptér nevolá žádný z následných obslužných rutin middlewaru ani robota a zkraty kanálu.

Jakmile se kanál middlewaru robota dokončí, přepne se a kontext turnu přestane být vymezený.

Middleware nebo robot může generovat odpovědi a registrovat obslužné rutiny událostí odpovědi, ale mějte na paměti, že odpovědi se zpracovávají v samostatných procesech.

Pořadí middlewaru

Vzhledem k tomu, že pořadí přidání middlewaru určuje pořadí, ve kterém middleware zpracovává aktivitu, je důležité rozhodnout o sekvenci, která má být přidána middleware.

Poznámka

To vám dává společný vzor, který funguje pro většinu robotů, ale nezapomeňte zvážit, jak jednotlivé části middlewaru budou komunikovat s ostatními pro vaši situaci.

Middleware, který se stará o úlohy na nejnižší úrovni, které by se měly přidat do vašeho kanálu middlewaru, by se měl nejprve přidat do vašeho kanálu middlewaru. Mezi příklady patří protokolování, zpracování výjimek a překlad. Můžete je uspořádat v závislosti na vašich potřebách, například jestli chcete, aby se příchozí zpráva před uložením zpráv přeložila jako první nebo jestli by mělo dojít k uložení zpráv, což může znamenat, že se uložené zprávy nepřeloží.

Do vašeho kanálu middlewaru byste měli přidat middlewarový middleware, který implementujete pro zpracování všech zpráv odeslaných robotovi. Pokud middleware používá informace o stavu nebo jiné informace nastavené v kontextu robota, přidejte je do kanálu middlewaru za middleware, který upraví stav nebo kontext.

Zkratování

Důležitým nápadem ohledně middlewaru a obslužných rutin odezvy je zkrat. Pokud má provádění pokračovat ve vrstvách, které ji následují, vyžaduje se k předání provádění middleware (nebo obslužné rutiny odpovědi) voláním dalšího delegáta. Pokud další delegát není volána v rámci daného middlewaru (nebo obslužné rutiny odpovědi), přidružené zkraty kanálu a následné vrstvy se nespustí. To znamená, že veškerá logika robota a veškerý middleware v kanálu se přeskočí. Mezi middlewarem a zkratkou obslužné rutiny odpovědi je malý rozdíl.

Když middleware zkratuje otočku, obslužná rutina otáčení robota se nevolá, ale veškerý kód middlewaru spuštěný před tímto bodem v kanálu se stále spustí až po dokončení.

U obslužných rutin událostí nevolání dalšího znamená, že je událost zrušena, což se velmi liší od logiky přeskakování middlewaru. Když nezpracovává zbytek události, adaptér ho nikdy neodesílá.

Tip

Pokud provedete krátkou událost odezvy, například SendActivities, ujistěte se, že se jedná o chování, které máte v úmyslu. V opačném případě může být obtížné opravit chyby.

Obslužné rutiny událostí odpovědi

Kromě logiky aplikace a middlewaru je možné do kontextového objektu přidat obslužné rutiny odpovědí (někdy označované také jako obslužné rutiny událostí nebo obslužné rutiny událostí aktivit). Tyto obslužné rutiny se volají, když se přidružená odpověď provede u aktuálního kontextového objektu před spuštěním skutečné odpovědi. Tyto obslužné rutiny jsou užitečné, když víte, že budete chtít něco udělat, a to buď před nebo po skutečné události, pro každou aktivitu tohoto typu pro zbytek aktuální odpovědi.

Upozornění

Dávejte pozor, abyste nevolali metodu odpovědi aktivity z příslušné obslužné rutiny události odpovědi, například volání metody odesílání aktivity z obslužné rutiny aktivity odesílání. Tímto způsobem můžete vygenerovat nekonečnou smyčku.

Nezapomeňte, že každá nová aktivita získá nové vlákno ke spuštění. Když se vytvoří vlákno pro zpracování aktivity, seznam obslužných rutin pro tuto aktivitu se zkopíruje do tohoto nového vlákna. Pro tuto konkrétní událost aktivity se nespustí žádné obslužné rutiny přidané po tomto bodu. Obslužné rutiny zaregistrované v kontextovém objektu se zpracovávají podobně jako adaptér spravují kanál middlewaru. Konkrétně obslužné rutiny se volají v pořadí, ve kterém jsou přidány, a volání dalšího delegáta předá řízení další zaregistrované obslužné rutině události. Pokud obslužná rutina nevolá dalšího delegáta, volá se žádný z následujících obslužných rutin událostí, zkraty událostí a adaptér neodesílá odpověď do kanálu.

Zpracování stavu v middlewaru

Běžnou metodou uložení stavu je volání metody save changes na konci obslužné rutiny turn. Tady je diagram s fokusem na volání.

Sekvenční diagram odevzdání robota se stavem uloženým z obslužné rutiny otáčení robota

Problém s tímto přístupem spočívá v tom, že všechny aktualizace stavu provedené z určitého vlastního middlewaru, ke kterým dochází po vrácení obslužné rutiny odevzdání robota, se neuloží do odolného úložiště. Řešením je přesunout volání metody save changes do poté, co vlastní middleware dokončí přidáním instance middlewaru automatického ukládání změn na začátek middlewarového zásobníku, nebo alespoň před libovolným middlewarem, který by mohl aktualizovat stav. Spuštění je znázorněno níže.

Sekvenční diagram odevzdání robota se stavem uloženým z middlewaru

Přidejte objekty správy stavu, které budou potřebovat aktualizaci na objekt sady stavů robota , a pak ho použijte při vytváření middlewaru pro automatické ukládání změn.

Další materiály

Můžete se podívat na middleware protokolovacího nástroje pro přepis, jak je implementováno v sadě Bot Framework SDK [C# | JS].