Mam system, w którym klient (nazwijmy go ClientA) może publikować żądania na określony temat MQTT. Pośrednikiem, jeśli ma to znaczenie, jest Amazon Web Services. Następnie mam innego klienta (nazwijmy go MainSubscriber), który zawsze subskrybuje ten sam temat, aby mógł odbierać żądania od ClientA i wykonywać pewne prace, które ostatecznie zamieniają się w operację bazy danych. Baza danych, jeśli ma to znaczenie, to DynamoDB.
Ponieważ subskrybent główny może nie zawsze być dostępny / online, istnieje potrzeba posiadania abonenta przełączania awaryjnego, który byłby kopią zapasową przełączania awaryjnego głównego subskrybenta. Chodzi o to, że jeśli główny subskrybent nie obsłuży żądania w odpowiednim czasie, wówczas subskrybent pracy awaryjnej uruchomi się i wykona równoważną operację praca / baza danych. Wyzwanie polega na tym, że „praca” i wynikająca z niej „operacja bazy danych” nie mogą być powielane przez abonentów głównych i przełączników awaryjnych.
Oto logiczny rysunek architektury systemu dla tego systemu.
-----> MainSubscriber ----
/ \
ClientA --> Broker ---> Database
\ /
---> FailoverSubscriber --
Oczywiście z takim systemem wiążą się pewne wyzwania:
- W jaki sposób główny subskrybent informuje subskrybenta trybu failover, że działa na żądanie?
- W jaki sposób subskrybent pracy awaryjnej wykrywa, że główny subskrybent nie odebrał żądania i musi zacząć nad nim pracować?
- W jaki sposób subskrybent pracy awaryjnej powstrzymuje głównego subskrybenta, jeśli nagle nagle wróci do trybu online i odbierze żądanie?
- Jak poradzić sobie z problemami synchroniczności między abonentami głównymi i przełączeniami awaryjnymi?
Wolałbym nie wymyślać na nowo koła, jeśli istnieje już istniejące rozwiązanie dla takiego programu. Moje pierwsze pytanie brzmi: czy coś już tam jest?
Jeśli nie, to zastanawiałem się nad użyciem DynamoDB z silnie spójnymi odczytami, które mogłyby pełnić rolę mediatora między abonentem głównym a abonentem przełączania awaryjnego. Moje drugie pytanie brzmi zatem, czy istnieją dobrze ugruntowane programy tego typu?