คำสั่งที่ควรละเอียดในรูปแบบของ CQ [R] S เป็นอย่างไร


17

ฉันกำลังพิจารณาโครงการเพื่อเป็นส่วนหนึ่งของ SOA โยกย้ายตาม WCF ของเรามากกว่าที่จะเป็นรูปแบบรถบัสบริการ (อาจ nServiceBus) และการใช้บางขั้นพื้นฐานผับย่อยเพื่อให้บรรลุการแยกคำสั่ง Query

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

ฉันได้อ่านเรื่องราวมากมายจากอุดีดาฮันซึ่งโดยทั่วไปเป็นปรมาจารย์ในสถาปัตยกรรม ESB (อย่างน้อยในโลก Microsoft) แต่สิ่งหนึ่งที่เขาบอกว่าทำให้ฉันปริศนา:

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

[ ... ]

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

- Udi Dahan ชี้แจง CQRS

จากมุมมองที่อธิบายไว้ในใบเสนอราคาเป็นการยากที่จะโต้แย้งกับตรรกะนั้น แต่ดูเหมือนว่าจะขัดแย้งกับธัญพืชด้วยความเคารพต่อ SOA SOA (และการบริการทั่วไปโดยทั่วไป) ควรจัดการกับข้อความหยาบๆ เพื่อลดการพูดคุยเครือข่าย - ท่ามกลางประโยชน์อื่น ๆ

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

การปรับปรุงชุดหนึ่งใน SQL Server อาจใช้เวลาเศษเสี้ยววินาทีให้กับแบบสอบถามที่มีพารามิเตอร์ที่ดีพารามิเตอร์ที่มีมูลค่าของตารางหรือการแทรกจำนวนมากไปยังตารางการแสดง การประมวลผลการอัพเดทเหล่านี้ครั้งละหนึ่งครั้งนั้นช้า, ช้า, ช้าและฮาร์ดแวร์ฐานข้อมูล OLTP นั้นมีราคาแพงที่สุดในการขยาย / ย่อ

มีวิธีใดบ้างที่จะกระทบยอดข้อกังวลเหล่านี้ ฉันกำลังคิดเกี่ยวกับมันในทางที่ผิด? ปัญหานี้มีวิธีแก้ปัญหาที่รู้จักกันดีในโลก CQS / ESB หรือไม่?

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

หรือนี่อาจเป็นหนึ่งในสิ่งเหล่านั้นที่แม้จะมีความคิดเห็นที่แข็งแกร่งหลายอย่างที่แสดงออกโดยผู้เชี่ยวชาญหลายคน

คำตอบ:


7

ในหัวข้อของ "การเปลี่ยนทุกแอตทริบิวต์"

ฉันคิดว่าคุณพลาดจุด Mr. Udi Dahan กำลังพูดว่าคุณควรจะจับเจตนาของผู้ใช้เป็นคำสั่ง ผู้ใช้ปลายทางเกี่ยวข้องกับความสามารถในการระบุว่าลูกค้าได้ย้าย ขึ้นอยู่กับบริบทที่คำสั่งนั้นอาจมีข้อมูลประจำตัวลูกค้าที่อยู่ใหม่ (แยกเป็นถนนหมายเลขถนนรหัสไปรษณีย์ ... ) เลือกหมายเลขโทรศัพท์ใหม่ (ไม่ใช่เรื่องแปลกเมื่อคุณย้าย - อาจน้อยกว่านี้สำหรับโทรศัพท์มือถือเหล่านี้ทั้งหมด) . นั่นเป็นคุณสมบัติหนึ่งที่แทบจะไม่ คำถามที่ดีกว่าคือ "ฉันจะออกแบบคำสั่งได้อย่างไร" คุณออกแบบพวกเขาจากมุมมองพฤติกรรม แต่ละกรณีการใช้งานโฟลว์งานที่ผู้ใช้กำลังพยายามทำให้สมบูรณ์จะถูกบันทึกในคำสั่งหนึ่งคำสั่งหรือมากกว่า ข้อมูลใดที่มาพร้อมกับคำสั่งเหล่านั้นตามธรรมชาติเมื่อคุณเริ่มให้เหตุผลกับรายละเอียดเพิ่มเติม สิ่งที่ต้องระวังคือข้อมูลที่ถูกตีความว่าเป็น "อาจเป็นตัวบ่งชี้ว่าคุณต้องแยกคำสั่ง ฉันหวังว่าคุณจะไม่พบมาตรฐานนั้นเกี่ยวกับคำสั่งที่ละเอียด แม้ว่าคำถามที่ดี!


คำจำกัดความนี้ยังให้ความรู้สึกต่อฉันมาก โมเดลแนวคิดของ CSR อาจมีสถานะที่ต้องการและสถานะการต่อสู้รวมกันในลักษณะเดียวกับที่คุณรวบรวมที่อยู่และรหัสไปรษณีย์เข้าด้วยกัน ฉันไม่ได้หมายถึงการแยกผมมันแค่ดูเหมือนว่าเพื่อให้เข้าใจจริง ๆ ว่าพวกเขามีพฤติกรรมที่แตกต่างกันคุณจะต้องสามารถคาดการณ์ผลกระทบต่อเนื่องและ OTOH ความคิดทั้งหมดของ ESB และ CQS และผับ / ย่อยคือคุณไม่ควรที่จะรู้หรือสนใจสิ่งที่เกิดขึ้นล่อง ขอบคุณสำหรับคำตอบของคุณฉันรู้สึกซาบซึ้งถึงแม้ว่าฉันไม่สามารถพูดได้ว่าฉันรู้สึกรู้แจ้งอีกต่อไป ...
Aaronaught

@Aaronaught: ความหมายคือพล เมล็ดของคำสั่งที่ควรจะเป็นสิ่งที่เหมาะสมสำหรับสถานการณ์ของคุณโดยเฉพาะ ไม่มีขนาดที่เหมาะกับทุกคน มีแนวทางหลายประการเช่นการจับคู่คำสั่งเพื่อใช้เคสหรืองานหรือการดำเนินการที่มีอยู่ใน UI - อีกแนวทางหนึ่งคือต้องการคำสั่งที่ละเอียดกว่าคำสั่งที่ละเอียดกว่า (โดยเฉพาะอย่างยิ่ง Yves กล่าวว่าระวังข้อมูลที่ตีความว่าเป็น แต่ไม่มีกฎที่ยากและรวดเร็ว มีสถานการณ์จริงที่ "ผู้ใช้หนึ่งรายอาจอัปเดตเอนทิตีและแอตทริบิวต์รวมกันหลายร้อยหรือหลายพันรายการ" หรือไม่?
quentin-starin

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

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

1
@qes: ยุติธรรมเพียงพอและนั่นเป็นคำตอบในตัวของมันเอง แน่นอนฉันเข้าใจแนวคิดของการดำเนินการเชิงตรรกะ (นั่นคือวิธีการบริการที่มีอยู่เป็นแบบอย่าง) ฉันคิดว่าฉันเพิ่งกังวลว่า CQS ดูเหมือนจะเปลี่ยนกฎบางอย่างเกี่ยวกับวิธีที่คุณควรกำหนดการดำเนินการ "ดั้งเดิม" ดูเหมือนว่า SOA จะเริ่มต้นจากคำจำกัดความที่เป็นไปได้ที่เลวร้ายที่สุดและเลื่อนลงบันไดที่เป็นนามธรรมหากจำเป็น ความเข้าใจของฉันเกี่ยวกับ CQS จนถึงตอนนี้ดูเหมือนจะบ่งบอกว่าตรงกันข้ามเริ่มจากคำจำกัดความที่ละเอียดที่สุดเท่าที่จะเป็นไปได้และเป็นนามธรรม
Aaronaught

2

ข้อความที่ Udi พยายามแก้ไขคือ CQRS เป็นมากกว่า CRUD เหตุใดฉันจึงสร้างบันทึกนี้ เหตุใดฉันจึงเปลี่ยนบันทึกนี้ ทำไมมันถูกลบ / ทำเครื่องหมายว่าถูกลบ?

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

CQRS นั้นเกี่ยวกับการจับภาษาของธุรกิจใน Service เลเยอร์ดังนั้น UI ไม่ต้องกังวลกับสิ่งที่เกิดขึ้นเมื่อฉันทำการอัพเกรดสถานะทองคำหรือการจัดส่งถูกทำเครื่องหมายว่าไม่สามารถส่งมอบได้โดยผู้ให้บริการหรือพนักงานได้รับการเลื่อนตำแหน่ง ถึงผู้จัดการของกลุ่มเทคโนโลยี ในทางเทคนิคแล้วฉันกำลังพูดถึง Event Sourcing อยู่ตอนนี้ แต่คุณทำให้ฉันล่องลอยไป มีข้อความที่แตกต่างกันมากขึ้น แต่ไม่จำเป็นต้องมีความละเอียดมากกว่า CUD มาตรฐาน

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