Building Block ของแอปพลิเคชันแบบกระจาย การประมาณเป็นศูนย์

Building Block ของแอปพลิเคชันแบบกระจาย การประมาณเป็นศูนย์

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

การแนะนำ

เราซึ่งเป็นผู้พัฒนาเลือกวิธีการแลกเปลี่ยนข้อมูลในระบบทั้งนี้ขึ้นอยู่กับขนาดของระบบที่ออกแบบและข้อกำหนด ในกรณีส่วนใหญ่ เพื่อจัดระเบียบปฏิสัมพันธ์ของบริการ ตัวเลือกการทำงานอาจเป็นโครงการกับนายหน้า ตัวอย่างเช่น ตาม RabbitMQ หรือ kafka แต่บางครั้งกระแสของเหตุการณ์ SLA และระดับการควบคุมระบบทำให้การส่งข้อความสำเร็จรูปไม่เหมาะกับเรา แน่นอน คุณสามารถทำให้ระบบซับซ้อนได้เล็กน้อยโดยรับผิดชอบต่อเลเยอร์การขนส่งและการสร้างคลัสเตอร์ เช่น การใช้ ZeroMQ หรือ nanomsg แต่หากระบบมีปริมาณงานและความสามารถของคลัสเตอร์ Erlang มาตรฐานเพียงพอ ปัญหาในการแนะนำเอนทิตีเพิ่มเติมจำเป็นต้องมีการศึกษาโดยละเอียดและเหตุผลทางเศรษฐกิจ

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

พื้นฐานทางทฤษฎี

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

ให้เราเน้นข้อกำหนดหลัก 4 ประการสำหรับระบบขั้นสุดท้าย:

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

จำเทพนิยายเก่าๆ เกี่ยวกับ “เครื่องยนต์เล็กๆ ที่ทำได้” ได้ไหม? เพื่อให้ระบบที่ออกแบบสามารถออกจากขั้นตอนต้นแบบได้สำเร็จและมีความก้าวหน้า รากฐานของระบบจะต้องเป็นไปตามข้อกำหนดขั้นต่ำ หมอกควัน.

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

มุ่งเน้นเหตุการณ์

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

ความสามารถในการปรับขนาด

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

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

ในระดับคลัสเตอร์ ปัญหาในการกำจัดก็มีอยู่เช่นกัน สิ่งสำคัญคือเครื่องทั้งหมดในคลัสเตอร์จะต้องโหลดเท่ากัน และเครือข่ายต้องไม่โอเวอร์โหลด ลองจินตนาการถึงสถานการณ์: ปริมาณการใช้งานของผู้ใช้จะเข้าสู่ Balancer ขาเข้า (haproxy, nginx ฯลฯ) โดยจะกระจายคำขอการประมวลผลเท่าๆ กันที่สุดเท่าที่จะเป็นไปได้ระหว่างชุดแบ็กเอนด์ที่มีอยู่ ภายในโครงสร้างพื้นฐานของแอปพลิเคชัน บริการที่ใช้อินเทอร์เฟซที่จำเป็นนั้นเป็นเพียงไมล์สุดท้ายเท่านั้น และจะต้องขอบริการอื่น ๆ มากมายเพื่อตอบสนองคำขอเริ่มแรก คำขอภายในยังต้องมีการกำหนดเส้นทางและการปรับสมดุลด้วย
เพื่อจัดการกระแสข้อมูลอย่างมีประสิทธิภาพ การส่งข้อความจะต้องจัดเตรียมอินเทอร์เฟซให้นักพัฒนาเพื่อจัดการการกำหนดเส้นทางและการทำโหลดบาลานซ์ ด้วยเหตุนี้ นักพัฒนาจะสามารถใช้รูปแบบไมโครเซอร์วิส (ตัวรวบรวม พร็อกซี เชน สาขา ฯลฯ) เพื่อแก้ปัญหาทั้งปัญหามาตรฐานและปัญหาที่ไม่ค่อยเกิดขึ้น

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

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

ความอดทนต่อความผิดพลาด

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

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

การตอบสนอง

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

สรุปเบื้องต้น

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

จบภาคแรก.

Фото @lucabravo.

ที่มา: will.com

เพิ่มความคิดเห็น