สถานการณ์ปัจจุบัน
เรากำลังดำเนินการ (และตอนนี้ยังคงรักษา) เว็บแอปพลิเคชันการช็อปปิ้งออนไลน์ในสถาปัตยกรรม microservice
หนึ่งในความต้องการก็คือธุรกิจจะต้องสามารถใช้กฎกับสิ่งที่ลูกค้าของเราเพิ่มลงในรถเข็นของพวกเขาเพื่อปรับแต่งประสบการณ์ของพวกเขาและลำดับท้ายที่สุด เห็นได้ชัดว่าต้องวางเอ็นจิ้นกฎทางธุรกิจและเราได้ใช้ "บริการไมโคร" ที่เฉพาะเจาะจงสำหรับสิ่งนี้ (ถ้าเรายังคงเรียกมันได้)
ในช่วงหนึ่งปีที่ผ่านมาเอ็นจินกฎนี้มีความซับซ้อนมากขึ้นเรื่อย ๆ ต้องการข้อมูลมากขึ้น (เช่นเนื้อหาของรถเข็น แต่ยังรวมถึงข้อมูลผู้ใช้บทบาทของเขาบริการที่มีอยู่ของเขาข้อมูลการเรียกเก็บเงินบางอย่างเป็นต้น) เพื่อให้สามารถ คำนวณกฎเหล่านั้น
ในขณะนี้shopping-cart
microservice ของเรากำลังรวบรวมข้อมูลทั้งหมดจาก microservices อื่น ๆ แม้ว่าส่วนหนึ่งของข้อมูลนี้จะถูกใช้งานโดยshopping-cart
ส่วนใหญ่จะใช้เพื่อป้อนกฎของเครื่องมือเป็นส่วนใหญ่
ข้อกำหนดใหม่
ตอนนี้มาถึงความต้องการแอปพลิเคชั่น / ไมโครไซต์อื่นเพื่อนำเอ็นจินกฎกลับมาใช้ใหม่สำหรับข้อกำหนดที่คล้ายกัน ในสถานการณ์ปัจจุบันพวกเขาจะต้องส่งข้อมูลชนิดเดียวกันเรียกไมโครไซต์เดียวกันและสร้าง (เกือบ) ทรัพยากรเดียวกันเพื่อให้สามารถเรียกเครื่องมือกฎ
ดำเนินการต่อตามที่เป็นอยู่เราจะเผชิญกับปัญหาหลายประการ:
- ทุกคน (เรียกเครื่องมือกฎ) ต้องนำการดึงข้อมูลกลับมาใช้ใหม่แม้ว่าพวกเขาจะไม่ต้องการมัน
- การร้องขอไปยังเอ็นจินกฎมีความซับซ้อน
- ต่อไปในทิศทางนี้เราจะต้องขนส่งข้อมูลนี้ไปทั่วเครือข่ายสำหรับคำขอจำนวนมาก (คิดว่าμs A μsโทรμs B เรียกเครื่องมือกฎ แต่ A มีข้อมูลที่ต้องการกฎเครื่องยนต์อยู่แล้ว);
shopping-cart
ได้กลายเป็นใหญ่เนื่องจากการดึงข้อมูลทั้งหมด- ฉันอาจลืม ...
เราจะทำอย่างไรเพื่อหลีกเลี่ยงปัญหาเหล่านี้
เป็นการดีที่เราจะหลีกเลี่ยงการเพิ่มความซับซ้อนมากขึ้นในเครื่องมือกฎ เราต้องทำให้แน่ใจว่ามันจะไม่กลายเป็นคอขวด - ตัวอย่างเช่นข้อมูลบางอย่างค่อนข้างช้าที่จะดึงข้อมูล (10 วินาทีขึ้นไป) ดังนั้นเราจึงทำการดึงข้อมูลล่วงหน้าในshopping-cart
ลักษณะที่ข้อมูลมีแนวโน้มที่จะอยู่ที่นั่นก่อนที่เราจะเรียกกฎ เอ็นจิ้นและรักษาประสบการณ์ผู้ใช้ที่เป็นที่ยอมรับ
ความคิดบางอย่าง
- ให้เอ็นจินกฎดึงข้อมูลที่ต้องการ สิ่งนี้จะเพิ่มความซับซ้อนให้มากขึ้นโดยละเมิดหลักการความรับผิดชอบเดียว ( ยิ่ง… );
- ใช้พร็อกซีμsก่อนเครื่องมือสร้างกฎเพื่อดึงข้อมูล
- ปรับใช้ "data fetcher" μsที่กฎเอ็นจิ้นเรียกใช้เพื่อดึงข้อมูลทั้งหมดที่ต้องการในคราวเดียว (คอมโพสิตสอบถามรายละเอียดเพิ่มเติม)
shopping-cart
แต่เราสามารถปรับให้เข้ากับความต้องการของไมโครไซต์อื่น ๆ ได้ง่าย (พวกเขายังคงเกี่ยวข้องกับผู้ใช้ผลิตภัณฑ์และการสั่งซื้อ) ตามที่เราเห็นพวกเขาจะต้องการข้อมูลอินพุตเดียวกันโดยเฉพาะอย่างยิ่งเมื่อธุรกิจสามารถเลือกเพรดิเคตที่จะใช้ microservices อื่น ๆ ให้ข้อมูลทั้งหมดยกเว้นเนื้อหาในรถเข็น การดึงข้อมูลไม่ซับซ้อนต่อ seแต่มันจะซับซ้อนเมื่อคุณต้องโทรหาไมโครไซต์อื่น ๆ ~ 10 และรักษาโครงสร้างที่คาดไว้โดยเอ็นจินกฎ