Jak ustalić, czy komunikat powinien być komunikatem polecenia czy komunikatem zdarzenia?

11

Dwa wzorce integracji w przedsiębiorstwie to komunikat polecenia i komunikat zdarzenia . Pracuję nad systemem, w którym używamy przesyłania komunikatów nie tylko do integracji z innymi systemami, ale także do wewnętrznej komunikacji między usługami. Ma to być ostatecznie spójny system, a usługi powinny się wzajemnie ignorować (z wyjątkiem kilku usług specjalnego przeznaczenia). Dlatego staramy się unikać rzeczy, które wyglądają jak zdalne wywołania procedur (RPC lub RPI). Posiadamy system oprogramowania pośredniego zorientowanego na magistralę i komunikaty, a wszystkie wiadomości są nadawane.

Zwykle nazywamy nasze wiadomości jako zdarzenia, to znaczy jako wyrażenie z przeszłości idealne, np PurchaseOrderShipped. Jednak wydarzenia są często dodawane tylko wtedy, gdy niektóre inne usługi muszą o nich wiedzieć, a na początku często dba się tylko o jedną usługę. Co więcej, czasami usługa ta emituje w rezultacie zdarzenie, które jest nasłuchiwane przez pierwszą usługę. Tak więc, gdybym miał diagramować interakcję, wyglądałby bardziej jak schemat komunikatu polecenia w powyższym linku (lub nawet diagram RPC) niż ten dla komunikatu zdarzenia, chociaż ponownie nie jest to faktycznie realizowane bezpośrednie wiadomości, ale nadawane w autobusie. Dodaj do tego fakt, że ostatnio widziałem dodawanie niektórych wiadomości, które są nazwane jako polecenia, czyli fraza w trybie rozkazującym, np BillShippedPurchaseOrder.

Dziwne jest to, że nazwy komunikatów i sposób ich przesyłania nie zmieniają się w zależności od tego, czy są one nazywane zdarzeniem, czy poleceniem. Jak więc ustalić, czy coś powinno być komunikatem polecenia czy wydarzeniem? Czy to tylko różnica semantyki i nazewnictwa, czy też istnieje rzeczywista różnica w implementacji między komunikatami poleceń i zdarzeniami? Biorąc pod uwagę, że wszystkie nasze wiadomości są nadawane, czy to znaczy, że żaden z nich nie jest tak naprawdę poleceniem?

Kazark
źródło

Odpowiedzi:

11

Istnieje subtelna, ale ważna różnica między poleceniami a zdarzeniami. Polecenie zakłada domniemanie odpowiedzi, podczas gdy zdarzenie nie zakłada odpowiedzi, jest jedynie stwierdzeniem.

Aby być mniej abstrakcyjnym:

ShipOrderto polecenie, a nadawca ShipOrderprawdopodobnie oczekuje jakiejś odpowiedzi.
OrderShippedjest deklaracją, a nadawca raczej nie oczekuje odpowiedzi, podobnie jak GoodJob!bezużyteczna odpowiedź w tym przykładzie.

Jeśli projektujesz swoje systemy tak, aby oczekiwały tylko komunikatów o zdarzeniach, to niekoniecznie ma to znaczenie dla projektu systemu, jak je nazwiesz. Deweloperzy mogą się mylić nazwą wiadomości, ale systemy zareagują dobrze bez względu na to, z jaką konwencją się nazywasz.

Ale to nie wygląda na to, że twoi koledzy programiści stosują model komunikatów tylko dla zdarzeń. Jeśli usługi oczekują odpowiedzi na „wysyłane komunikaty o zdarzeniach”, to tak naprawdę wysyłają komunikaty poleceń. To nie jest wielka sprawa i mogę myśleć o wielu przypadkach, w których wymagane byłyby polecenia, takie jak prośby o informacje. Ale będziesz odczuwać semantyczny ból głowy, jeśli spodziewasz się tylko komunikatów o zdarzeniach.

Nadawanie wiadomości tak naprawdę nie ma wpływu na to, czy wiadomość jest poleceniem, czy zdarzeniem. Zasadniczo nie rozgłaszasz poleceń, ponieważ powielają one wysiłek. Ale nie ma nic do powiedzenia, że ​​nie możesz. Wczesne protokoły sieciowe nadawały każdy pakiet, a odbiorniki musiały być wystarczająco inteligentne, aby wiedzieć, kiedy je zignorowaćwiadomości pakiety, które do nich nie należą.


źródło
Jak wdrażasz request for informationfunkcjonalności? Naturalne wydaje się użycie czegoś takiego, getUserInfo(uid)co jest poleceniem oczekującym odpowiedzi. Wiem, że komunikaty poleceń wprowadzają sprzężenie, ale niestety w tym przypadku nie widzę, jak zaimplementować je z komunikatami zdarzeń. Czy w takich sytuacjach dobrze jest trzymać się poleceń?
du369
@ du369 Przepraszam, ale nie do końca rozumiem twoje pytanie. Wygląda na to, że próbujesz utworzyć polecenie, ale używasz zdarzeń?
Tak, właściwie to. W linku podanym w odpowiedzi Lee ta sama funkcjonalność jest realizowana na dwa różne sposoby. Jeden używa CancelPolicyRequestkomunikatu, który jest poleceniem. Drugie podejście wykorzystuje dwa komunikaty o zdarzeniach, a mianowicie InvoicePastDueNotificationi PolicyCancelledNotification. Zastanawiam się więc, czy można zmieniać polecenia, takie jak getUserInfo(uid)styl komunikatów o zdarzeniach, i jak mam to zrobić.
du369
1
@ du369 Coś, gdzieś musi wykonać Actionskojarzone z poleceniem. Istnieją dwa kroki związane z poleceniem. 1) Czy polecenie jest potrzebne (np. Wygasła polityka), i 2) wykonaj polecenie (np. Anuluj politykę). Jeśli Actorto określa, czy polecenie jest potrzebne ORAZ może zostać wykonane, Actormoże wysyłać komunikaty o zdarzeniach. W przeciwnym razie do wysłania zdarzenia polecenia wymagane jest cokolwiek, co określi, że polecenie jest potrzebne.
5

Wiadomość o zdarzeniu to coś, co właśnie się wydarzyło. Powiadamiasz o zdarzeniu, które właśnie się wydarzyło.

Komunikat polecenia to komunikat, który oczekuje, że coś zostanie zrobione. Może lub nie może oczekiwać odpowiedzi.

Kiedy używać tego, co sprowadza się do sprzężenia, a różnica pojawi się z czasem w miarę ewolucji systemów. Preferowanie zdarzeń nad poleceniami powoduje mniej sprzężenia. Emitent imprezy nie dba o konsumenta. We wzorcu poleceń osoba dzwoniąca wie i dlatego jest zależna od istnienia dostawcy.

Bill Poole sugeruje unikanie komunikatów poleceń razem: http://bill-poole.blogspot.com.au/2008/04/avoid-command-messages.html

http://bill-poole.blogspot.com.au/

Lee Simpson
źródło
Lee, dziękuję za twoją odpowiedź, ale rozumiem teorię kryjącą się za definicją każdego z nich. Moje pytanie dotyczy tego, jak zastosować to w prawdziwym życiu - kiedy powiadamiać o tym, że coś się wydarzyło, co często powoduje, że coś się dzieje, i kiedy prosić o coś takiego.
Kazark,
Myślę, że sprowadza się to do sprzężenia, a różnica pojawi się dopiero w miarę ewolucji systemów. Preferowanie zdarzeń nad poleceniami powoduje mniej sprzężenia. Emitent imprezy nie dba o konsumenta. We wzorcu poleceń osoba dzwoniąca wie i dlatego jest zależna od istnienia dostawcy. Czy czytałeś artykuły Billa Poole?
Lee Simpson,
Lee, dzięki, to jest pomocne; w rzeczywistości proponuję edytować treść z komentarza w odpowiedzi, w tym link do artykułów Poole (których nie jestem pewien, czy przeczytałem).
Kazark,