การปิด VM ผ่านอินเตอร์เฟส REST
นี้เป็นจริงตัวอย่างที่มีชื่อเสียงค่อนข้างออกมาโดยทิมเบรย์ในปี 2009
Roy Fielding พูดคุยถึงปัญหาแชร์การสังเกตนี้ :
ฉันชอบระบบที่ใช้งานสถานะที่ถูกตรวจสอบ (เช่นสถานะพลังงาน) เป็นการส่วนตัวที่ไม่สามารถแก้ไขได้
ในระยะสั้นคุณมีทรัพยากรข้อมูลหนึ่งที่ส่งกลับการแสดงปัจจุบันของสถานะที่ถูกตรวจสอบ การเป็นตัวแทนนั้นอาจรวมถึงการเชื่อมโยงหลายมิติไปยังแบบฟอร์มที่จะร้องขอการเปลี่ยนแปลงไปยังสถานะนั้นและแบบฟอร์มนั้นมีลิงค์อื่นไปยังทรัพยากรเพื่อจัดการกับคำขอการเปลี่ยนแปลง (แต่ละรายการ)
เซทแลดด์มีข้อมูลเชิงลึกที่สำคัญในปัญหา
เราได้เปลี่ยนการเรียกใช้จากสถานะที่เรียบง่ายของบุคคลเป็นนามจริงซึ่งสามารถสร้างอัปเดตและพูดคุยเกี่ยวกับ
นำสิ่งนี้กลับไปที่เครื่องรีบูต ฉันจะยืนยันว่าคุณจะโพสต์ไปที่ / vdc / 434 / cluster / 4894 / server / 4343 / reboots เมื่อคุณโพสต์แล้วคุณมี URI ซึ่งแสดงถึงการรีบูตเครื่องนี้และคุณสามารถรับการอัปเดตสถานะได้ ด้วยเวทมนต์ของการเชื่อมโยงหลายมิติการเป็นตัวแทนของ Reboot จะถูกเชื่อมโยงกับเซิร์ฟเวอร์ที่ถูกรีบูต
ฉันคิดว่าการทำ URI space นั้นถูกและ URI ก็ถูกกว่าด้วยซ้ำ สร้างชุดกิจกรรมจำลองเป็นคำนามและ POST, PUT และ DELETE ทันที!
การเขียนโปรแกรม RESTful เป็นระบบราชการ Vogon ในระดับเว็บ คุณจะทำอะไรสงบ คิดค้นเอกสารใหม่สำหรับมันและทำให้เอกสารเป็นดิจิทัล
ในภาษาที่ค่อนข้างจะน่าสนใจสิ่งที่คุณกำลังทำคือการกำหนดโปรโตคอลแอปพลิเคชันโดเมนสำหรับ "ปิด VM" และระบุทรัพยากรที่คุณต้องเปิดเผย / ใช้โปรโตคอลนั้น
ดูตัวอย่างของคุณเอง
PATCH /api/virtualmachines/42
Content-Type:application/json
{ "state": "shutting down" }
ไม่เป็นไร; คุณไม่ได้ดำเนินการตามคำขอจริงๆเป็นแหล่งข้อมูลแยกต่างหาก แต่คุณยังคงสามารถจัดการได้
คุณพลาดการแสดงถึงความเปลี่ยนแปลงเล็กน้อย
อย่างไรก็ตามด้วย PATCH เอนทิตีที่ล้อมรอบจะมีชุดคำสั่งที่อธิบายถึงวิธีที่ทรัพยากรที่อยู่บนเซิร์ฟเวอร์ต้นทางควรได้รับการแก้ไขเพื่อสร้างเวอร์ชันใหม่
ตัวอย่างเช่นคำสั่งการจัดรูปแบบชนิดสื่อบันทึกJSON Patchราวกับว่าคุณกำลังแก้ไขเอกสาร JSON โดยตรง
[
{ "op": "replace", "path": "state", "value": "shutting down" }
]
ในทางเลือกของคุณความคิดอยู่ใกล้ แต่ไม่ถูกต้องชัดเจน PUT
เป็นการแทนที่สถานะทั้งหมดของทรัพยากรที่ URL เป้าหมายดังนั้นคุณอาจไม่เลือกการสะกดคำที่ดูเหมือนคอลเลกชันเป็นเป้าหมายของการเป็นตัวแทนของเอนทิตีเดียว
POST /api/virtualmachines/42/actions
สอดคล้องกับนิยายที่เรากำลังต่อท้ายการกระทำกับคิว
PUT /api/virtualmachines/42/latestAction
สอดคล้องกับนิยายที่เราทำการอัปเดตสำหรับไอเท็มท้ายในคิว มันค่อนข้างแปลกที่จะทำแบบนี้ หลักการของความประหลาดใจอย่างน้อยแนะนำให้แต่ละ PUT เป็นตัวระบุที่เป็นเอกลักษณ์ของตัวเองแทนที่จะทำให้พวกมันทั้งหมดอยู่ในที่เดียวและแก้ไขทรัพยากรหลายอย่างในเวลาเดียวกัน
โปรดทราบว่าในขณะที่เรากำลังคุยกันเรื่องการสะกดคำของ URI - REST ไม่สนใจ /cc719e3a-c772-48ee-b0e6-09b4e7abbf8b
เป็น URI ที่ไม่ย่อท้ออย่างสมบูรณ์แบบเท่าที่ REST เกี่ยวข้อง ความสามารถในการอ่านเช่นเดียวกับชื่อตัวแปรเป็นข้อกังวลแยกต่างหาก การใช้การสะกดที่สอดคล้องกับRFC 3986จะทำให้ผู้คนมีความสุขมากขึ้น
CQRS
ถ้าเรามีโดเมน CQRS ที่มีคำสั่ง "action" (aka) จำนวนมากที่อาจนำไปสู่การอัปเดตของการรวมหลาย ๆ ครั้งหรือไม่สามารถแมปกับการดำเนินการ CRUD ในทรัพยากรที่เป็นรูปธรรมและทรัพยากรย่อยได้
Greg Young บน CQRS
CQRS เป็นรูปแบบที่ง่ายมากที่ให้โอกาสมากมายสำหรับสถาปัตยกรรมที่อาจไม่มีอยู่จริง CQRS ไม่สอดคล้องกันในที่สุดมันไม่ใช่อีเวนต์ไม่ใช่การส่งข้อความไม่มีโมเดลแยกต่างหากสำหรับการอ่านและการเขียนและไม่ใช้การจัดหาเหตุการณ์
เมื่อคนส่วนใหญ่พูดคุยเกี่ยวกับ CQRS พวกเขากำลังพูดถึงการใช้รูปแบบ CQRS กับวัตถุที่แสดงถึงขอบเขตการบริการของแอปพลิเคชัน
เนื่องจากคุณกำลังพูดถึง CQRS ในบริบทของ HTTP / REST ดูเหมือนว่ามีเหตุผลที่จะสมมติว่าคุณกำลังทำงานในบริบทหลังนี้ดังนั้นไปด้วยกัน
อันนี้น่าประหลาดใจกว่าตัวอย่างก่อนหน้านี้ของคุณ เหตุผลนี้เป็นเรื่องง่าย: คำสั่งที่มีข้อความ
Jim Webberอธิบาย HTTP เป็นโปรโตคอลแอปพลิเคชันของสำนักงานในปี 1950; ทำงานให้เสร็จโดยนำข้อความไปวางไว้ในกล่องจดหมาย ความคิดเดียวกันถือ - เราได้รับสำเนาของแบบฟอร์มเปล่ากรอกข้อมูลเฉพาะที่เรารู้ส่งแบบฟอร์ม ทาดา
เราควรลองทำแบบจำลองคำสั่งให้มากที่สุดเท่าที่จะสร้างหรืออัพเดททรัพยากรที่เป็นรูปธรรมได้ที่ไหนบ้างที่เป็นไปได้ (ทำตามแนวทางแรกจากตัวอย่างที่ 1) และใช้ "จุดสิ้นสุดการกระทำ" สำหรับส่วนที่เหลือ?
ใช่ตราบเท่าที่ "ทรัพยากรที่เป็นรูปธรรม" เป็นข้อความแทนที่จะเป็นเอนทิตีในรูปแบบโดเมน
ความคิดที่สำคัญ: REST API ของคุณยังคงเป็นอินเตอร์เฟซ ; คุณควรจะสามารถเปลี่ยนรูปแบบพื้นฐานโดยลูกค้าไม่จำเป็นต้องเปลี่ยนข้อความ เมื่อคุณเปิดตัวรุ่นใหม่คุณจะปล่อยจุดปลายเว็บรุ่นใหม่ที่ทราบวิธีการใช้โปรโตคอลโดเมนของคุณและนำไปใช้กับรูปแบบใหม่
รุ่น CQRS เหมาะสมกับ RPC อย่าง API หรือไม่
ไม่จริง - โดยเฉพาะแคชของเว็บเป็นตัวอย่างที่ดีของ "รูปแบบการอ่านที่สอดคล้องกันในที่สุด" ทำให้แต่ละมุมมองของคุณกำหนดแอดเดรสได้อย่างอิสระแต่ละข้อมีกฎการแคชของตัวเองจะช่วยให้คุณปรับขนาดได้ฟรี มีความสนใจค่อนข้างน้อยต่อวิธีการอ่าน RPC โดยเฉพาะ
สำหรับการเขียนมันเป็นคำถามที่ tricker: การส่งคำสั่งทั้งหมดในการจัดการเดียวที่ปลายทางเดียวหรือครอบครัวเดียวของอุปกรณ์ปลายทางที่แน่นอนได้ง่ายขึ้น ส่วนที่เหลือเป็นเพิ่มเติมเกี่ยวกับวิธีการที่คุณค้นหาการสื่อสารที่ปลายทางอยู่กับลูกค้า
การปฏิบัติต่อข้อความเป็นทรัพยากรที่เป็นเอกลักษณ์ของตัวเองนั้นมีข้อดีที่คุณสามารถใช้ PUT ได้การแจ้งเตือนส่วนประกอบของสื่อกลางถึงข้อเท็จจริงที่ว่าการจัดการข้อความนั้นเป็น idempotent เพื่อให้พวกเขาสามารถมีส่วนร่วมในการจัดการข้อผิดพลาดในบางกรณี . (หมายเหตุ: จากมุมมองของลูกค้าหากทรัพยากรมี URI ที่แตกต่างกันแล้วพวกเขาเป็นทรัพยากรที่แตกต่างกันความจริงที่ว่าพวกเขาทั้งหมดอาจมีรหัสตัวจัดการคำขอเดียวกันบนเซิร์ฟเวอร์ต้นทางคือรายละเอียดการใช้งานที่ซ่อนอยู่โดยเครื่องแบบ อินเตอร์เฟซ).
ฟีลดิง (2008)
ฉันควรทราบด้วยว่าข้างต้นยังไม่สงบสมบูรณ์อย่างน้อยฉันจะใช้คำนี้อย่างไร สิ่งที่ฉันได้ทำไปแล้วอธิบายถึงส่วนต่อประสานบริการซึ่งไม่เกิน RPC ใด ๆ เพื่อให้สงบฉันจะต้องเพิ่มไฮเปอร์เท็กซ์เพื่อแนะนำและกำหนดบริการอธิบายวิธีการทำแผนที่โดยใช้แบบฟอร์มและ / หรือลิงค์เทมเพลตและให้รหัสเพื่อรวมการสร้างภาพข้อมูลด้วยวิธีที่มีประโยชน์