วิธีการตรวจสอบว่าข้อความควรเป็นข้อความคำสั่งหรือข้อความเหตุการณ์?


11

สองรูปแบบรวมกิจการเป็นข้อความคำสั่งและข้อความเหตุการณ์ ฉันกำลังทำงานกับระบบที่เราใช้การส่งข้อความไม่เพียง แต่สำหรับการรวมเข้ากับระบบอื่น ๆ แต่สำหรับการสื่อสารภายในระหว่างบริการ มันควรจะเป็นระบบที่สอดคล้องกันในที่สุดและบริการต่าง ๆ ควรจะไม่รู้ซึ่งกันและกัน (ยกเว้นบริการพิเศษที่มีวัตถุประสงค์เฉพาะสองสามข้อ) เช่นนี้เราพยายามหลีกเลี่ยงสิ่งที่รู้สึกเหมือนการเรียกขั้นตอนระยะไกล (RPC หรือ RPI) เรามีระบบบัสและมิดเดิลแวร์ที่เน้นข้อความและมีการถ่ายทอดข้อความทั้งหมด

PurchaseOrderShippedเรามักจะตั้งชื่อข้อความของเราเป็นเหตุการณ์ที่เกิดขึ้นนั่นคือเป็นวลีในที่สมบูรณ์แบบที่ผ่านมาเช่น อย่างไรก็ตามเหตุการณ์มักจะถูกเพิ่มเฉพาะเมื่อบริการอื่น ๆ จำเป็นต้องรู้เกี่ยวกับพวกเขาและในการเริ่มต้นมักจะมีเพียงหนึ่งบริการที่ใส่ใจ ยิ่งไปกว่านั้นบางครั้งบริการก็ส่งเหตุการณ์ออกมาซึ่งเป็นบริการที่รับฟังโดยบริการแรก ดังนั้นถ้าฉันทำแผนภาพการโต้ตอบมันจะดูคล้ายกับแผนภาพสำหรับข้อความคำสั่งในลิงก์ด้านบน (หรือแม้แต่แผนภาพ RPC) มากกว่าข้อความสำหรับข้อความเหตุการณ์ แต่อีกครั้งสิ่งนี้ไม่ได้ถูกนำไปใช้จริง ส่งข้อความโดยตรง แต่ออกอากาศบนรถบัส เพิ่มไปที่ความจริงที่ว่าฉันได้เห็นเมื่อเร็ว ๆ BillShippedPurchaseOrderนี้บางข้อความที่เพิ่มเข้ามาที่มีชื่อเป็นคำสั่งที่เป็นวลีในความจำเป็นที่เช่น

สิ่งที่แปลกคือชื่อของข้อความและวิธีที่พวกเขาไหลไม่เปลี่ยนแปลงโดยไม่ว่าจะถูกตั้งชื่อเป็นเหตุการณ์หรือเป็นคำสั่ง ดังนั้นหนึ่งจะกำหนดว่าสิ่งที่ควรเป็นข้อความคำสั่งหรือเหตุการณ์? นี่เป็นเพียงความแตกต่างของความหมายและการตั้งชื่อหรือมีความแตกต่างที่เกิดขึ้นจริงระหว่างคำสั่งและข้อความเหตุการณ์หรือไม่ ระบุว่าข้อความทั้งหมดของเราออกอากาศแล้วนั่นหมายความว่าไม่มีใครเป็นผู้สั่งข้อความอย่างแท้จริงหรือไม่?

คำตอบ:


11

มีความแตกต่างกันเล็กน้อย แต่ความแตกต่างที่สำคัญระหว่างคำสั่งและเหตุการณ์ คำสั่งมีข้อสันนิษฐานของการตอบสนองในขณะที่เหตุการณ์ไม่เข้าใจการตอบสนองมันเป็นเพียงคำสั่ง

เป็นนามธรรมน้อย:

ShipOrderเป็นคำสั่งและผู้ส่งShipOrderอาจจะคาดหวังการตอบสนองของการเรียงลำดับบางอย่าง
OrderShippedคือการประกาศและผู้ส่งไม่น่าจะคาดหวังการตอบสนองเช่นเดียวกับGoodJob!การตอบสนองที่ไร้ประโยชน์ในตัวอย่างนี้

หากคุณกำลังออกแบบระบบของคุณให้คาดหวังว่าจะได้รับข้อความเหตุการณ์เท่านั้นไม่จำเป็นว่าระบบจะต้องออกแบบสิ่งที่คุณเรียกว่าข้อความ นักพัฒนาอาจสับสนด้วยชื่อของข้อความ แต่ระบบจะตอบสนองได้ดีไม่ว่าคุณจะทำตามแบบแผนอะไร

แต่ดูเหมือนว่านักพัฒนาเพื่อนของคุณกำลังติดตามโมเดลข้อความเท่านั้น หากบริการคาดหวังการตอบสนองต่อ "ข้อความเหตุการณ์" พวกเขากำลังส่งออกพวกเขาจะส่งข้อความคำสั่งออกไปจริงๆ มันไม่ใช่เรื่องใหญ่และฉันสามารถนึกถึงหลาย ๆ กรณีที่จำเป็นต้องใช้คำสั่งเช่นคำขอข้อมูล แต่คุณจะปวดหัวความหมายหากคุณคาดว่าจะเห็นข้อความกิจกรรมเท่านั้น

การกระจายข้อความไม่ได้ส่งผลกระทบอย่างแท้จริงต่อข้อความว่าเป็นคำสั่งหรือเหตุการณ์ โดยทั่วไปคุณไม่ได้ออกอากาศคำสั่งเนื่องจากซ้ำซ้อน แต่ไม่มีอะไรจะพูดว่าคุณทำไม่ได้ โปรโตคอลเครือข่ายแรกที่ออกอากาศทุก ๆ แพ็กเก็ตและผู้รับต้องฉลาดพอที่จะรู้ได้ว่าเมื่อไรข้อความ แพ็คเก็ตที่ไม่ได้เป็นของพวกเขา


คุณใช้request for informationฟังก์ชันได้อย่างไร ดูเหมือนเป็นเรื่องปกติที่จะใช้สิ่งที่คล้ายgetUserInfo(uid)กับข้อความสั่งการเร่งการตอบสนอง ฉันรู้ว่าข้อความคำสั่งแนะนำการมีเพศสัมพันธ์ แต่น่าเศร้าในกรณีนี้ฉันไม่เห็นวิธีการใช้กับข้อความเหตุการณ์ หรือเป็นเรื่องปกติที่จะติดข้อความคำสั่งในบางโอกาสเช่นนี้?
du369

@ du369 ขออภัย แต่ฉันไม่ค่อยได้ติดตามคำถามของคุณ ดูเหมือนว่าคุณกำลังพยายามสร้างคำสั่ง แต่ใช้เหตุการณ์อยู่ใช่ไหม

ใช่แล้ว ในลิงก์ที่ให้ไว้ในคำตอบของ Lee ฟังก์ชันการทำงานเดียวกันจะถูกนำไปใช้ในสองวิธีที่แตกต่างกัน หนึ่งคือการใช้CancelPolicyRequestข้อความซึ่งเป็นคำสั่ง วิธีการอื่น ๆ ที่ใช้ข้อความเหตุการณ์สองคือและInvoicePastDueNotification PolicyCancelledNotificationดังนั้นฉันจึงสงสัยว่าเป็นไปได้หรือไม่ที่จะเปลี่ยนคำสั่งgetUserInfo(uid)ให้เหมือนกับลักษณะของข้อความของเหตุการณ์และฉันควรจะทำอย่างไร
du369

1
@ du369 บางสิ่งบางอย่างต้องดำเนินการที่Actionเกี่ยวข้องกับคำสั่ง มีสองขั้นตอนที่เกี่ยวข้องกับคำสั่ง 1) จำเป็นต้องใช้คำสั่ง (เช่นนโยบายหมดอายุ) และ 2) เรียกใช้งานคำสั่ง (เช่นยกเลิกนโยบาย) หากสิ่งActorนั้นพิจารณาว่าจำเป็นต้องมีคำสั่งและสามารถดำเนินการได้หรือไม่นั้นActorจะสามารถส่งข้อความเหตุการณ์ได้ มิฉะนั้นสิ่งใดก็ตามที่กำหนดว่าจำเป็นต้องมีคำสั่งเพื่อส่งเหตุการณ์คำสั่ง

5

ข้อความกิจกรรมเป็นสิ่งที่เพิ่งเกิดขึ้น คุณกำลังแจ้งเหตุการณ์ที่เพิ่งเกิดขึ้น

ข้อความคำสั่งเป็นข้อความที่คาดว่าจะทำอะไรบางอย่าง อาจหรือไม่อาจคาดหวังคำตอบ

เมื่อใดที่จะใช้สิ่งที่เกิดขึ้นเพื่อแต่งงานกันและความแตกต่างจะเกิดขึ้นเมื่อเวลาผ่านไปเมื่อระบบวิวัฒนาการ การให้ความสำคัญกับเหตุการณ์ที่เกิดขึ้นกับคำสั่งจะทำให้เกิดการเชื่อมต่อที่น้อยลง อีซีแอลของเหตุการณ์ไม่สนใจผู้บริโภค ในรูปแบบคำสั่งผู้โทรทราบและขึ้นอยู่กับการมีอยู่ของผู้ให้บริการ

Bill Poole แนะนำให้หลีกเลี่ยงข้อความคำสั่งทั้งหมดเข้าด้วยกัน: http://bill-poole.blogspot.com.au/2008/04/avoid-command-messages.html

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


ลีขอบคุณสำหรับคำตอบของคุณ แต่ฉันเข้าใจทฤษฎีที่อยู่เบื้องหลังคำจำกัดความของแต่ละคน คำถามของฉันคือวิธีการใช้สิ่งนี้ในชีวิตจริง --- เมื่อใดเพื่อแจ้งให้ทราบว่ามีบางอย่างเกิดขึ้นซึ่งมักส่งผลให้เกิดสิ่งที่กำลังทำอยู่และเมื่อใดที่จะขอให้ทำสิ่งนั้น
Kazark

ฉันคิดว่ามันเกี่ยวกับการแต่งงานกันและความแตกต่างจะเกิดขึ้นเมื่อเวลาผ่านไปเมื่อระบบวิวัฒนาการ การให้ความสำคัญกับเหตุการณ์ที่เกิดขึ้นกับคำสั่งจะทำให้เกิดการเชื่อมต่อที่น้อยลง อีซีแอลของเหตุการณ์ไม่สนใจผู้บริโภค ในรูปแบบคำสั่งผู้โทรทราบและขึ้นอยู่กับการมีอยู่ของผู้ให้บริการ คุณอ่านบทความโดย Bill Poole หรือไม่?
Lee Simpson

ลีขอบคุณที่เป็นประโยชน์ ที่จริงแล้วฉันขอแนะนำให้คุณแก้ไขเนื้อหาจากความคิดเห็นของคุณลงในคำตอบของคุณรวมถึงลิงก์ไปยังบทความพูล (ซึ่งฉันไม่แน่ใจว่าฉันได้อ่าน)
Kazark
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.