สวัสดี! ฉันชื่อ Vadim Madison ฉันเป็นผู้นำการพัฒนา Avito System Platform มีการกล่าวมากกว่าหนึ่งครั้งว่าเราในบริษัทกำลังย้ายจากสถาปัตยกรรมเสาหินไปสู่ไมโครเซอร์วิสอย่างไร ถึงเวลาแบ่งปันวิธีที่เราเปลี่ยนแปลงโครงสร้างพื้นฐานของเราเพื่อรับประโยชน์สูงสุดจากไมโครเซอร์วิส และป้องกันตัวเราเองจากการหลงทางในไมโครเซอร์วิสเหล่านั้น PaaS ช่วยเราได้อย่างไร วิธีที่เราใช้ทำให้การปรับใช้ง่ายขึ้นและลดการสร้างไมโครเซอร์วิสได้ในคลิกเดียว โปรดอ่านต่อ ไม่ใช่ทุกสิ่งที่ฉันเขียนถึงด้านล่างนี้จะถูกนำมาใช้อย่างสมบูรณ์ใน Avito บางส่วนเป็นเพียงวิธีที่เราพัฒนาแพลตฟอร์มของเรา
(และในตอนท้ายของบทความนี้ ผมจะพูดถึงโอกาสในการเข้าร่วมสัมมนาสามวันจากผู้เชี่ยวชาญด้านสถาปัตยกรรมไมโครเซอร์วิส Chris Richardson)
เรามาถึงไมโครเซอร์วิสได้อย่างไร
Avito เป็นหนึ่งในเว็บไซต์ลับที่ใหญ่ที่สุดในโลก โดยมีการเผยแพร่โฆษณาใหม่มากกว่า 15 ล้านรายการต่อวัน แบ็กเอนด์ของเรายอมรับคำขอมากกว่า 20 คำขอต่อวินาที ปัจจุบันเรามีไมโครเซอร์วิสหลายร้อยรายการ
เราได้สร้างสถาปัตยกรรมไมโครเซอร์วิสมาหลายปีแล้ว เป็นอย่างไร - เพื่อนร่วมงานของเราโดยละเอียด
ในตอนแรก เราไม่ได้สร้างระบบนิเวศที่จะช่วยเราพัฒนาและเปิดตัวไมโครเซอร์วิสอย่างครอบคลุม พวกเขาเพียงแค่รวบรวมโซลูชันโอเพ่นซอร์สที่เหมาะสม เปิดตัวที่บ้าน และเชิญนักพัฒนาให้จัดการกับพวกเขา เป็นผลให้เขาไปที่สถานที่หลายแห่ง (แดชบอร์ดบริการภายใน) หลังจากนั้นเขาก็แข็งแกร่งขึ้นในความปรารถนาที่จะตัดโค้ดด้วยวิธีเก่าแบบเสาหิน สีเขียวในไดอะแกรมด้านล่างบ่งบอกถึงสิ่งที่นักพัฒนาทำไม่ทางใดก็ทางหนึ่งด้วยมือของเขาเอง และสีเหลืองบ่งบอกถึงระบบอัตโนมัติ
ขณะนี้ในยูทิลิตี้ PaaS CLI บริการใหม่จะถูกสร้างขึ้นด้วยคำสั่งเดียว และฐานข้อมูลใหม่จะถูกเพิ่มด้วยอีกสองคำสั่งและปรับใช้กับ Stage
วิธีเอาชนะยุค “ไมโครเซอร์วิสแฟรกเมนต์”
ด้วยสถาปัตยกรรมแบบเสาหิน เพื่อความสอดคล้องของการเปลี่ยนแปลงในผลิตภัณฑ์ นักพัฒนาจึงถูกบังคับให้ต้องค้นหาว่าเกิดอะไรขึ้นกับเพื่อนบ้านของตน เมื่อทำงานกับสถาปัตยกรรมใหม่ บริบทการบริการจะไม่ขึ้นอยู่กับกันและกันอีกต่อไป
นอกจากนี้ เพื่อให้สถาปัตยกรรมไมโครเซอร์วิสมีประสิทธิภาพ จำเป็นต้องสร้างกระบวนการต่างๆ มากมาย กล่าวคือ:
• การทำไม้;
• ขอติดตาม (เยเกอร์);
• การรวมข้อผิดพลาด (ยาม);
• สถานะ ข้อความ เหตุการณ์จาก Kubernetes (การประมวลผลสตรีมเหตุการณ์)
• ขีดจำกัดการแข่งขัน / เซอร์กิตเบรกเกอร์ (คุณสามารถใช้ Hystrix ได้);
• การควบคุมการเชื่อมต่อบริการ (เราใช้ Netramesh)
• การตรวจสอบ (Grafana);
• การชุมนุม (TeamCity);
• การสื่อสารและการแจ้งเตือน (Slack, อีเมล);
• การติดตามงาน; (จิรา)
• จัดทำเอกสารต่างๆ
เพื่อให้แน่ใจว่าระบบจะไม่สูญเสียความสมบูรณ์และยังคงมีประสิทธิภาพเมื่อมีการขยายขนาด เราได้คิดใหม่เกี่ยวกับการจัดองค์กรของไมโครเซอร์วิสใน Avito
เราจัดการไมโครเซอร์วิสอย่างไร
ความช่วยเหลือต่อไปนี้ในการใช้ "นโยบายปาร์ตี้" แบบครบวงจรในไมโครเซอร์วิส Avito จำนวนมาก:
- การแบ่งโครงสร้างพื้นฐานออกเป็นชั้น ๆ
- แนวคิดแพลตฟอร์มเป็นบริการ (PaaS)
- ตรวจสอบทุกสิ่งที่เกิดขึ้นกับไมโครเซอร์วิส
ชั้นนามธรรมของโครงสร้างพื้นฐานประกอบด้วยสามชั้น เริ่มจากบนลงล่างกัน
A. Top - ตาข่ายบริการ ในตอนแรกเราลองใช้ Istio แต่ปรากฏว่าใช้ทรัพยากรมากเกินไป ซึ่งแพงเกินไปสำหรับปริมาณของเรา ดังนั้นวิศวกรอาวุโสในทีมสถาปัตยกรรม Alexander Lukyanchenko จึงได้พัฒนาโซลูชันของเขาเอง -
B. ปานกลาง - Kubernetes เราปรับใช้และดำเนินการไมโครเซอร์วิสกับมัน
C. ด้านล่าง - โลหะเปลือย เราไม่ได้ใช้คลาวด์หรือสิ่งต่าง ๆ เช่น OpenStack แต่อาศัย Bare Metal ทั้งหมด
เลเยอร์ทั้งหมดถูกรวมเข้าด้วยกันโดย PaaS และแพลตฟอร์มนี้ก็ประกอบด้วยสามส่วน
I. เครื่องกำเนิดไฟฟ้าควบคุมผ่านยูทิลิตี้ CLI เธอคือผู้ที่ช่วยนักพัฒนาสร้างไมโครเซอร์วิสด้วยวิธีที่ถูกต้องและใช้ความพยายามน้อยที่สุด
ครั้งที่สอง นักสะสมรวม พร้อมการควบคุมเครื่องมือทั้งหมดผ่านแดชบอร์ดทั่วไป
สาม. พื้นที่จัดเก็บ. เชื่อมต่อกับตัวกำหนดเวลาที่จะตั้งค่าทริกเกอร์สำหรับการดำเนินการที่สำคัญโดยอัตโนมัติ ด้วยระบบดังกล่าว จึงไม่พลาดงานใดงานหนึ่งเพียงเพราะมีคนลืมตั้งค่างานใน Jira เราใช้เครื่องมือภายในที่เรียกว่า Atlas สำหรับสิ่งนี้
การใช้งานไมโครเซอร์วิสใน Avito นั้นดำเนินการตามรูปแบบเดียวซึ่งทำให้การควบคุมง่ายขึ้นในแต่ละขั้นตอนของการพัฒนาและการเปิดตัว
ไปป์ไลน์การพัฒนาไมโครเซอร์วิสมาตรฐานทำงานอย่างไร
โดยทั่วไปแล้ว ห่วงโซ่การสร้างไมโครเซอร์วิสจะมีลักษณะดังนี้:
CLI-push → การรวมอย่างต่อเนื่อง → อบ → ปรับใช้ → การทดสอบประดิษฐ์ → การทดสอบ Canary → การทดสอบการบีบ → การผลิต → การบำรุงรักษา
มาดูกันตามลำดับนี้
CLI-ผลักดัน
• การสร้างไมโครเซอร์วิส.
เราต่อสู้ดิ้นรนมาเป็นเวลานานในการสอนนักพัฒนาทุกคนถึงวิธีทำไมโครเซอร์วิส รวมถึงการเขียนคำแนะนำโดยละเอียดใน Confluence แต่แผนการเปลี่ยนไปและได้รับการเสริม ผลลัพธ์ก็คือคอขวดปรากฏขึ้นในช่วงเริ่มต้นของการเดินทาง โดยต้องใช้เวลานานกว่ามากในการเปิดตัวไมโครเซอร์วิส และยังคงมีปัญหาเกิดขึ้นระหว่างการสร้างไมโครเซอร์วิส
ในท้ายที่สุด เราได้สร้างยูทิลิตี้ CLI ง่ายๆ ที่ทำให้ขั้นตอนพื้นฐานเป็นอัตโนมัติเมื่อสร้างไมโครเซอร์วิส ที่จริงแล้วมันมาแทนที่การกดคอมไพล์ครั้งแรก นี่คือสิ่งที่เธอทำ
— สร้างบริการตามเทมเพลต — ทีละขั้นตอน ในโหมด “ตัวช่วยสร้าง” เรามีเทมเพลตสำหรับภาษาการเขียนโปรแกรมหลักในแบ็กเอนด์ Avito: PHP, Golang และ Python
- ทีละคำสั่งจะปรับใช้สภาพแวดล้อมสำหรับการพัฒนาท้องถิ่นบนเครื่องเฉพาะ - เปิดตัว Minikube แผนภูมิ Helm จะถูกสร้างขึ้นและเปิดใช้งานโดยอัตโนมัติใน kubernetes ในพื้นที่
— เชื่อมต่อฐานข้อมูลที่ต้องการ นักพัฒนาไม่จำเป็นต้องทราบ IP ข้อมูลเข้าสู่ระบบ และรหัสผ่านเพื่อเข้าถึงฐานข้อมูลที่เขาต้องการ ไม่ว่าจะเป็นในเครื่อง ที่ขั้นตอน หรือในการใช้งานจริง นอกจากนี้ ฐานข้อมูลยังถูกปรับใช้ทันทีในการกำหนดค่าที่ทนทานต่อข้อผิดพลาดและด้วยการปรับสมดุล
— มันทำการประกอบแบบสดด้วยตัวมันเอง สมมติว่านักพัฒนาแก้ไขบางสิ่งในไมโครเซอร์วิสผ่าน IDE ของเขา ยูทิลิตี้เห็นการเปลี่ยนแปลงในระบบไฟล์และสร้างแอปพลิเคชันใหม่ (สำหรับ Golang) และรีสตาร์ทตามนั้น สำหรับ PHP เราเพียงส่งต่อไดเร็กทอรีภายในคิวบ์ จากนั้นระบบจะโหลดการรีโหลดแบบสด "อัตโนมัติ"
— สร้างการทดสอบอัตโนมัติ ในรูปแบบช่องว่างแต่ค่อนข้างเหมาะกับการใช้งาน
• การใช้งานไมโครเซอร์วิส.
การปรับใช้ไมโครเซอร์วิสเคยเป็นงานที่น่าเบื่อสำหรับเรา จำเป็นต้องมีสิ่งต่อไปนี้:
I. ด็อคเกอร์ไฟล์.
ครั้งที่สอง การกำหนดค่า
สาม. แผนภูมิหางเสือ ซึ่งตัวมันเองยุ่งยากและประกอบด้วย:
— แผนภูมิเอง
— แม่แบบ;
— ค่าเฉพาะโดยคำนึงถึงสภาพแวดล้อมที่แตกต่างกัน
เราได้ขจัดความเจ็บปวดจากการทำงานซ้ำรายการ Kubernetes ดังนั้นตอนนี้รายการเหล่านั้นจึงถูกสร้างขึ้นโดยอัตโนมัติ แต่ที่สำคัญที่สุด พวกเขาทำให้การปรับใช้ง่ายขึ้นจนถึงขีดจำกัด จากนี้ไป เรามี Dockerfile และนักพัฒนาจะเขียนการกำหนดค่าทั้งหมดลงในไฟล์ app.toml สั้นเพียงไฟล์เดียว
ใช่ และใน app.toml เองก็ไม่มีอะไรให้ทำแม้แต่นาทีเดียว เราระบุตำแหน่งและจำนวนสำเนาของบริการที่จะเพิ่ม (บนเซิร์ฟเวอร์ dev, ในการแสดงชั่วคราว, ในการใช้งานจริง) และระบุการขึ้นต่อกันของบริการ สังเกตเส้นขนาด = "เล็ก" ในบล็อก [เครื่องยนต์] นี่คือขีดจำกัดที่จะจัดสรรให้กับบริการผ่าน Kubernetes
จากนั้น ตามการกำหนดค่า แผนภูมิ Helm ที่จำเป็นทั้งหมดจะถูกสร้างขึ้นโดยอัตโนมัติ และสร้างการเชื่อมต่อกับฐานข้อมูล
• การตรวจสอบขั้นพื้นฐาน การตรวจสอบดังกล่าวยังเป็นแบบอัตโนมัติอีกด้วย
จำเป็นต้องติดตาม:
— มี Dockerfile หรือไม่;
— มี app.toml ไหม;
- มีเอกสารให้ไหม?
— การพึ่งพาอาศัยกันเป็นลำดับหรือไม่?
— มีการตั้งค่ากฎการแจ้งเตือนหรือไม่
จนถึงจุดสุดท้าย: เจ้าของบริการเองเป็นผู้กำหนดว่าเมตริกผลิตภัณฑ์ใดที่จะตรวจสอบ
• จัดทำเอกสารต่างๆ
ยังคงเป็นพื้นที่ที่มีปัญหา ดูเหมือนว่าจะชัดเจนที่สุด แต่ในขณะเดียวกันก็ยังเป็นบันทึกที่ "มักถูกลืม" และด้วยเหตุนี้จึงเป็นจุดเชื่อมโยงที่เปราะบางในสายโซ่
จำเป็นต้องมีเอกสารประกอบสำหรับไมโครเซอร์วิสแต่ละรายการ ประกอบด้วยบล็อกต่อไปนี้
I. คำอธิบายโดยย่อของบริการ. ประโยคเล็กๆ น้อยๆ เกี่ยวกับสิ่งที่มันทำและเหตุใดจึงจำเป็น
ครั้งที่สอง ลิงค์แผนภาพสถาปัตยกรรม. สิ่งสำคัญคือต้องเข้าใจได้ง่ายเมื่อมองดูอย่างรวดเร็ว เช่น คุณกำลังใช้ Redis สำหรับการแคชหรือเป็นที่เก็บข้อมูลหลักในโหมดถาวรหรือไม่ ใน Avito ในตอนนี้ นี่คือลิงก์ไปยัง Confluence
สาม. รันบุ๊ก. คำแนะนำสั้นๆ เกี่ยวกับการเริ่มบริการและความซับซ้อนในการจัดการ
IV. คำถามที่พบบ่อยซึ่งจะเป็นการดีที่จะคาดการณ์ถึงปัญหาที่เพื่อนร่วมงานของคุณอาจพบเมื่อทำงานกับบริการ
V. คำอธิบายของตำแหน่งข้อมูลสำหรับ API. หากจู่ๆ คุณไม่ระบุจุดหมายปลายทาง เพื่อนร่วมงานที่มีไมโครเซอร์วิสเกี่ยวข้องกับคุณจะต้องจ่ายเงินให้แน่นอน ตอนนี้เราใช้ Swagger และโซลูชันของเราเรียกว่า Brief สำหรับสิ่งนี้
วี. ป้ายกำกับ. หรือเครื่องหมายที่แสดงผลิตภัณฑ์ ฟังก์ชันการทำงาน หรือแผนกโครงสร้างของบริษัทที่ให้บริการ สิ่งเหล่านี้ช่วยให้คุณเข้าใจได้อย่างรวดเร็ว เช่น คุณกำลังตัดฟังก์ชันการทำงานที่เพื่อนร่วมงานของคุณเปิดตัวสำหรับหน่วยธุรกิจเดียวกันเมื่อสัปดาห์ที่แล้วหรือไม่
ปกเกล้าเจ้าอยู่หัว เจ้าของหรือเจ้าของบริการ. ในกรณีส่วนใหญ่ สามารถกำหนดได้โดยอัตโนมัติโดยใช้ PaaS แต่เพื่อความปลอดภัย เรากำหนดให้นักพัฒนาระบุด้วยตนเอง
สุดท้ายนี้ การตรวจสอบเอกสารประกอบคล้ายกับการตรวจสอบโค้ดถือเป็นแนวปฏิบัติที่ดี
การบูรณาการอย่างต่อเนื่อง
- กำลังเตรียมที่เก็บข้อมูล
- การสร้างไปป์ไลน์ใน TeamCity
- กำหนดสิทธิ.
- ค้นหาเจ้าของบริการ มีรูปแบบไฮบริดอยู่ที่นี่ - การทำเครื่องหมายด้วยตนเองและระบบอัตโนมัติขั้นต่ำจาก PaaS โครงการอัตโนมัติโดยสมบูรณ์จะล้มเหลวเมื่อมีการโอนบริการเพื่อสนับสนุนทีมพัฒนาอื่น หรือ ตัวอย่างเช่น หากนักพัฒนาบริการลาออก
- การลงทะเบียนบริการใน Atlas (ดูด้านบน). กับเจ้าของและผู้พึ่งพาทั้งหมด
- การตรวจสอบการโยกย้าย เราตรวจสอบว่ามีสิ่งใดที่อาจเป็นอันตรายหรือไม่ ตัวอย่างเช่น หนึ่งในนั้นจะมีตารางแก้ไขหรืออย่างอื่นปรากฏขึ้นซึ่งสามารถทำลายความเข้ากันได้ของสคีมาข้อมูลระหว่างบริการเวอร์ชันต่างๆ จากนั้นการโยกย้ายจะไม่ดำเนินการ แต่อยู่ในการสมัครสมาชิก - PaaS จะต้องส่งสัญญาณให้เจ้าของบริการเมื่อใช้งานได้อย่างปลอดภัย
อบ
ขั้นต่อไปคือบริการบรรจุภัณฑ์ก่อนการใช้งาน
- การสร้างแอปพลิเคชัน ตามแบบคลาสสิก - ในรูปนักเทียบท่า
- การสร้างแผนภูมิ Helm สำหรับตัวบริการและทรัพยากรที่เกี่ยวข้อง รวมถึงฐานข้อมูลและแคช สร้างขึ้นโดยอัตโนมัติตามการกำหนดค่า app.toml ที่สร้างขึ้นในขั้นตอนการกด CLI
- การสร้างตั๋วสำหรับผู้ดูแลระบบเพื่อเปิดพอร์ต (เมื่อจำเป็น)
- รันการทดสอบหน่วยและการคำนวณการครอบคลุมโค้ด. หากการครอบคลุมโค้ดต่ำกว่าเกณฑ์ที่ระบุ เป็นไปได้มากว่าบริการจะไม่ไปต่อ - เพื่อการปรับใช้ หากใกล้จะยอมรับได้ บริการจะได้รับค่าสัมประสิทธิ์ "การมองในแง่ร้าย" จากนั้นหากไม่มีการปรับปรุงตัวบ่งชี้เมื่อเวลาผ่านไป นักพัฒนาจะได้รับการแจ้งเตือนว่าไม่มีความคืบหน้าในแง่ของการทดสอบ ( และจำเป็นต้องทำอะไรสักอย่างเกี่ยวกับเรื่องนี้)
- การบัญชีสำหรับข้อจำกัดของหน่วยความจำและ CPU. เราเขียนไมโครเซอร์วิสใน Golang เป็นหลักและรันใน Kubernetes ดังนั้นความละเอียดอ่อนประการหนึ่งที่เกี่ยวข้องกับลักษณะเฉพาะของภาษา Golang: โดยค่าเริ่มต้น เมื่อเริ่มต้น ระบบจะใช้คอร์ทั้งหมดบนเครื่อง หากคุณไม่ได้ตั้งค่าตัวแปร GOMAXPROCS อย่างชัดเจน และเมื่อมีการเปิดตัวบริการดังกล่าวหลายอย่างบนเครื่องเดียวกัน พวกเขาก็จะเริ่มต้น แย่งชิงทรัพยากรรบกวนกัน กราฟด้านล่างแสดงการเปลี่ยนแปลงเวลาดำเนินการหากคุณเรียกใช้แอปพลิเคชันโดยไม่มีความขัดแย้งและอยู่ในโหมดการแข่งขันเพื่อชิงทรัพยากร (ที่มาของกราฟคือ
ที่นี่ ).
เวลาดำเนินการ ยิ่งน้อยยิ่งดี สูงสุด: 643ms ขั้นต่ำ: 42ms ภาพถ่ายสามารถคลิกได้
ใช้เวลาในการผ่าตัด ยิ่งน้อยยิ่งดี สูงสุด: 14091 ns ขั้นต่ำ: 151 ns ภาพถ่ายสามารถคลิกได้
ในขั้นตอนการเตรียมการประกอบ คุณสามารถตั้งค่าตัวแปรนี้อย่างชัดเจน หรือคุณสามารถใช้ไลบรารีก็ได้
ปรับใช้
• การตรวจสอบแบบแผน ก่อนที่คุณจะเริ่มส่งมอบแอสเซมบลีการบริการไปยังสภาพแวดล้อมที่คุณต้องการ คุณต้องตรวจสอบสิ่งต่อไปนี้:
- จุดสิ้นสุด API
— การปฏิบัติตามการตอบสนองจุดสิ้นสุด API กับสคีมา
— รูปแบบบันทึก
— การตั้งค่าส่วนหัวสำหรับการร้องขอไปยังบริการ (ปัจจุบันนี้ทำได้โดย netramesh)
— การตั้งค่าโทเค็นของเจ้าของเมื่อส่งข้อความไปยังบัสเหตุการณ์ สิ่งนี้จำเป็นสำหรับการติดตามการเชื่อมต่อของบริการต่างๆ บนรถบัส คุณสามารถส่งทั้งข้อมูล idempotent ไปยังบัส ซึ่งไม่ได้เพิ่มการเชื่อมต่อของบริการ (ซึ่งดี) และข้อมูลธุรกิจที่เสริมความแข็งแกร่งให้กับการเชื่อมต่อของบริการ (ซึ่งแย่มาก!) และเมื่อการเชื่อมต่อนี้กลายเป็นปัญหา การทำความเข้าใจว่าใครเขียนและอ่านบัสจะช่วยแยกบริการได้อย่างเหมาะสม
ยังไม่มีแบบแผนใน Avito มากนัก แต่กลุ่มของพวกเขากำลังขยายออกไป ยิ่งมีข้อตกลงดังกล่าวในรูปแบบที่ทีมสามารถเข้าใจและเข้าใจได้มากเท่าไร การรักษาความสอดคล้องระหว่างไมโครเซอร์วิสก็จะยิ่งง่ายขึ้นเท่านั้น
การทดสอบสังเคราะห์
• การทดสอบวงปิด สำหรับสิ่งนี้ เรากำลังใช้โอเพ่นซอร์ส
• การทดสอบความเครียด เราพยายามนำบริการทั้งหมดมาสู่ประสิทธิภาพสูงสุด และทุกเวอร์ชันของแต่ละบริการจะต้องได้รับการทดสอบโหลด ด้วยวิธีนี้เราจะสามารถเข้าใจประสิทธิภาพปัจจุบันของบริการและความแตกต่างจากบริการเดียวกันเวอร์ชันก่อนหน้าได้ หลังจากอัปเดตบริการแล้ว หากประสิทธิภาพลดลงหนึ่งเท่าครึ่ง นี่เป็นสัญญาณที่ชัดเจนสำหรับเจ้าของ: คุณต้องเจาะลึกโค้ดและแก้ไขสถานการณ์
เราใช้ข้อมูลที่รวบรวมไว้ เช่น เพื่อปรับใช้การปรับขนาดอัตโนมัติอย่างถูกต้อง และท้ายที่สุดแล้ว โดยทั่วไปจะเข้าใจว่าบริการสามารถปรับขนาดได้เพียงใด
ในระหว่างการทดสอบโหลด เราจะตรวจสอบว่าการใช้ทรัพยากรตรงตามขีดจำกัดที่ตั้งไว้หรือไม่ และเรามุ่งเน้นไปที่ความสุดขั้วเป็นหลัก
ก) เราดูที่ภาระทั้งหมด
- เล็กเกินไป - เป็นไปได้มากว่าบางอย่างไม่ทำงานเลยหากโหลดลดลงกะทันหันหลายครั้ง
- ใหญ่เกินไป - จำเป็นต้องปรับให้เหมาะสม
b) เราดูจุดตัดตาม RPS
ที่นี่เราจะดูความแตกต่างระหว่างเวอร์ชันปัจจุบันและเวอร์ชันก่อนหน้าและปริมาณทั้งหมด ตัวอย่างเช่น หากบริการสร้าง 100 rps แสดงว่าเขียนได้ไม่ดี หรือนี่คือความจำเพาะ แต่ไม่ว่าในกรณีใด นี่เป็นเหตุผลที่ต้องพิจารณาบริการอย่างใกล้ชิด
ในทางกลับกัน หากมี RPS มากเกินไป อาจมีข้อบกพร่องบางอย่างและจุดสิ้นสุดบางจุดหยุดดำเนินการเพย์โหลด และอีกจุดหนึ่งก็ถูกทริกเกอร์ return true;
การทดสอบนกขมิ้น
หลังจากที่เราผ่านการทดสอบสังเคราะห์แล้ว เราจะทดสอบไมโครเซอร์วิสกับผู้ใช้จำนวนไม่มาก เราเริ่มต้นอย่างระมัดระวัง โดยมีส่วนแบ่งเพียงเล็กน้อยจากกลุ่มเป้าหมายของบริการ - น้อยกว่า 0,1% ในขั้นตอนนี้ เป็นสิ่งสำคัญมากที่จะต้องรวมเมตริกทางเทคนิคและผลิตภัณฑ์ที่ถูกต้องไว้ในการตรวจสอบ เพื่อให้แสดงปัญหาในบริการโดยเร็วที่สุด เวลาขั้นต่ำสำหรับการทดสอบคานารีคือ 5 นาที ส่วนการทดสอบหลักคือ 2 ชั่วโมง สำหรับบริการที่ซับซ้อน เราจะตั้งเวลาด้วยตนเอง
มาวิเคราะห์กัน:
— ตัวชี้วัดเฉพาะภาษา โดยเฉพาะผู้ปฏิบัติงาน php-fpm
— ข้อผิดพลาดใน Sentry;
— สถานะการตอบสนอง
— เวลาตอบสนอง ที่แน่นอนและโดยเฉลี่ย
— เวลาแฝง;
— ข้อยกเว้น ประมวลผลและไม่ได้รับการจัดการ
— ตัวชี้วัดผลิตภัณฑ์
การทดสอบการบีบ
การทดสอบการบีบเรียกอีกอย่างว่าการทดสอบแบบ "บีบ" ชื่อของเทคนิคนี้ถูกนำมาใช้ใน Netflix สาระสำคัญของมันคือ ขั้นแรกเราเติมหนึ่งอินสแตนซ์ด้วยการรับส่งข้อมูลจริงจนถึงจุดที่ล้มเหลว และด้วยเหตุนี้จึงกำหนดขีดจำกัด จากนั้นเราเพิ่มอินสแตนซ์อื่นและโหลดคู่นี้ - อีกครั้งจนถึงสูงสุด เราเห็นเพดานและเดลต้าของพวกเขาด้วยการ "บีบ" ครั้งแรก ดังนั้นเราจึงเชื่อมต่อทีละอินสแตนซ์และคำนวณรูปแบบของการเปลี่ยนแปลง
ข้อมูลการทดสอบผ่านการ "บีบ" จะไหลเข้าสู่ฐานข้อมูลเมทริกทั่วไป โดยเราจะเพิ่มผลลัพธ์การโหลดปลอมด้วยข้อมูลเหล่านั้น หรือแม้แต่แทนที่ "สารสังเคราะห์" ด้วยข้อมูลเหล่านั้น
การผลิต
• การปรับขนาด เมื่อเราเปิดตัวบริการสู่การใช้งานจริง เราจะติดตามดูว่าบริการจะขยายขนาดอย่างไร จากประสบการณ์ของเรา การตรวจสอบเฉพาะตัวบ่งชี้ CPU เท่านั้นไม่ได้ผล การปรับขนาดอัตโนมัติด้วยการเปรียบเทียบ RPS ในรูปแบบบริสุทธิ์ใช้งานได้เฉพาะกับบริการบางอย่างเท่านั้น เช่น การสตรีมออนไลน์ ดังนั้นเราจึงดูที่ตัวชี้วัดผลิตภัณฑ์เฉพาะแอปพลิเคชันเป็นอันดับแรก
ด้วยเหตุนี้ เมื่อปรับขนาดเราจะวิเคราะห์:
- ตัวบ่งชี้ CPU และ RAM
— จำนวนคำขอในคิว
- เวลาตอบสนอง,
— การคาดการณ์ตามข้อมูลในอดีตที่สะสม
เมื่อปรับขนาดบริการ สิ่งสำคัญคือต้องตรวจสอบการขึ้นต่อกันเพื่อที่เราจะได้ไม่ปรับขนาดบริการแรกในห่วงโซ่ และบริการที่เข้าถึงจะล้มเหลวภายใต้ภาระงาน เพื่อสร้างภาระที่ยอมรับได้สำหรับกลุ่มบริการทั้งหมด เราจะดูข้อมูลประวัติของบริการที่ "ใกล้เคียงที่สุด" (ขึ้นอยู่กับการรวมกันของตัวบ่งชี้ CPU และ RAM ควบคู่ไปกับตัววัดเฉพาะแอป) และเปรียบเทียบกับข้อมูลประวัติ ของบริการการเริ่มต้นและอื่น ๆ ตลอด "ห่วงโซ่การพึ่งพา" "จากบนลงล่าง
Обслуживание
หลังจากที่ไมโครเซอร์วิสถูกนำไปใช้งานแล้ว เราก็สามารถแนบทริกเกอร์เข้ากับไมโครเซอร์วิสได้
ต่อไปนี้เป็นสถานการณ์ทั่วไปที่ทริกเกอร์เกิดขึ้น
— ตรวจพบการอพยพที่อาจเป็นอันตราย
— การอัปเดตความปลอดภัยได้รับการเผยแพร่แล้ว
— บริการนี้ไม่ได้รับการอัพเดตมาเป็นเวลานาน
— ภาระในบริการลดลงอย่างเห็นได้ชัดหรือตัวชี้วัดผลิตภัณฑ์บางส่วนอยู่นอกช่วงปกติ
— บริการไม่ตรงตามข้อกำหนดแพลตฟอร์มใหม่อีกต่อไป
ทริกเกอร์บางตัวมีหน้าที่รับผิดชอบต่อความเสถียรของการทำงาน บางตัว - เป็นหน้าที่ของการบำรุงรักษาระบบ - ตัวอย่างเช่น บริการบางอย่างไม่ได้ถูกใช้งานมาเป็นเวลานาน และอิมเมจพื้นฐานหยุดผ่านการตรวจสอบความปลอดภัยแล้ว
แผงควบคุม
กล่าวโดยสรุป แดชบอร์ดคือแผงควบคุมของ PaaS ทั้งหมดของเรา
- ข้อมูลจุดเดียวเกี่ยวกับบริการ พร้อมด้วยข้อมูลเกี่ยวกับความครอบคลุมของการทดสอบ จำนวนภาพ จำนวนสำเนาการผลิต เวอร์ชัน ฯลฯ
- เครื่องมือสำหรับการกรองข้อมูลตามบริการและป้ายกำกับ (เครื่องหมายของการเป็นหน่วยธุรกิจ ฟังก์ชั่นผลิตภัณฑ์ ฯลฯ )
- เครื่องมือสำหรับการผสานรวมกับเครื่องมือโครงสร้างพื้นฐานสำหรับการติดตาม การบันทึก และการตรวจสอบ
- เอกสารการบริการจุดเดียว
- มุมมองเดียวของกิจกรรมทั้งหมดในบริการ
เบ็ดเสร็จ
ก่อนที่จะแนะนำ PaaS นักพัฒนาใหม่อาจใช้เวลาหลายสัปดาห์ในการทำความเข้าใจเครื่องมือทั้งหมดที่จำเป็นในการเปิดตัวไมโครเซอร์วิสในการใช้งานจริง: Kubernetes, Helm, คุณสมบัติ TeamCity ภายในของเรา, การตั้งค่าการเชื่อมต่อกับฐานข้อมูลและแคชในลักษณะที่ทนทานต่อข้อผิดพลาด ฯลฯ ตอนนี้ ใช้เวลาสองสามชั่วโมงในการอ่านการเริ่มต้นอย่างรวดเร็วและสร้างบริการเอง
ฉันให้รายงานในหัวข้อนี้สำหรับ HighLoad++ 2018 คุณสามารถดูได้
โบนัสแทร็กสำหรับผู้ที่อ่านจนจบ
พวกเราที่ Avito กำลังจัดการฝึกอบรมภายในสามวันสำหรับนักพัฒนาจาก
การฝึกอบรมจะมีขึ้นระหว่างวันที่ 5 ถึง 7 สิงหาคมที่กรุงมอสโก เหล่านี้เป็นวันทำการที่จะเต็ม อาหารกลางวันและการฝึกอบรมจะอยู่ที่สำนักงานของเรา และผู้เข้าร่วมที่ได้รับเลือกจะต้องจ่ายค่าเดินทางและที่พักเอง
คุณสามารถสมัครเข้าร่วมได้
เราจะประกาศชื่อของผู้เข้าร่วมการฝึกอบรมในการอัปเดตโพสต์นี้และบนโซเชียลเน็ตเวิร์ก Avito สำหรับนักพัฒนา (AvitoTech ใน
ที่มา: will.com