Bir mesajın komut mesajı mı yoksa olay mesajı mı olması nasıl belirlenir?


11

İki kurumsal entegrasyon modeli, komut mesajı ve olay mesajıdır . Mesajlaşmayı yalnızca diğer sistemlerle entegrasyon için değil, servisler arasında dahili iletişim için de kullandığımız bir sistem üzerinde çalışıyorum. Bir olması gerekiyordu sonunda tutarlı sistemi ve hizmetler (birkaç özel amaçlı hizmetlerine hariç) birbirinden habersiz olması gerekiyordu. Bu nedenle, uzaktan yordam çağrıları (RPC veya RPI) gibi görünen şeylerden kaçınmaya çalışırız . Bir veriyolu ve mesaj odaklı ara katman yazılımı sistemimiz var ve tüm mesajlar yayınlanıyor.

Mesajlarımızı etkinlik olarak adlandırmaya eğilimliyiz, yani geçmişte mükemmel bir ifade olarak, ör PurchaseOrderShipped. Ancak, olaylar genellikle yalnızca diğer bazı hizmetler hakkında bilgi sahibi olmaları gerektiğinde eklenir ve başlangıçta genellikle yalnızca bir hizmet önemser. Dahası, bazen bu hizmet, sonuç olarak ilk hizmet tarafından dinlenen bir olay yayar. Bu nedenle, etkileşimi diyagramlayacak olsaydım, yukarıdaki bağlantıdaki komut mesajının (hatta RPC diyagramının) olay mesajının diyagramından çok daha fazla görünmesine rağmen, bir kez daha, doğrudan mesajlaşma ancak bir otobüste yayın. Buna, son zamanlarda komutlar olarak adlandırılan bazı mesajların, yani zorunlulukta bir cümlenin, ör BillShippedPurchaseOrder.

Garip olan şey, mesajların adlarının ve akış biçimlerinin olay veya komut olarak adlandırılmasına bağlı olarak değişmemesidir. Peki, bir şeyin bir komut mesajı mı yoksa bir olay mı olacağını nasıl belirler? Bu sadece anlambilim ve adlandırma farkı mıdır, yoksa komut ve olay iletileri arasında gerçek bir uygulama farkı var mı? Tüm mesajlarımızın yayınlandığı göz önüne alındığında, bu hiçbirinin gerçekte komut mesajı olmadığı anlamına mı geliyor?

Yanıtlar:


11

Komutlar ve olaylar arasında ince ama önemli bir fark vardır. Bir komutun bir yanıt varsayımı vardır, ancak bir olay bir yanıt kabul etmez, yalnızca bir ifadedir.

Daha az soyut olmak gerekirse:

ShipOrderbir komuttur ve göndereni ShipOrdermuhtemelen bir tür yanıt bekler.
OrderShippedbir bildirimdir ve gönderenin GoodJob!bu örnekte işe yaramaz bir yanıt olduğu gibi bir yanıt beklemesi pek olası değildir .

Sistemlerinizi yalnızca olay iletileri bekleyecek şekilde tasarlıyorsanız, sistem mesajlarını aradığınız tasarımın önemi olmayabilir. Geliştiriciler bir mesajın adıyla karıştırılabilirler, ancak sistemler, şeyleri adlandırmak için hangi sözleşmeyi izlediğinizden bağımsız olarak iyi yanıt verir.

Ancak, geliştiricileriniz yalnızca etkinlik mesajı modelini takip ediyor gibi görünmüyor. Hizmetler gönderdikleri "olay iletilerine" yanıt bekliyorsa, gerçekten komut iletileri gönderir. Bu çok önemli değil ve bilgi talepleri gibi komutların gerekli olacağı birçok durumu düşünebilirim. Ancak yalnızca olay mesajlarını görmeyi umuyorsanız semantik bir baş ağrınız olur.

Mesajların yayınlanmasının, mesajın bir komut veya olay olup olmadığı üzerinde bir etkisi yoktur. Genellikle, emeği çoğalttığı için komutları yayınlamazsınız. Ama yapamayacağınızı söyleyecek bir şey yok. İlk ağ protokolleri her paketi yayınladı ve alıcılar ne zaman göz ardı edileceğini bilecek kadar akıllı olmak zorundaydımesajları onlara ait olmayan paketler.


request for informationİşlevleri nasıl uyguluyorsunuz ? getUserInfo(uid)Yanıt bekleyen bir komut mesajı gibi bir şey kullanmak doğal görünüyor . Komut mesajlarının eşleştirmeyi tanıdığını biliyorum, ancak ne yazık ki bu durumda olay mesajlarıyla nasıl uygulanacağını göremiyorum. Yoksa böyle bazı durumlarda komut mesajlarına sadık kalmak iyi mi?
du369

@ du369 Üzgünüm, ama sorunuzu tam olarak takip etmiyorum. Bir komut oluşturmaya çalışıyorsunuz, ancak olayları kullanıyor musunuz?

Evet, neredeyse. Lee'nin cevabında verilen bağlantıda , aynı işlevsellik iki farklı şekilde uygulanır. Biri CancelPolicyRequestkomut olan bir mesaj kullanıyor . Diğer yaklaşımda iki olay mesajı kullanılır: InvoicePastDueNotificationve PolicyCancelledNotification. Bu yüzden getUserInfo(uid)olay mesajları tarzı gibi komutları chage mümkün olup olmadığını merak ediyorum ve bunu nasıl yapmam gerekiyordu.
du369

1
@ du369 Bir şey, bir yerlerde Actionkomutla ilişkili bir şey yapmak zorunda . Bir komutla ilişkili iki adım vardır. 1) Gerekli komut (örn. İlkenin süresi dolmuş) ve 2) komutu yerine getirin (örneğin ilkeyi iptal edin). Bu, Actorkomutun gerekip gerekmediğini belirler VE çalıştırılabilirse, Actorolay iletileri gönderebilir. Aksi takdirde, bir komut olayı göndermek için komutun gerekli olduğunu belirleyen her ne olursa olsun gereklidir.

5

Etkinlik mesajı yeni gerçekleşen bir şeydir. Yeni gerçekleşen olayı bildiriyorsunuz.

Komut mesajı, bir şeylerin yapılmasını bekleyen bir mesajdır. Bir yanıt bekleyebilir veya beklemeyebilir.

Eşleşmeye inen ve ne zaman kullanacağı fark, sistemler geliştikçe zamanla ortaya çıkacaktır. Olayları komutlar üzerine eklemek daha az eşleşmeye neden olur. Etkinliğin yayıcısı tüketiciyi umursamıyor. Bir komut düzeninde arayan, bilir ve bu nedenle sağlayıcının varlığına bağlıdır.

Bill Poole komut mesajlarının hep birlikte kullanılmasını öneriyor: http://bill-poole.blogspot.com.au/2008/04/avoid-command-messages.html

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


Lee, cevabın için teşekkürler, ama her birinin tanımının arkasındaki teoriyi anlıyorum. Benim sorum bunu gerçek hayatta nasıl uygulayacağım --- bir şeyin olduğunu ne zaman bildireceğimi, ki bu genellikle bir şeyin yapılmasına neden olur ve ne zaman bir şey yapılmasını talep edersin.
Kazark

Sanırım bu birleşmeye geliyor ve fark zaman içinde sistemler geliştikçe ortaya çıkacak. Olayları komutlar üzerine eklemek daha az eşleşmeye neden olur. Etkinliğin yayıcısı tüketiciyi umursamıyor. Bir komut düzeninde arayan, bilir ve bu nedenle sağlayıcının varlığına bağlıdır. Bill Poole'nun makalelerini okudun mu?
Lee Simpson

Lee, teşekkürler, bu yardımcı oldu; aslında, Poole makalelerine (okuduğumdan emin değilim) bir bağlantı da dahil olmak üzere, yorumunuzdaki içeriği cevabınıza düzenlemenizi öneririz.
Kazark
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.