Microservices ควรพูดคุยกันหรือไม่?


30

ฉันออกแบบแอปพลิเคชันด้วยบริการไมโครและฉันไม่แน่ใจเกี่ยวกับกลไกที่ดีที่สุดที่จะใช้ในการรวบรวมข้อมูลจากบริการที่หลากหลาย

ฉันเชื่อว่ามีสองตัวเลือก:

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

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

  • การให้ API ดำเนินการเรียกหลายครั้งไปยังหลายบริการจะช่วยเพิ่มภาระให้กับเซิร์ฟเวอร์ API โดยเฉพาะอย่างยิ่งเมื่อการโทรบางส่วนกำลังปิดกั้น

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

ฉันต้องการทราบว่าแนวทางมาตรฐานสำหรับปัญหานี้คืออะไรและหากมีตัวเลือกที่สามที่ฉันพลาด


คุณช่วยอธิบายบริบทได้ไหม แอปของคุณคืออะไรและพยายามทำอะไร
Ewan

ฉันเดาว่าฉันจะอยู่ที่ไหนสักแห่งระหว่างสองตัวเลือกของคุณ: บริการไมโครแต่ละรายการสื่อสารกับบริการไมโครอื่น ๆ ตามต้องการเพื่อทำงาน และเกตเวย์ API ก็ถือได้ว่าเป็นบริการขนาดเล็กเช่นกันซึ่งเป็นสิ่งแรกที่ผู้ได้รับมอบหมายทำงานกับบริการอื่น ๆ
Bart van Ingen Schenau

ฉันขอยืนยันว่าการเขียน microservices ทางฝั่งเซิร์ฟเวอร์นั้นเอาชนะจุดประสงค์หลักของการมี microservices เพื่อเริ่มต้น แนวคิดทั้งหมดคือการให้บริการที่เป็นอิสระและออกจากการประสานกับลูกค้า แต่บางทีฉันอาจจะทำไม่ได้
Sridhar Sarnobat

คำตอบ:


21

โดยทั่วไปฉันจะแนะนำว่าการมีไมโครไซต์สื่อสารแบบซิงโครนัสซึ่งกันและกันปัญหาใหญ่คือการมีเพศสัมพันธ์หมายความว่าบริการนี้เชื่อมต่อกันถ้าบริการหนึ่งล้มเหลวส่วนที่สองไม่สมบูรณ์หรือบางส่วน

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

หากคุณใช้การส่งข้อความคุณสามารถดูประกาศสมัครสมาชิกเพื่อเพิ่มกิจกรรมระหว่างบริการต่างๆ

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

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

หวังว่ามันจะสมเหตุสมผล


11

ขึ้นอยู่กับสาเหตุที่คุณต้องการข้อมูลนั้น ถ้าเป็นสำหรับ UI ก็ดีกว่าสมบูรณ์แบบ ยิ่งไปกว่านั้นมันเป็นวิธีที่ควรจะเป็น คริสริชาร์ดมีคำอธิบายที่ดีของการที่แนวคิดและแซมนิวแมนมีบทความดี ๆ เกี่ยวกับแนวคิดที่เรียกว่าคล้ายกันมากแบ็กเอนด์สำหรับส่วนหน้า

แต่ถ้าคุณต้องการมันด้วยเหตุผลบางอย่างโอกาสที่คุณจะมีขอบเขตการให้บริการนั้นผิด

มีลักษณะหลายอย่างที่สามัญสำนึกบอกเรามีบริการของเราควรมี พวกเขาเป็น:

  1. คลัปต่ำ หากคุณทำการเปลี่ยนแปลงในบริการ A คุณไม่ต้องการให้มีผลกับบริการ B
  2. การติดต่อกันสูง หากคุณต้องการใช้งานคุณสมบัติบางอย่างคุณต้องการจำนวนบริการที่เป็นไปได้น้อยที่สุดที่จะได้รับผลกระทบ
  3. เอกราชสูง หากบริการบางอย่างล้มเหลวคุณไม่ต้องการให้ทั้งระบบล่ม
  4. แก้ไขรายละเอียด คุณไม่ต้องการให้บริการของคุณช่างพูดเกินไปเนื่องจากเครือข่ายของคุณมีความซับซ้อนมากกว่าที่คุณคิด
  5. บริการควรสื่อสารผ่านกิจกรรมต่างๆ คุณไม่ต้องการให้บริการของคุณรับรู้ซึ่งกันและกันเพราะจะช่วยลดการบำรุงรักษา คิดว่าจะเกิดอะไรขึ้นถ้าคุณต้องการเพิ่มบริการใหม่
  6. กระจายข้อมูล บริการไม่ควรเปิดเผยวิธีการจัดเก็บข้อมูล เช่นเดียวกับวัตถุที่ดีมันเปิดเผยพฤติกรรมไม่ใช่ข้อมูล
  7. บริการออกแบบท่าเต้นในวงออเคสตร้า

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

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

ตัวอย่างของการใช้วิธีการนี้อาจจะเป็นที่น่าสนใจบางอย่าง


1

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

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

เมื่อต้องการอธิบายอย่างละเอียดเกี่ยวกับข้อที่สองของคุณในการมี API เกตเวย์ให้เป็น "สมาร์ท" รูปแบบที่ได้รับแรงฉุดขณะนี้มีเฟรมเวิร์กเช่นFalcorและRelay / GraphQLเพื่อขอข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่ต้องทำเพื่อ "API เกตเวย์" ดำเนินการข้อกำหนดเหล่านั้นโดยไม่จำเป็นต้องรู้ว่าอะไรGetTimelineเกี่ยวข้อง แต่จะได้รับคำขอเช่น "ขอข้อมูลผู้ใช้นี้จากบริการผู้ใช้และรับโพสต์เหล่านี้จากบริการโพสต์" หรืออะไรก็ตาม


0

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

คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับปัญหาที่คุณพยายามแก้ไขได้หรือไม่? เป็นภาษาอังกฤษง่าย ๆ ?

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