Jak taki sposób przetwarzania nazwać? Saga4poor?

0

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ą.

1

Saga jest wtedy gdy mamy akcje kompensacyjne + persystowany stan w bazie. Jeśli zamiast akcji kompensacyjnych masz retry to wtedy bardziej process manager.

1 użytkowników online, w tym zalogowanych: 0, gości: 1