Wydawało mi się że Saga jest blisko, ale
The Saga design pattern is a way to manage data consistency across microservices in distributed transaction scenarios. A saga is a sequence of transactions that updates each service and publishes a message or event to trigger the next transaction step. If a step fails, the saga executes compensating transactions that counteract the preceding transactions.
Ta definicja jest w kontekście Microserwisów, aczkolwiek mam wątpliwości czy musi być distributed
, bo czy nie chodzi po prostu mechanizm imitujący transakcyjność na rzeczach, które łącznie nie są transakcyjne?
Załóżmy że mamy taki proces objęty naszą "Sagą"
-
Etap 1: Przekopiowanie pliku PDF na FTP, na tym etapie mogą wystąpić problemy z siecią
-
Etap 2: Aktualizacja statusu w zewnętrznym systemie, na tym etapie mogą wystąpić problemy z siecią czy serwerem pocztowym.
-
Etap 3: Powiadomienie SMS (3rd party), na tym etapie mogą wystąpić problemy z siecią.
Trzeciego etapu nie da się wycofać, więc jeżeli już chcemy go realizować, to poprzednie muszą przejść.
Jako że nie wiem jak powinno się implementować Sagę, to w nierozproszonym i małym systemie wyobrażam to sobie jakoś tak:
Oczywiście bazka, gdzie mamy Task oraz jego State [NEW, COPY_COMPLETED, EXTERNAL_UPDATE_COMPLETED, EXTERNAL_UPDATE_FAILED, SMS_COMPLETED, SMS_FAILED, EXTERNAL_UPDATE_REVERTED, COPY_REVERTED]
| TaskId | Task_State | PdfId | EmailAddress | PhoneNumber | RetryCount
|--------|------------|-------|---------------|-------------|
| 1 | NEW | 1 | [email protected] | +1 1 | 0
| 2 | COPY_COMPLETED | 2 | [email protected] | +2 2 | 0
| 3 | EXTERNAL_UPDATE_COMPLETED | 3 | [email protected] | +3 3 | 1
| 4 | SMS_COMPLETED | 4 | [email protected] | +4 4 | 2
| 5 | EXTERNAL_UPDATE_FAILED | 5 | [email protected] | +5 5 | 2
Jakiś cronjob cyklicznie to przetwarzający z jakąś fsm switchem + ifkami na zasadzie
NEW -> TryCopyPDF -> Change State To COPY_COMPLETED
COPY_COMPLETED -> TryToPerformExternalUpdate -> Change State To ["EXTERNAL_UPDATE_COMPLETED" OR "EXTERNAL_UPDATE_FAILED"]
SMS_FAILED -> TryRevertExternalUpdate -> Change State To EXTERNAL_UPDATE_REVERTED
itp...
Czy to byłaby wtedy Saga? Saga4poor?
A jeśli tak, to czy gdyby te operacje nie były odwracalne, ale mechanizm taki sam, to jakby się to nazywało? zwykła finite state machine + retry?
-
Etap 1: Wdrukowanie pliku PDF, na tym etapie może wystąpić problem z brakiem papieru czy toner.
-
Etap 2: Wysyłka emaila z potwierdzeniem, na tym etapie mogą wystąpić problemy z siecią czy serwerem pocztowym.
-
Etap 3: Powiadomienie SMS (3rd party), na tym etapie mogą wystąpić problemy z siecią.