pátek 10. ledna 2020

WSO2: Paralelní zpracování v multitenantním prostředí

Pokud chceme na WSO2 provádět paralelní zpracování, lze k tomu, v závislosti na naší potřebě, využít jednoho z dvou mediátorů: clone a iterate. Oba mediátory obsahují element target, který má v obou případech shodnou implementaci třídou org.apache.synapse.mediators.eip.Target. Z tohoto důvodu také oba mediátory umožňují použít shodné elementy sequential (pomiňme nyní, že v dokumentaci mediatoru clone není uveden) a continueParent.
Atribut sequential uvádí, zda mají být jednotlivé targety zpracovávány sekvenčně. Pokud však použijete sequential="false" (defaultní hodnota) jsou mediatory v targetu spouštěny nečekaně pod carbon.super tenantem. To může způsobit nemožnost volání endpointů, protože k nim carbon.super tenant nemusí být subscribnutý (subscribnout carbon.super v multitenantním prostředí není dobrý nápad) nebo nevlastní patřičný autentizační token.
Atribut continueParent určuje, zda má být zachován původní payload. Další, pro nás klíčovou, vlastností použití tohoto atributu je i zpracování mediatoru bez čekání na jeho výsledek. Více uvedeno v Example 2.

Předpokládejme, že jsme chtěli paralelně volat dvě sekvence (obsahujících např. volání endpointů):

<clone sequential="false">
    <target>
        <sequence key="firstSequence"/>
    </target>
    <target>
        <sequence key="secondSequence"/>
    </target>
</clone>

Z důvodu uvedeného výše to však v multitenantním prostředí není možné. Požadovanou funkci ale bude mít následující řešení:

<clone sequential="true" continueParent="true">
    <target>
        <sequence key="firstSequence"/>
    </target>
</clone>
<sequence key="secondSequence"/>

Pokud budeme chtít takto paralelně volat více sekvencí, je tedy třeba každou umístit do vlastního clone.
Pokud má být sekvence v clone volána způsobem fire-and-forget, pak je třeba na konec clone umístit mediator
<drop/> - jinak by následující flow bylo voláno vícenásobně (z každého clone znovu).