Jak obsłużyc sukces wywołania WCF i zapisu w bazie?

0

W swojej aplikacji wywołuję serwis WCF, który przykladowo tworzy po swojej stronie jakiś byt i zwraca mi do niego Id, które ja z kolei chcę zapisać do swojej bazy. Jak poprawnie obsłużyć taki flow jak poniżej:

var id = await testWcfService.CreateBytAsync();
_bytRepository.SavesAsync(id);

W powyższym rozwiązaniu, jeżeli otrzymam id z WCF, a baza będzie niedostepną - wszystko się rozjedzie, byt stworzony, ale brak zapisanego po mojej stronie.

Istnieją transakcje, które opakują wywołanie WCF i zapis w bazie po mojej stronie?

0

O rozproszonych transakcjach myśl tak, jakby ich nie było. Bo często ich naprawdę nie ma.
Raczej nastaw się psychicznie na algorytm "odkręcający" (lub sekwencje przemyśl tak, aby po jakimś czasie następowało "samonaprawienie" problemu).

Pomedytuj nad słowem "eventual consistency".
Dużo na ten temat jest w prezentacjach z kręgu mikroserwisów czy cloudowych baz danych, tam to jest "stały fragment gry"

1

Najlepiej by było jakbyś mógł stworzyć id po stronie którą kontrolujesz:

  1. tworzysz byt w bazie razem z id w obrębie jednej transakcji
  2. uruchamia się jakiś serwis który pobiera nowo stworzone byty i próbuje przesłać je przez wcf razem z id
  3. jeśli się udało oznacza je jako przesłane, jak nie próbuje je wysłać jeszcze raz za jakiś czas
    w ten sposób mamy zagwarantowane przynajmniej jedno dostarczenie, teraz po stronie odbiorcy(wcf) potrzebujemy zrobić deduplikacje:
  4. sprawdzamy czy widzieliśmy już idk który otrzymaliśmy
  5. jeśli nie w obrębie transakcji zapisujemy idk i przetwarzamy to co przyszło:

ogólnie kluczowe jest : tworzenie idka po stronie którą kontrolujemy, zapewnienie przynajmniej jednego wysłania i deduplikacja po stronie odbiorcy

0

Ja w takiej sytuacji po zwróceniu id z WCFa puściłbym wiadomość na jakąś kolejkę. Wtedy możesz zrobić jakiś mechanizm retry i w momencie gdy baza będzie dostępna rekord zostanie dodany.

Przykład z użyciem Azure Service Bus (nie mam doświadczenia z innymi narzędziami tego typu).
Wkładasz message na kolejke. Handler w twojej aplikacji próbuje dodać rekord do bazy. Jeżeli fail to wiadomość wraca na kolejkę i zostanie ponownie dostarczona do handlera za np 5 minut. Po 20 nieudanych próbach może wiadomość wpaść np. do deadletter queue. Wtedy masz też dokładny log z tym co nie przeszło i możesz coś z tym zrobić :)

0

2 phase commit lub saga i akcje kompensacyjne.
Jak już wspomniano - o transakcjach rozproszonych pisze się książki i doktoraty...

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