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


10

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


6
ฐานข้อมูลฟรี
Ewan

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

บริการสามารถแชร์ฐานข้อมูลได้อย่างง่ายดายในขณะที่แยกได้: เพียงให้ผู้ใช้ฐานข้อมูลของตนเองแต่ละคนสามารถเข้าถึงตารางได้ แต่ไม่สามารถเข้าถึงตารางของบริการอื่น ๆ ได้
Reinstate Monica

ทำไมคุณต้องมีโมดูลรหัสมากกว่าหนึ่งโมดูล คุณสามารถใส่รหัสทั้งหมดลงในคลาสสปาเก็ตตี้ชั้นเดียวได้! มันทำงานน้อยลง !!! (แน่นอนว่าข้อเสียคือการจัดการการเปลี่ยนแปลงกลายเป็นปัญหาใหญ่)
John Wu

@ Solomonoff'sSecret ที่อยู่คนเดียวไม่เพียงพอที่จะแยกบริการของคุณ หนึ่งใน“ ผู้ใช้” นั้นยังคงสามารถเรียกใช้แบบสอบถามที่เรียกใช้ซึ่งจะทำให้ช้าลงหรือลดทุกอย่างลง มันยังคงเป็นจุดเดียวของความล้มเหลว คุณแยกพวกเขาอย่างมีเหตุผลเท่านั้น
RubberDuck

คำตอบ:


15

ทำไมเราถึงต้องใช้มัน?

คุณทำไม่ได้

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

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

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

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

แต่ฐานข้อมูลเดียวทำให้เรามีความปลอดภัยและความสะดวกสบายมากมาย: การทำธุรกรรมกรด, ที่เดียวที่จะมอง, เข้าใจดี (kinda?), ที่เดียวที่จะจัดการ ฯลฯ

เดินทางไป microservices เป็นเพียงที่: การเดินทาง มันจะแตกต่างกันไปในแต่ละ บริษัท ไม่มีกฎที่ยากและเร็วเพียงแลกเปลี่ยนได้เท่านั้น

ส่วนที่ยากที่สุดเกี่ยวกับ Microservices: ข้อมูลของคุณ


2
ในบางสภาพแวดล้อมการจัดเก็บข้อมูลของคุณเป็นเพียงบริการอีกหนึ่งอย่างต่อไป ...
svidgen

2
คุณต้องการมันจริงๆ ประโยชน์ที่สำคัญของ microservices คือเพื่อให้สามารถที่จะมีความสมบูรณ์แยกของทุกอย่าง ทีมอาจตัดสินใจว่าจะย้ายจากสแต็ก Microsoft เต็มวันเป็น LAMP โดยไม่มีการขอคำแนะนำจากทีมอื่น หากมีการแชร์ฐานข้อมูลเดียวกันคุณจะไม่ว่างอีกต่อไป ทีม A ต้องการย้ายจาก SQL Server 2012 ไปเป็น SQL Server 2016 แต่ทีม B ไม่สามารถทำได้เนื่องจากพวกเขากำลังใช้คุณลักษณะที่ถูกลบออกจากเวอร์ชันที่ใหม่กว่า น่าเสียดายที่นี่ไม่ได้ จำกัด เฉพาะเวอร์ชั่น ทุกสิ่งที่สองทีมมีเหมือนกันอาจทำให้เกิดความขัดแย้ง
Arseni Mourzenko

@ArseniMourzenko ฉันเข้าใจว่า microservices ควรเป็นแพลตฟอร์มที่ไม่เชื่อเรื่องพระเจ้าและผนวกเข้าด้วยสัญญาการให้บริการเท่านั้น แต่มันเป็นไปไม่ได้ที่จะแยกฐานข้อมูลที่ใช้ร่วมกันหลายบริการถ้าคุณมีแผนการโยกย้ายที่มั่นคง ในบทบาทก่อนหน้าของฉันฉันเป็นผู้ถกเถียงสำหรับฐานข้อมูลแยกต่างหากสำหรับแอปพลิเคชันการดูแลสุขภาพหลายผู้เช่าของเรา แต่ผู้บริหารเลือกรูปแบบที่ใช้ร่วมกันเนื่องจากความกังวลด้านค่าใช้จ่าย ฉันยังคงผิดหวังกับสิ่งนั้นในอีกหนึ่งปีต่อมา
Dan Wilson

ฉันยังไม่เห็นองค์กรที่อนุญาตให้ทีมใช้แพลตฟอร์มที่แตกต่างกันอย่างมากมาย (เช่น. NET กับ LAMP) การตัดสินใจที่ผิดพลาดดังกล่าวจะถูกยิงลงอย่างรวดเร็วด้วยความกลัวว่าบริการบางอย่างจะสิ้นสุดในไซโลและสามารถดูแลได้เพียงทีมเดียวเท่านั้น
Dan Wilson

@DanWilson: เป็นไปได้ที่จะแยกฐานข้อมูลในภายหลัง ปัญหาคือเมื่อคุณเริ่มต้นด้วยฐานข้อมูลที่ใช้ร่วมกันการแยกเป็นทางเลือกที่ยาก ตัวอย่างพื้นฐาน: คุณต้องการคุณสมบัติจากฐานข้อมูลเวอร์ชั่นถัดไป ทีมอื่นยังไม่สามารถโยกย้ายได้ ในกรณีส่วนใหญ่คุณจะไม่แยก (ยากเกินไป) แต่ไม่ต้องการใช้คุณลักษณะใหม่ซึ่งโชคร้าย
Arseni Mourzenko

4

ในฐานะที่แดนวิลสันตอบคุณไม่ต้องการมันจริงๆ Microservices เป็นสิ่งใหม่ที่น่าสนใจและเช่นเดียวกับสิ่งใหม่ ๆ ที่น่าสนใจผู้คนใช้งานพวกเขาในหลาย ๆ ที่แม้จะไม่ได้ให้คุณค่ามากนัก

Microservices ช่วยให้คุณสามารถปรับใช้และปรับขนาดได้อย่างอิสระในระดับ "ไมโคร" ความละเอียดนั้นให้ประโยชน์ทางด้านเทคนิคและประโยชน์ที่ไม่ใช่ด้านเทคนิคมากยิ่งขึ้นเพราะช่วยให้คุณแยกทีมพัฒนาได้ดีกว่าปล่อยตามความต้องการมากกว่าหนึ่งรุ่นใหญ่ลองใช้เทคโนโลยีหรือกระบวนการใหม่ในการแยก ฯลฯ การมี DB ฆ่าร่วมกัน มากเพราะการพึ่งพาฐานข้อมูล หากคุณไม่สามารถปรับใช้บริการของคุณได้โดยไม่ต้องกังวลกับข้อมูลของบริการอื่นคุณก็เสีย

สิ่งที่ฐานข้อมูลแยกต่างหากอยู่นอกเหนือการสนทนา หรือฉันผิดธรรมดา

ที่กล่าวว่าคุณผิดธรรมดาด้วย

เมื่อคุณทำงานในคลาวด์ฐานข้อมูลราคาถูก ฟรี! แน่นอนว่าเซิร์ฟเวอร์มีค่าใช้จ่าย แต่เราไม่ได้พูดถึงเซิร์ฟเวอร์แต่ละเครื่องต่อบริการไมโครซอฟท์ (อย่างน้อยไม่ใช่ตอนแรก) เซิร์ฟเวอร์เดียวที่มีฐานข้อมูล (เชิงตรรกะ) จำนวนมากนั้นใช้ได้ตราบใดที่คุณยังขยันหมั่นเพียรในการหลีกเลี่ยงการสืบค้นข้ามฐานข้อมูล (ซึ่งแนะนำการพึ่งพาที่เป็นอันตรายต่อ "การปรับใช้และปรับขนาดได้อย่างอิสระ") นรกแบบสอบถามข้ามฐานข้อมูลเป็นไปไม่ได้ในบางบริการฐานข้อมูลระบบคลาวด์เช่น Azure SQL คุณไม่จำเป็นต้องขยันอยู่ที่นั่น ...

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

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

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


ยิ่งใหญ่ ฉันเดาว่าถ้าเราไม่ใช่ขนาดของ Amazon หรือ uber เราก็ควรหลีกเลี่ยง
โพสต์คำถาม

1
@ โพสต์คำถาม - ทำไมคุณคิดอย่างนั้น
Telastyn

เรากำลังทำโครงการ แต่ไม่รู้สึกว่าเราต้องการมัน
โพสต์คำถาม

1

ทำไมเราถึงต้องใช้มัน?

ประโยชน์มหาศาลของการบริการไมโครซอฟท์และที่สำคัญกว่านั้นคือ SOA ซึ่งเป็นระดับสูงของการทำ internals ไม่ใช่แค่การนำไปใช้ แต่ยังรวมถึงเทคโนโลยีที่ใช้ ตัวอย่างเช่นหากระบบได้รับการพัฒนาในรูปแบบห้า microservices โดยห้าทีมทีมหนึ่งสามารถตัดสินใจที่จะย้ายไปกองเทคโนโลยีที่แตกต่างอย่างสิ้นเชิง (ตัวอย่างเช่นจาก Microsoft stack to LAMP) โดยไม่ต้องขอความเห็นจากทีมอื่น

ดูที่ Amazon AWS หรือ Twilio คุณรู้หรือไม่ว่าบริการของพวกเขามีการใช้งานใน Java หรือ Ruby? พวกเขาใช้ Oracle หรือ PostgreSQL หรือ Cassandra หรือ MongoDB หรือไม่ พวกเขาใช้เครื่องจักรกี่เครื่อง? คุณสนใจเรื่องนั้นไหม ตัวเลือกด้านเทคโนโลยีเหล่านั้นมีผลกระทบต่อวิธีการใช้บริการเหล่านั้นหรือไม่ ... และที่สำคัญถ้าพวกเขาย้ายไปยังฐานข้อมูลอื่นคุณจะต้องเปลี่ยนแอปพลิเคชันไคลเอนต์ของคุณหรือไม่

ตอนนี้จะเกิดอะไรขึ้นถ้าบริการสองรายการใช้ฐานข้อมูลเดียวกัน นี่เป็นส่วนเล็ก ๆ ของปัญหาที่อาจเกิดขึ้น:

  • บริการการพัฒนาทีม 1 ต้องการย้ายจาก SQL Server 2012 ไปเป็น SQL Server 2016 อย่างไรก็ตามทีม 2 อาศัยคุณลักษณะที่เลิกใช้ซึ่งถูกลบออกใน SQL Server 2016

  • บริการ 1 คือความสำเร็จที่ยิ่งใหญ่ การโฮสต์ฐานข้อมูลบนเครื่องสองเครื่อง (master และ failover) ไม่ใช่ตัวเลือกอีกต่อไป แต่การปรับขนาดคลัสเตอร์เป็นหลาย ๆ เครื่องจำเป็นต้องใช้กลยุทธ์เช่นการแยกส่วน ในขณะเดียวกันทีม 2 มีความสุขกับขนาดปัจจุบันและไม่เห็นเหตุผลที่จะย้ายไปทำอะไรอย่างอื่น

  • บริการ 1 ควรย้ายไปที่ UTF-8 เป็นการเข้ารหัสเริ่มต้น อย่างไรก็ตามบริการ 2 มีความสุขเมื่อใช้รหัส Page 1252 Windows Latin 1

  • บริการ 1 ตัดสินใจเพิ่มผู้ใช้ที่มีชื่อเฉพาะ อย่างไรก็ตามผู้ใช้นี้มีอยู่แล้วสร้างทีมสองสามเดือนที่ผ่านมา

  • บริการ 1 ต้องการคุณสมบัติที่แตกต่างมากมาย บริการ 2 เป็นองค์ประกอบที่สำคัญอย่างยิ่งและจำเป็นต้องมีคุณสมบัติฐานข้อมูลอย่างน้อยที่สุดเพื่อลดความเสี่ยงของการถูกโจมตี

  • บริการ 1 ต้องการพื้นที่ดิสก์ 15 TB; ความเร็วไม่สำคัญดังนั้นฮาร์ดดิสก์ทั่วไปจึงใช้ได้อย่างสมบูรณ์ บริการ 2 ต้องการมากที่สุด 50 GB แต่ต้องการเข้าถึงเร็วที่สุดเท่าที่จะเป็นไปได้หมายความว่าข้อมูลควรเก็บไว้ใน SSD

  • ...

ทุกทางเลือกน้อยส่งผลกระทบต่อทุกคน การตัดสินใจทุกครั้งต้องได้รับความร่วมมือจากทุก ๆ ทีม จะต้องมีการประนีประนอม เปรียบเทียบกับอิสรภาพที่สมบูรณ์เพื่อทำสิ่งที่คุณต้องการในบริบทของ SOA

มันเกินไป [... ] ไม่สามารถจัดการได้

ถ้าอย่างนั้นคุณก็ทำผิด ฉันคิดว่าคุณกำลังปรับใช้ด้วยตนเอง

นี่ไม่ใช่สิ่งที่ควรทำ คุณต้องทำการปรับใช้เครื่องเสมือนอัตโนมัติ (หรือคอนเทนเนอร์ Docker) ซึ่งเรียกใช้ฐานข้อมูลโดยอัตโนมัติ เมื่อคุณดำเนินการอัตโนมัติการปรับใช้เซิร์ฟเวอร์สองเครื่องหรือเซิร์ฟเวอร์ยี่สิบเครื่องหรือเซิร์ฟเวอร์สองพันเครื่องไม่แตกต่างกันมาก

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

หากฐานข้อมูลขนาดใหญ่ต้องมีผู้ดูแลระบบเฉพาะฐานข้อมูลที่ใช้โดยเฉพาะทีมใดทีมหนึ่งสามารถเป็นหลักได้รับการจัดการโดยทีมงานนี้ (DevOps เป็นยังเกี่ยวกับที่) พ้นเวลาที่ผู้ดูแลระบบ

มันแพงเกินไป

กำหนดต้นทุน

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

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

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


0

ขึ้นอยู่กับสิ่งที่คุณคิดว่า "แพง"

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

บริการทั้งหมดเหล่านั้นยังสามารถแบ่งปันอินสแตนซ์ / เซิร์ฟเวอร์ฐานข้อมูลเดียวและมี schema ที่แยกได้ต่อบริการเท่านั้น

เหตุผลหลักที่นี่คือการบริการที่จำเป็นในการเป็นเจ้าของและควบคุมข้อมูลของมัน มันจะบรรลุได้อย่างไรเป็นเรื่องของการเลือกและรายละเอียดทางเทคนิค

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

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

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