การปรับขนาดเสาหินเทียบกับการปรับขนาดไมโครเซลเซอร์


15

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

ช่วยบอกว่าเรามีแอปพลิเคชันซึ่งประกอบด้วย 10 microservice กับ 9 ในนั้นมีสองอินสแตนซ์ (สำหรับความซ้ำซ้อน) และหนึ่งในนั้นมี 4 อินสแตนซ์เพื่อจัดการกับโหลด (scalability) อาร์กิวเมนต์ pro-microservice จะทำให้คุณสามารถปรับขนาด miroservice นี้ได้อย่างอิสระจากบริการอื่น ๆ

อย่างไรก็ตามสมมติว่า 10 microservices ทั้งหมดเป็นโมดูลในโมโนลิ ธ เดียวและอินสแตนซ์หลายตัวอย่าง (เช่น 22 จากผลรวมจากด้านบน) ของโมโนลิ ธ นี้ถูกปรับใช้ ระบบควรสามารถจัดการกับโหลดสำหรับส่วนที่สำคัญอย่างหนึ่งได้เนื่องจากมีอินสแตนซ์เพียงพอที่จะทำเช่นนั้น หากอินสแตนซ์นั้นมีโปรแกรมตรรกะไม่จำเป็นต้องมีข้อเสียเพียงอย่างเดียวคือว่าไบนารีและปริมาณ RAM ที่ต้องการจะใหญ่ขึ้นเล็กน้อย แต่จากนั้นอีกครั้งความแตกต่างไม่ควรใหญ่เกินไปในกรณีส่วนใหญ่ - อย่างน้อยก็ไม่ต้องเปรียบเทียบกับสแต็กที่เหลือ (คิดว่า Spring Boot) คว่ำของ monlith ที่ปรับขนาดจะเป็นระบบที่ง่ายขึ้นโดยไม่ต้อง (ส่วนใหญ่) ความผิดพลาดของระบบกระจาย

ฉันพลาดอะไรไปรึเปล่า?


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

ฉันไม่ได้นับบรรทัดของโค้ด แต่ monolith จะมีโค้ดหลายพันบรรทัด (ไม่ใช่ระบบยักษ์) จุดเริ่มต้นของการพิจารณาของฉันคือขนาดของรหัสแอปพลิเคชันจริงมีขนาดเล็กเมื่อเทียบกับเฟรมเวิร์กขนาดใหญ่เช่น Spring และ Hibernate จำนวนของการปรับใช้อาจน้อยกว่าด้วย microservices เพราะถ้าคุณมี 2 อินสแตนซ์คุณจะมีความซ้ำซ้อนพื้นฐานอยู่แล้วและอินสแตนซ์อื่น ๆ ก็จะเพิ่มความยืดหยุ่น
deamon

@deamon โปรดทราบว่าด้วยวิธีการ monolith จะไม่มีส่วนใดของรหัสที่ตายโดยสิ้นเชิงในแต่ละตัวอย่างเพียงใช้รหัสน้อย ตอนนี้โค้ดเองอาจใช้หน่วยความจำเพียงเล็กน้อยเท่านั้น แต่หากใช้วัตถุจำนวนมากที่ถูกแคชไว้ในหน่วยความจำปริมาณนั้นจะเพิ่มขึ้นอย่างมาก
Frank Hopkins

โปรดทราบว่าค่าใช้จ่ายพื้นฐานของ "การเรียกใช้รหัส" ไม่จำเป็นต้องมีขนาดใหญ่เท่าที่คุณอาจทราบจากแอปพลิเคชัน Java ของคุณซึ่งบ่อยครั้งที่ jvm ทั้งหมดเป็นส่วนหนึ่งของอิมเมจบริการ
Frank Hopkins

คำตอบ:


21

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

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

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


2
ตกลง เหตุผลในการย้ายไปที่สถาปัตยกรรมบริการไมโครเป็นส่วนใหญ่ทางการเมือง โหลดแบบกระจายการแยกสัญญาณคือผลที่ตามมาไม่ใช่สาเหตุ ประโยชน์ที่แท้จริงของ microservices อยู่ที่ SDLC และการกำกับดูแล ยิ่งไปกว่านั้นสถาปัตยกรรมคือการตอบสนองอย่างมีเหตุผลต่อความต้องการซึ่งในกรณีส่วนใหญ่มาจากกลยุทธ์การตลาดของ บริษัท เวลาในการออกสู่ตลาดสั้นกว่าสถาปัตยกรรมแบบ monolith ดังนั้น บริษัท จึงได้รับอนุญาตให้ใช้กลยุทธ์ใหม่เปลี่ยนจากที่หนึ่งไปอีกที่หนึ่งได้อย่างราบรื่นและรวดเร็ว
Laiv

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

»เราทำเพราะเราต้องทำเพราะความซับซ้อนทำให้เราดีขึ้นและทำให้สถานการณ์ที่ดีที่สุดแย่ลง«ใช่ สำหรับฉันมันตอกตะปู!
โทมัสขยะ

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

1
@ewan คุณสามารถใช้คอมพิวเตอร์มากกว่าหนึ่งเครื่องกับ monoliths ได้เช่นกัน
deamon

3

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

อย่างไรก็ตาม ทันทีที่คุณมีความไม่สมดุลบอกว่า Service 5 ใช้เวลา 100% ของ cpu เป็นเวลา 2 นาทีคุณต้องการย้ายบริการนั้นไปยังกล่องของตัวเองเพื่อไม่ให้บล็อกบริการอื่น ๆ ทั้งหมดหากทำงาน

หากการเรียกใช้บริการหมดเวลา 5 ครั้งเนื่องจากการโหลดเฉพาะแอปของคุณบางฟังก์ชันเท่านั้นที่จะล้มเหลวแทนทั้งหมด

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

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


1

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


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