Ktoś wie o implementacji magistrali komunikatów, która oferuje szczegółową kontrolę nad gwarancjami spójności? Pełny ACID jest zbyt wolny i brak ACID jest zbyt zły.Poszukuje się implementacji magistrali komunikatów, które oferują coś pomiędzy pełnym ACID i niczym.
Obecnie używamy systemu MSMQ do pakowania Rhino ESB do przesyłania wiadomości. Podczas używania trwałego, transakcyjnego przesyłania wiadomości z transakcjami rozproszonymi, MSMQ może zablokować zatwierdzenie przez dłuższy czas, gdy oczekuje na zakończenie operacji wejścia/wyjścia.
Nasze wiadomości dzielą się na dwie ogólne kategorie: logika biznesowa i denormalizacja. Te ostatnie stanowią znaczny odsetek ruchu magistrali komunikatów.
Wiadomości logiki biznesowej wymagają gwarancji pełnego ACID i MSMQ okazały się do tego odpowiednie.
wiadomości Denormalizacja:
- muszą być trwałe.
- NIE MOŻE być przetwarzane do momentu zakończenia transakcji źródłowej.
- MOGĄ być przetwarzane wiele razy.
- MOŻE być przetwarzane, nawet jeśli dochodzi do wycofania inicjującej transakcji, tak długo jak 2).
(W niektórych szczególnych przypadkach wymagania wytrzymałościowe prawdopodobnie mogłyby zostać złagodzone, ale identyfikacji i obsługi tych przypadków jako wyjątki od reguły zwiększa złożoność.)
wszystkie wiadomości Denormalizacja są obsługiwane w procesie tak tam nie jest potrzeba IPC.
Jeśli proces zostanie zrestartowany, wszystkie transakcje mogą zostać uznane za zakończone (zatwierdzone lub wycofane), a wszystkie komunikaty o denormalizacji, które nie zostały jeszcze przetworzone, muszą zostać odzyskane. Dopuszczalne jest powtórzenie komunikatów denormalizacyjnych, które już zostały przetworzone.
O ile mi wiadomo, systemy przesyłania wiadomości, które obsługują transakcje, zwykle oferują wybór między pełnym ACID lub nic, a ACID powoduje obniżenie wydajności. Widoczne są połączenia do TransactionScope # Commit() trwające nawet kilkaset milisekund, w niektórych przypadkach w zależności od liczby wysłanych wiadomości.
Korzystanie z nietransakcyjnej kolejki komunikatów powoduje, że komunikaty są przetwarzane przed zakończeniem transakcji początkowej, co powoduje problemy z konsystencją.
Kolejna część naszego systemu, która ma podobne wymagania co do spójności, ale ma mniejszą złożoność, już używa niestandardowej implementacji czegoś podobnego do dziennika transakcji, i ogólne, że dla tego przypadku jest z pewnością opcja, ale wolałbym nie implementować system operacyjny o niskim opóźnieniu, równoczesny, trwały, transakcyjny, jeśli nie muszę: P
W przypadku, gdy ktoś się zastanawia, powodem wymagającym trwałości komunikatów do denormalizacji jest to, że wykrywanie desynchronizacji i desynchronizacji może być niezwykle trudne i wyjątkowo drogie. Ludzie do zauważają, że coś jest nie tak, a odświeżenie strony tego nie naprawia, więc ignorowanie desynchronów nie jest opcją.
Postanowiła oddzielić transakcje magistrali komunikatów od transakcji bazy danych, wdrażając trwałą kolejkę w procesie. Komunikaty logiki biznesowej nadal nie są idempotentne, ale transakcja, w której są wysyłane, będzie dotyczyć tylko kolejki komunikatów i będzie gwarantowana do zakończenia tylko po wyzwoleniu transakcji bazy danych, zapewniając w ten sposób spójność, gdy będzie używana z izolacją ReadCommitted. Trwała kolejka będzie również używana do wyzwalania operacji denormalizacyjnych zamiast wysyłania ich przez MSMQ. –