Đảm bảo độ tin cậy của nền tảng quy mô lớn

Việc vận hành bất kỳ nền tảng phân tán có khả năng mở rộng nào đều đòi hỏi sự cam kết về độ tin cậy, nhằm đảm bảo khách hàng có được những gì họ cần khi họ cần. Các phụ thuộc có thể khá phức tạp, đặc biệt là với một nền tảng lớn như Roblox. Xây dựng các dịch vụ đáng tin cậy có nghĩa là, bất kể độ phức tạp và trạng thái của các phụ thuộc, bất kỳ dịch vụ nào cũng sẽ không bị gián đoạn (tức là có tính sẵn sàng cao), sẽ hoạt động không có lỗi (tức là chất lượng cao) và không có sai sót (tức là khả năng chịu lỗi).
Tại sao độ tin cậy lại quan trọng
Đội ngũ Quản lý Danh tính Tài khoản của chúng tôi cam kết nâng cao độ tin cậy, vì các dịch vụ tuân thủ mà chúng tôi xây dựng là thành phần cốt lõi của nền tảng. Việc vi phạm tuân thủ có thể gây ra hậu quả nghiêm trọng. Chi phí gây gián đoạn hoạt động tự nhiên của Roblox là rất cao, đòi hỏi nguồn lực bổ sung để khôi phục sau sự cố và làm suy yếu trải nghiệm người dùng.
Cách tiếp cận truyền thống về độ tin cậy chủ yếu tập trung vào tính sẵn sàng, nhưng trong một số trường hợp, các khái niệm này bị nhầm lẫn hoặc sử dụng sai. Hầu hết các chỉ số đo lường tính sẵn sàng chỉ đánh giá xem dịch vụ có đang hoạt động hay không, trong khi các khía cạnh như khả năng chịu lỗi phân vùng và tính nhất quán đôi khi bị bỏ qua hoặc hiểu sai.
Theo định lý CAP, bất kỳ hệ thống phân tán nào cũng chỉ có thể đảm bảo hai trong ba khía cạnh này, do đó các dịch vụ tuân thủ của chúng tôi hy sinh một phần tính nhất quán để đạt được tính sẵn sàng cao và khả năng chịu lỗi phân vùng. Tuy nhiên, các dịch vụ của chúng tôi đã hy sinh rất ít và tìm ra các cơ chế để đạt được tính nhất quán tốt thông qua những thay đổi kiến trúc hợp lý được giải thích bên dưới.
Quá trình để đạt được độ tin cậy cao hơn là một quá trình lặp đi lặp lại, với việc đo lường chặt chẽ kết hợp với công việc liên tục nhằm ngăn chặn, tìm kiếm, phát hiện và khắc phục các lỗi trước khi sự cố xảy ra. Nhóm của chúng tôi đã xác định được giá trị mạnh mẽ trong các thực tiễn sau:
- Đo lường chính xác - Xây dựng khả năng quan sát toàn diện về cách chất lượng được cung cấp cho khách hàng và cách các yếu tố phụ thuộc mang lại chất lượng cho chúng tôi.
- Dự đoán chủ động - Thực hiện các hoạt động như đánh giá kiến trúc và đánh giá rủi ro phụ thuộc.
- Ưu tiên khắc phục - Tập trung cao độ vào việc giải quyết báo cáo sự cố cho dịch vụ và các phụ thuộc liên quan đến dịch vụ của chúng tôi.
Việc xây dựng độ tin cậy cao hơn đòi hỏi một văn hóa chất lượng. Đội ngũ của chúng tôi đã đầu tư vào phát triển dựa trên hiệu suất và biết rằng sự thành công của một quy trình phụ thuộc vào việc áp dụng quy trình đó. Đội ngũ đã áp dụng quy trình này một cách toàn diện và áp dụng các phương pháp này như một tiêu chuẩn. Sơ đồ sau đây nêu bật các thành phần của quy trình:

Sức mạnh của việc đo lường chính xác
Trước khi đi sâu vào các chỉ số, cần làm rõ một điểm về các chỉ số mức độ dịch vụ.
- SLO (Mục tiêu mức độ dịch vụ) là mục tiêu độ tin cậy mà đội ngũ của chúng tôi hướng tới (ví dụ: 99,999%).
- SLI (Chỉ số mức độ dịch vụ) là độ tin cậy đạt được trong một khoảng thời gian nhất định (ví dụ: 99,975% vào tháng 2 vừa qua).
- SLA (Thỏa thuận mức độ dịch vụ) là độ tin cậy đã thỏa thuận để cung cấp và được người dùng mong đợi trong một khoảng thời gian nhất định (ví dụ: 99,99% mỗi tuần).
SLI nên phản ánh tính sẵn sàng (không có phản hồi bị bỏ qua hoặc thiếu), khả năng chịu lỗi (không có lỗi dịch vụ) và chất lượng đạt được (không có lỗi bất ngờ). Do đó, chúng tôi định nghĩa SLI là "Tỷ lệ Thành công" của các phản hồi thành công so với tổng số yêu cầu gửi đến dịch vụ. Các phản hồi thành công là những yêu cầu được xử lý đúng thời gian và đúng định dạng, tức là không xảy ra lỗi kết nối, lỗi dịch vụ hoặc lỗi bất ngờ.
Chỉ số SLI hoặc Tỷ lệ Thành công này được thu thập từ góc độ người dùng (tức là khách hàng). Mục đích là đo lường trải nghiệm thực tế từ đầu đến cuối được cung cấp cho người dùng để chúng tôi có thể tự tin rằng các cam kết dịch vụ (SLAs) đã được đáp ứng. Nếu không làm như vậy, sẽ tạo ra cảm giác sai lầm về độ tin cậy mà bỏ qua tất cả các vấn đề về hạ tầng khi kết nối với khách hàng. Tương tự như SLI của người dùng, chúng tôi thu thập SLI phụ thuộc để theo dõi bất kỳ rủi ro tiềm ẩn nào. Trên thực tế, tất cả các SLA phụ thuộc phải phù hợp với SLA dịch vụ và có mối quan hệ phụ thuộc trực tiếp với chúng. Sự thất bại của một yếu tố đồng nghĩa với sự thất bại của tất cả. Chúng tôi cũng theo dõi và báo cáo các chỉ số từ chính dịch vụ (tức là máy chủ), nhưng đây không phải là nguồn thực tế đảm bảo độ tin cậy cao.
Ngoài các chỉ số SLI, mỗi lần xây dựng đều thu thập các chỉ số chất lượng được báo cáo bởi quy trình CI của chúng tôi. Thực hành này giúp áp dụng nghiêm ngặt các rào cản chất lượng (ví dụ: độ bao phủ mã nguồn) và báo cáo các chỉ số có ý nghĩa khác, như tuân thủ tiêu chuẩn lập trình và phân tích mã nguồn tĩnh. Chủ đề này đã được đề cập trong một bài viết khác, "Xây dựng Microservices Dựa trên Hiệu suất". Việc tuân thủ nghiêm ngặt các tiêu chuẩn chất lượng đóng vai trò quan trọng khi nói đến độ tin cậy, bởi vì càng đầu tư nhiều vào việc đạt được các điểm số xuất sắc, chúng tôi càng tự tin rằng hệ thống sẽ không gặp sự cố trong điều kiện bất lợi.
Nhóm của chúng tôi có hai bảng điều khiển. Một bảng cung cấp tất cả thông tin về SLI của người tiêu dùng và SLI của các phụ thuộc. Bảng thứ hai hiển thị tất cả các chỉ số chất lượng. Chúng tôi đang nỗ lực hợp nhất mọi thứ vào một bảng điều khiển duy nhất, để tất cả các khía cạnh mà chúng tôi quan tâm được tổng hợp và sẵn sàng để báo cáo theo bất kỳ khung thời gian nào.
Dự đoán sự cố
Thực hiện đánh giá kiến trúc là một phần cơ bản của việc đảm bảo độ tin cậy. Đầu tiên, chúng tôi xác định xem có sự dự phòng hay không và liệu dịch vụ có khả năng tồn tại khi các phụ thuộc bị sập hay không. Ngoài các ý tưởng sao chép thông thường, hầu hết các dịch vụ của chúng tôi đã áp dụng các kỹ thuật cấp dữ liệu bộ nhớ đệm kép cải tiến, chiến lược phục hồi kép (như chuyển đổi dự phòng hàng đợi cục bộ) hoặc chiến lược xử lý mất dữ liệu (như hỗ trợ giao dịch). Các chủ đề này đủ rộng để xứng đáng có một bài viết blog riêng, nhưng cuối cùng, lời khuyên tốt nhất là triển khai các ý tưởng xem xét các kịch bản thảm họa và giảm thiểu bất kỳ ảnh hưởng nào đến hiệu suất.
Một khía cạnh quan trọng khác cần dự đoán là bất kỳ yếu tố nào có thể cải thiện kết nối. Điều đó có nghĩa là ưu tiên độ trễ thấp cho khách hàng và chuẩn bị cho lưu lượng truy cập rất cao bằng các kỹ thuật kiểm soát bộ nhớ đệm, sidecars và các chính sách hiệu suất cho thời gian chờ, ngắt mạch và thử lại. Các thực hành này áp dụng cho mọi client, bao gồm bộ nhớ đệm, kho lưu trữ, hàng đợi và các client phụ thuộc lẫn nhau trong HTTP và gRPC. Điều này cũng có nghĩa là cải thiện tín hiệu hoạt động từ các dịch vụ và hiểu rằng kiểm tra sức khỏe đóng vai trò quan trọng trong mọi hệ thống điều phối container. Hầu hết các dịch vụ của chúng tôi đều gửi tín hiệu suy giảm tốt hơn như một phần của phản hồi kiểm tra sức khỏe và xác minh tất cả các thành phần quan trọng đều hoạt động trước khi gửi tín hiệu hoạt động.
Việc chia nhỏ dịch vụ thành các phần quan trọng và không quan trọng đã chứng minh là hữu ích để tập trung vào các chức năng quan trọng nhất. Trước đây, chúng tôi có các điểm cuối dành riêng cho quản trị viên trong cùng một dịch vụ, và mặc dù chúng không được sử dụng thường xuyên nhưng lại ảnh hưởng đến các chỉ số độ trễ tổng thể. Việc di chuyển chúng sang dịch vụ riêng đã tác động tích cực đến mọi chỉ số.
Đánh giá Rủi ro Phụ thuộc là công cụ quan trọng để xác định các vấn đề tiềm ẩn với các phụ thuộc. Điều này có nghĩa là chúng tôi xác định các phụ thuộc có SLI thấp và yêu cầu điều chỉnh SLA. Những phụ thuộc này cần được chú ý đặc biệt trong các bước tích hợp, vì vậy chúng tôi dành thêm thời gian để đánh giá và kiểm thử xem các phụ thuộc mới có đủ chín muồi cho kế hoạch của chúng tôi hay không. Một ví dụ điển hình là việc áp dụng sớm dịch vụ Roblox Storage-as-a-Service. Việc tích hợp với dịch vụ này yêu cầu phải lập phiếu báo lỗi và tổ chức các cuộc họp đồng bộ định kỳ để trao đổi các phát hiện và phản hồi. Tất cả công việc này đều sử dụng thẻ “độ tin cậy” để chúng tôi có thể nhanh chóng xác định nguồn gốc và mức độ ưu tiên của chúng. Quá trình đánh giá diễn ra thường xuyên cho đến khi chúng tôi tin tưởng rằng phụ thuộc mới đã sẵn sàng cho chúng tôi. Công việc bổ sung này đã giúp đưa phụ thuộc lên mức độ tin cậy cần thiết mà chúng tôi mong đợi, cùng nhau hành động vì một mục tiêu chung.
Mang lại trật tự cho sự hỗn loạn
Không bao giờ mong muốn xảy ra sự cố. Nhưng khi chúng xảy ra, có những thông tin có giá trị cần thu thập và học hỏi để trở nên đáng tin cậy hơn. Đội ngũ của chúng tôi có một báo cáo sự cố riêng, được tạo ra ngoài báo cáo chung của công ty, để tập trung vào tất cả các sự cố bất kể quy mô tác động của chúng. Chúng tôi xác định nguyên nhân gốc rễ và ưu tiên tất cả công việc để giảm thiểu nó trong tương lai. Là một phần của báo cáo này, chúng tôi mời các đội khác tham gia khắc phục các sự cố phụ thuộc có mức độ ưu tiên cao, theo dõi giải pháp phù hợp, đánh giá lại và tìm kiếm các mẫu có thể áp dụng cho chúng tôi.
Đội ngũ sản xuất Báo cáo Độ tin cậy Hàng tháng cho từng Dịch vụ, bao gồm tất cả các chỉ số SLI được giải thích ở đây, các phiếu yêu cầu đã mở do vấn đề độ tin cậy và bất kỳ sự cố nào có thể liên quan đến dịch vụ đó. Chúng tôi đã quen với việc tạo ra các báo cáo này đến mức bước tiếp theo tự nhiên là tự động hóa việc trích xuất dữ liệu. Việc thực hiện hoạt động định kỳ này rất quan trọng và là lời nhắc nhở rằng độ tin cậy luôn được theo dõi và xem xét trong quá trình phát triển của chúng tôi.

Hệ thống của chúng tôi bao gồm các chỉ số tùy chỉnh và cảnh báo được cải tiến để chúng tôi được thông báo ngay lập tức khi các vấn đề đã biết hoặc dự kiến xảy ra. Tất cả các cảnh báo, bao gồm cả các cảnh báo sai, đều được xem xét hàng tuần. Tại thời điểm này, việc hoàn thiện toàn bộ tài liệu là rất quan trọng để người dùng biết được những gì sẽ xảy ra khi cảnh báo được kích hoạt và khi lỗi xảy ra, từ đó mọi người đều biết phải làm gì (ví dụ: các hướng dẫn xử lý sự cố và hướng dẫn tích hợp được đồng bộ hóa và cập nhật thường xuyên).
Cuối cùng, việc áp dụng chất lượng vào văn hóa của chúng tôi là yếu tố quan trọng và quyết định nhất để đạt được độ tin cậy cao hơn. Chúng tôi có thể thấy rằng việc áp dụng các thực tiễn này vào công việc hàng ngày đã mang lại kết quả. Đội ngũ của chúng tôi đam mê độ tin cậy và đây là thành tựu quan trọng nhất của chúng tôi. Chúng tôi đã nâng cao nhận thức về tác động mà các lỗi tiềm ẩn có thể gây ra và thời điểm chúng có thể xuất hiện. Các dịch vụ áp dụng các thực hành này đã liên tục đạt được các mục tiêu SLO và SLA. Các báo cáo độ tin cậy giúp chúng tôi theo dõi mọi công việc đã thực hiện là minh chứng cho nỗ lực của đội ngũ, đồng thời là những bài học vô giá để hướng dẫn và ảnh hưởng đến các đội ngũ khác. Đây chính là cách văn hóa độ tin cậy tác động đến mọi thành phần của nền tảng chúng tôi.
Con đường hướng tới độ tin cậy cao hơn không hề dễ dàng, nhưng nó là điều cần thiết nếu bạn muốn xây dựng một nền tảng đáng tin cậy, tái định nghĩa cách mọi người kết nối với nhau.
Alberto là Kỹ sư Phần mềm Chính trong nhóm Account Identity tại Roblox. Anh đã có nhiều năm kinh nghiệm trong ngành game, với các dự án trên nhiều tựa game AAA và nền tảng mạng xã hội, tập trung mạnh vào các kiến trúc có khả năng mở rộng cao. Hiện tại, anh đang giúp Roblox đạt được sự phát triển và trưởng thành bằng cách áp dụng các thực hành phát triển tốt nhất.


