รูปแบบโดเมนที่ใช้ร่วมกันของสถาปัตยกรรม Microservice


12

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


1
ก็มักจะดีกว่าที่จะมีแหล่งเดียวของความเป็นจริงเมื่อใดก็ตามที่เป็นไปได้
Robert Harvey

@RobertHarvey นั่นจะส่งผลอย่างไรต่อการคงอยู่ของคนหลายภาษา การใช้ไลบรารีที่ใช้ร่วมกันสำหรับวัตถุโดเมนทั้งหมดยังคงหมายความว่า microservice แต่ละรายการอาจมีฐานข้อมูลของตัวเองหรือไม่
user1176999

ไม่เคยได้ยินคำนั้นมาก่อน แต่ดูที่คำจำกัดความฉันจะบอกว่ามันไม่ส่งผลกระทบต่อการคงอยู่ของคนหลายภาษายกเว้นตราบเท่าที่เทคโนโลยีที่คุณเลือกสำหรับแหล่งข้อมูลที่คุณตั้งใจจะใส่ผู้ใช้
Robert Harvey

คำตอบ:


12

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

สถาปัตยกรรมโดยรวม

ฉันคิดว่าวิธีการที่ดีที่สุดคือ:

  • มี microservice สำหรับการจัดการข้อมูลผู้ใช้ทั่วไป
  • เก็บข้อมูลผู้ใช้ microservice เฉพาะ (เช่นโปรไฟล์การอนุญาตการกำหนดค่าตามความชอบ) ในแต่ละ microservice (โดยใช้การอ้างอิงของ id ทั่วไป)

อ่านเพิ่มเติม:

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

การแบ่งปันรหัส

ตอนนี้ถ้าคุณเห็นด้วยกับการแก้ปัญหาข้างต้นเรามีผู้ใช้ microservice (ห่อหุ้มแบบจำลองโดเมนสำหรับผู้ใช้) และบริการอื่น ๆ ทั้งหมดเป็นผู้บริโภคของ microservice เดียวกัน คำถามคือรู้ว่าถ้าคุณต้องการ:

  • microservice แต่ละตัวเพื่อสร้างรหัสผู้บริโภคใหม่ตามหลักการของการแยกที่แข็งแกร่งเพื่อให้วงจรการปล่อยมีความยืดหยุ่นและแตกต่างกัน
  • หรือจะแบ่งปันรหัสผู้บริโภคเป็นส่วนหนึ่งของห้องสมุดพิจารณาว่าข้อมูลพื้นฐานนี้เป็นส่วนขยายของ"ถัง" รูปแบบโครงสร้างพื้นฐาน

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

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

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

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

1

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

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

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