นี่เป็นคำถามคลาสสิกที่ฉันถูกถามในระหว่างการสัมภาษณ์เมื่อเร็ว ๆ นี้วิธีการโทรบริการเว็บหลายรายการและยังคงรักษาการจัดการข้อผิดพลาดบางอย่างไว้กลางงาน วันนี้ในการคำนวณประสิทธิภาพสูงเราหลีกเลี่ยงการกระทำสองเฟส ฉันอ่านกระดาษเมื่อหลายปีก่อนเกี่ยวกับสิ่งที่เรียกว่า "รุ่น Starbuck" สำหรับการทำธุรกรรม: คิดเกี่ยวกับกระบวนการของการสั่งซื้อการจ่ายการเตรียมและการรับกาแฟที่คุณสั่งที่ Starbuck ... ฉันอธิบายสิ่งต่าง ๆ ขอแนะนำให้กระบวนการทั้งหมดเป็นธุรกรรมการตัดคำเดียวสำหรับทุกขั้นตอนที่เกี่ยวข้องจนกว่าคุณจะได้รับกาแฟของคุณ อย่างไรก็ตามด้วยโมเดลนี้พนักงานทุกคนจะรอและหยุดทำงานจนกว่าคุณจะได้รับกาแฟของคุณ คุณเห็นรูปไหม
แต่รุ่น "Starbuck" นั้นมีประสิทธิภาพมากกว่าโดยทำตาม "ความพยายามที่ดีที่สุด" และชดเชยข้อผิดพลาดในกระบวนการ ครั้งแรกพวกเขาให้แน่ใจว่าคุณจ่าย! จากนั้นจะมีคิวข้อความพร้อมคำสั่งซื้อของคุณแนบกับถ้วย หากมีอะไรผิดพลาดในกระบวนการเช่นคุณไม่ได้รับกาแฟมันไม่ใช่สิ่งที่คุณสั่ง ฯลฯ เราเข้าสู่กระบวนการชดเชยและเราแน่ใจว่าคุณได้รับสิ่งที่คุณต้องการหรือคืนเงินให้คุณนี่คือรูปแบบที่มีประสิทธิภาพที่สุด เพื่อเพิ่มผลผลิต
บางครั้ง Starbuck กำลังสูญเสียกาแฟ แต่กระบวนการโดยรวมนั้นมีประสิทธิภาพ มีเทคนิคอื่น ๆ ที่คิดว่าเมื่อคุณสร้างบริการเว็บของคุณเช่นการออกแบบพวกเขาในแบบที่พวกเขาสามารถเรียกว่าจำนวนครั้งใด ๆ และยังคงให้ผลลัพธ์ที่เหมือนกัน ดังนั้นคำแนะนำของฉันคือ:
อย่าคิดมากเกินไปเมื่อกำหนดบริการเว็บของคุณ (ฉันไม่มั่นใจเกี่ยวกับ hype บริการไมโครที่เกิดขึ้นวันนี้: ความเสี่ยงมากเกินไปที่จะไปไกลเกินไป);
Async เพิ่มประสิทธิภาพให้มากขึ้นเช่นต้องการซิงค์ส่งการแจ้งเตือนทางอีเมลทุกครั้งที่ทำได้
สร้างบริการที่ชาญฉลาดมากขึ้นเพื่อให้ "เรียกคืนได้" ไม่ว่าจะกี่ครั้งประมวลผลด้วย uid หรือ taskid ที่จะปฏิบัติตามคำสั่งจากล่างสุดจนถึงสิ้นสุดตรวจสอบกฎเกณฑ์ทางธุรกิจในแต่ละขั้นตอน
ใช้คิวข้อความ (JMS หรืออื่น ๆ ) และโอนไปยังข้อผิดพลาดในการจัดการโปรเซสเซอร์ที่จะใช้การดำเนินการกับ "ย้อนกลับ" โดยใช้การดำเนินการตรงข้ามโดยวิธีการทำงานกับคำสั่ง async จะต้องมีคิวบางประเภทในการตรวจสอบสถานะปัจจุบันของกระบวนการ ดังนั้นให้พิจารณาว่า;
ในวิธีสุดท้าย (เนื่องจากอาจไม่เกิดขึ้นบ่อย) ให้วางคิวเพื่อประมวลผลข้อผิดพลาดด้วยตนเอง
ลองย้อนกลับไปที่ปัญหาเบื้องต้นที่โพสต์ไว้ สร้างบัญชีและสร้างกระเป๋าเงินและทำให้ทุกอย่างเรียบร้อย
สมมติว่ามีการเรียกใช้บริการเว็บเพื่อจัดการการดำเนินการทั้งหมด
โค้ดหลอกของบริการเว็บจะมีลักษณะเช่นนี้:
โทร microservice สร้างบัญชีส่งผ่านข้อมูลบางส่วนและ id งานที่ไม่ซ้ำกัน 1.1 microservice สร้างบัญชีจะตรวจสอบก่อนว่าบัญชีนั้นถูกสร้างขึ้นแล้ว รหัสงานเชื่อมโยงกับบันทึกของบัญชี microservice ตรวจพบว่าบัญชีไม่มีอยู่ดังนั้นจึงสร้างและเก็บ id งาน หมายเหตุ: บริการนี้สามารถเรียกได้ 2,000 ครั้งจะให้ผลลัพธ์เหมือนเดิมเสมอ บริการตอบด้วย "ใบเสร็จรับเงินที่มีข้อมูลน้อยที่สุดในการดำเนินการเลิกทำหากจำเป็น"
เรียกการสร้าง Wallet โดยระบุ ID บัญชีและรหัสงาน สมมติว่าเงื่อนไขไม่ถูกต้องและไม่สามารถสร้างกระเป๋าเงินได้ การโทรกลับมาพร้อมกับข้อผิดพลาด แต่ไม่มีอะไรถูกสร้างขึ้น
orchestrator ได้รับแจ้งถึงข้อผิดพลาด มันรู้ว่ามันจำเป็นต้องยกเลิกการสร้างบัญชี แต่มันจะไม่ทำเอง มันจะขอให้บริการกระเป๋าเงินทำได้โดยผ่าน "ใบเสร็จรับเงินที่เลิกทำน้อยที่สุด" ที่ได้รับเมื่อสิ้นสุดขั้นตอนที่ 1
บริการบัญชีอ่านใบเสร็จรับเงินที่เลิกทำและรู้วิธียกเลิกการทำงาน ใบเสร็จรับเงินที่เลิกทำอาจรวมถึงข้อมูลเกี่ยวกับบริการอื่น ๆ ที่อาจเรียกได้ว่าเป็นส่วนหนึ่งของงาน ในสถานการณ์นี้ใบเสร็จรับเงินที่เลิกทำอาจมี ID บัญชีและอาจมีข้อมูลเพิ่มเติมที่จำเป็นในการดำเนินการตรงข้าม ในกรณีของเราเพื่อให้สิ่งต่าง ๆ ง่ายขึ้นสมมุติว่าเพียงแค่ลบบัญชีโดยใช้รหัสบัญชี
ตอนนี้สมมติว่าบริการเว็บไม่เคยได้รับความสำเร็จหรือล้มเหลว (ในกรณีนี้) ว่าการยกเลิกการสร้างบัญชีได้ดำเนินการแล้ว มันจะเรียกบริการการยกเลิกบัญชีอีกครั้ง และบริการนี้ควรไม่เคยล้มเหลวเพราะเป้าหมายคือเพื่อให้บัญชีไม่มีอยู่อีกต่อไป ดังนั้นจึงตรวจสอบว่ามีอยู่และไม่เห็นสิ่งใดที่สามารถยกเลิกได้ ดังนั้นมันจึงกลับมาที่การดำเนินการประสบความสำเร็จ
บริการเว็บกลับสู่ผู้ใช้ซึ่งไม่สามารถสร้างบัญชีได้
นี่คือตัวอย่างที่ซิงโครนัส เราสามารถจัดการมันด้วยวิธีที่แตกต่างกันและวางกรณีลงในคิวข้อความที่กำหนดเป้าหมายไปยังฝ่ายให้ความช่วยเหลือหากเราไม่ต้องการให้ระบบกู้คืนข้อผิดพลาดทั้งหมด "ฉันเห็นการดำเนินการนี้ใน บริษัท ที่ไม่เพียงพอ สามารถมอบ hooks ให้กับระบบแบ็คเอนด์เพื่อแก้ไขสถานการณ์ฝ่ายช่วยเหลือได้รับข้อความที่มีสิ่งที่ดำเนินการได้สำเร็จและมีข้อมูลเพียงพอที่จะแก้ไขสิ่งต่าง ๆ เช่นเดียวกับการรับใบเสร็จรับเงินของเราที่สามารถนำไปใช้ได้อย่างอัตโนมัติ
ฉันทำการค้นหาแล้วและเว็บไซต์ของ Microsoft มีคำอธิบายรูปแบบสำหรับวิธีการนี้ มันถูกเรียกว่ารูปแบบการทำธุรกรรมชดเชย:
รูปแบบการทำธุรกรรมชดเชย