Menjamin Keandalan Platform Skala Besar

Mengoperasikan platform terdistribusi yang skalabel menuntut komitmen terhadap keandalan, untuk memastikan pelanggan mendapatkan apa yang mereka butuhkan saat mereka membutuhkannya. Ketergantungan antar komponen bisa sangat rumit, terutama pada platform sebesar Roblox. Membangun layanan yang andal berarti bahwa, terlepas dari kompleksitas dan status ketergantungan, layanan apa pun tidak akan terganggu (yaitu, ketersediaan tinggi), beroperasi tanpa bug (yaitu, kualitas tinggi), dan tanpa kesalahan (yaitu, toleransi kesalahan).
Mengapa Keandalan Penting
Tim Identitas Akun kami berkomitmen untuk mencapai keandalan yang lebih tinggi, karena layanan kepatuhan yang kami bangun merupakan komponen inti platform. Kepatuhan yang terganggu dapat menimbulkan konsekuensi serius. Biaya menghambat operasi alami Roblox sangat tinggi, dengan sumber daya tambahan yang diperlukan untuk pemulihan setelah kegagalan dan pengalaman pengguna yang terganggu.
Pendekatan tipikal terhadap keandalan berfokus terutama pada ketersediaan, tetapi dalam beberapa kasus istilah-istilah tersebut dicampuradukkan dan disalahgunakan. Sebagian besar pengukuran ketersediaan hanya menilai apakah layanan sedang aktif dan berjalan, sementara aspek seperti toleransi partisi dan konsistensi terkadang dilupakan atau disalahpahami.
Sesuai dengan teorema CAP, sistem terdistribusi mana pun hanya dapat menjamin dua dari tiga aspek ini, sehingga layanan kepatuhan kami mengorbankan sebagian konsistensi agar dapat memiliki ketersediaan tinggi dan toleransi partisi. Meskipun demikian, layanan kami hanya mengorbankan sedikit dan menemukan mekanisme untuk mencapai konsistensi yang baik dengan perubahan arsitektur yang wajar, yang dijelaskan di bawah ini.
Proses untuk mencapai keandalan yang lebih tinggi bersifat berulang, dengan pengukuran yang ketat yang selaras dengan pekerjaan berkelanjutan guna mencegah, menemukan, mendeteksi, dan memperbaiki cacat sebelum insiden terjadi. Tim kami mengidentifikasi nilai yang kuat dalam praktik-praktik berikut:
- Pengukuran yang tepat - Membangun pengamatan menyeluruh mengenai bagaimana kualitas disampaikan kepada pelanggan dan bagaimana ketergantungan memberikan kualitas kepada kami.
- Antisipasi proaktif - Lakukan kegiatan seperti tinjauan arsitektur dan penilaian risiko ketergantungan.
- Prioritaskan perbaikan - Berikan perhatian lebih pada penyelesaian laporan insiden untuk layanan dan ketergantungan yang terhubung dengan layanan kami.
Membangun keandalan yang lebih tinggi menuntut budaya kualitas. Tim kami telah berinvestasi dalam pengembangan yang didorong oleh kinerja dan menyadari bahwa keberhasilan suatu proses bergantung pada penerapannya. Tim ini mengadopsi proses ini sepenuhnya dan menerapkan praktik-praktik tersebut sebagai standar. Diagram berikut menyoroti komponen-komponen dari proses tersebut:

Kekuatan Pengukuran yang Tepat
Sebelum membahas metrik lebih dalam, ada klarifikasi singkat yang perlu disampaikan mengenai pengukuran Tingkat Layanan.
- SLO (Tujuan Tingkat Layanan) adalah tujuan keandalan yang ingin dicapai oleh tim kami (misalnya 99,999%).
- SLI (Service Level Indicator) adalah tingkat keandalan yang tercapai dalam rentang waktu tertentu (misalnya 99,975% pada Februari lalu).
- SLA (Service Level Agreement) adalah keandalan yang disepakati untuk diberikan dan diharapkan oleh konsumen kami dalam jangka waktu tertentu (misalnya 99,99% per minggu).
SLI harus mencerminkan ketersediaan (tidak ada respons yang tidak ditangani atau hilang), toleransi kegagalan (tidak ada kesalahan layanan), dan kualitas yang dicapai (tidak ada kesalahan yang tidak terduga). Oleh karena itu, kami mendefinisikan SLI kami sebagai "Rasio Keberhasilan" dari respons yang berhasil dibandingkan dengan total permintaan yang dikirim ke layanan. Respons yang berhasil adalah permintaan yang dikirim tepat waktu dan sesuai format, artinya tidak terjadi kesalahan koneksi, layanan, atau kesalahan yang tidak terduga.
SLI atau Rasio Keberhasilan ini dikumpulkan dari sudut pandang konsumen (misalnya, klien). Tujuannya adalah mengukur pengalaman end-to-end aktual yang diberikan kepada konsumen kami sehingga kami yakin SLA terpenuhi. Jika tidak dilakukan, hal ini akan menciptakan kesan keandalan palsu yang mengabaikan semua masalah infrastruktur dalam terhubung dengan klien kami. Serupa dengan SLI konsumen, kami mengumpulkan SLI ketergantungan untuk memantau risiko potensial. Dalam praktiknya, semua SLA ketergantungan harus selaras dengan SLA layanan dan terdapat ketergantungan langsung di antara keduanya. Kegagalan salah satunya berarti kegagalan seluruhnya. Kami juga melacak dan melaporkan metrik dari layanan itu sendiri (yaitu, server), namun ini bukanlah sumber utama untuk keandalan tinggi.
Selain SLI, setiap build mengumpulkan metrik kualitas yang dilaporkan oleh alur kerja CI kami. Praktik ini membantu menegakkan gerbang kualitas (misalnya, cakupan kode) secara ketat dan melaporkan metrik lain yang bermakna, seperti kepatuhan terhadap standar penulisan kode dan analisis kode statis. Topik ini sebelumnya dibahas dalam artikel lain, Membangun Microservices yang Didorong oleh Kinerja. Pengawasan kualitas yang cermat sangat berpengaruh dalam hal keandalan, karena semakin besar investasi kami untuk mencapai skor yang sangat baik, semakin yakin kami bahwa sistem tidak akan gagal dalam kondisi yang tidak menguntungkan.
Tim kami memiliki dua dasbor. Satu dasbor menampilkan semua visibilitas ke dalam SLI Konsumen dan SLI Ketergantungan. Dasbor kedua menampilkan semua metrik kualitas. Kami sedang berupaya menggabungkan semuanya ke dalam satu dasbor, sehingga semua aspek yang menjadi perhatian kami terkonsolidasi dan siap dilaporkan dalam rentang waktu tertentu.
Mengantisipasi Kegagalan
Melakukan tinjauan arsitektur merupakan bagian fundamental dari keandalan. Pertama, kami menentukan apakah redundansi tersedia dan apakah layanan memiliki kemampuan untuk bertahan saat ketergantungan mengalami kegagalan. Selain ide replikasi konvensional, sebagian besar layanan kami menerapkan teknik pengisian cache ganda yang ditingkatkan, strategi pemulihan ganda (seperti antrian failover lokal), atau strategi penanganan kehilangan data (seperti dukungan transaksional). Topik-topik ini cukup luas untuk memerlukan entri blog terpisah, tetapi pada akhirnya rekomendasi terbaik adalah mengimplementasikan ide-ide yang mempertimbangkan skenario bencana dan meminimalkan penalti kinerja.
Aspek penting lainnya yang perlu diantisipasi adalah segala hal yang dapat meningkatkan konektivitas. Artinya, kita harus agresif dalam memastikan latensi rendah bagi klien dan mempersiapkan mereka untuk lalu lintas yang sangat tinggi menggunakan teknik cache-control, sidecars, serta kebijakan yang optimal untuk timeout, circuit breaker, dan retry. Praktik-praktik ini berlaku untuk semua klien, termasuk cache, penyimpanan, antrian, dan klien yang saling bergantung dalam HTTP dan gRPC. Hal ini juga berarti meningkatkan sinyal sehat dari layanan dan memahami bahwa pemeriksaan kesehatan memainkan peran penting dalam semua orkestrasi kontainer. Sebagian besar layanan kami memberikan sinyal degradasi sebagai bagian dari umpan balik pemeriksaan kesehatan dan memverifikasi bahwa semua komponen kritis berfungsi sebelum mengirimkan sinyal sehat.
Memecah layanan menjadi bagian kritis dan non-kritis terbukti berguna untuk fokus pada fungsionalitas yang paling penting. Dulu kami memiliki endpoint khusus admin dalam layanan yang sama, dan meskipun jarang digunakan, hal itu memengaruhi metrik latensi secara keseluruhan. Memindahkan endpoint tersebut ke layanan tersendiri berdampak positif pada semua metrik.
Penilaian Risiko Ketergantungan adalah alat penting untuk mengidentifikasi masalah potensial pada ketergantungan. Ini berarti kami mengidentifikasi ketergantungan dengan SLI rendah dan meminta penyesuaian SLA. Ketergantungan tersebut memerlukan perhatian khusus selama tahap integrasi, sehingga kami menghabiskan waktu ekstra untuk membandingkan dan menguji apakah ketergantungan baru cukup matang untuk rencana kami. Salah satu contoh bagus adalah adopsi awal kami terhadap Roblox Storage-as-a-Service. Integrasi dengan layanan ini memerlukan pengajuan tiket bug dan pertemuan sinkronisasi berkala untuk mengomunikasikan temuan dan umpan balik. Semua pekerjaan ini menggunakan tag “keandalan” sehingga kami dapat dengan cepat mengidentifikasi sumber dan prioritasnya. Karakterisasi sering dilakukan hingga kami yakin bahwa dependensi baru tersebut siap untuk kami. Pekerjaan tambahan ini membantu meningkatkan dependensi ke tingkat keandalan yang kami harapkan untuk disampaikan, bekerja sama demi tujuan bersama.
Membawa Struktur ke dalam Kekacauan
Insiden tidak pernah diinginkan. Namun, ketika terjadi, ada informasi berharga yang perlu dikumpulkan dan dipelajari untuk menjadi lebih andal. Tim kami memiliki laporan insiden tim yang dibuat di luar laporan perusahaan secara umum, sehingga kami fokus pada semua insiden terlepas dari skala dampaknya. Kami mengidentifikasi akar masalah dan memprioritaskan semua pekerjaan untuk mengatasinya di masa depan. Sebagai bagian dari laporan ini, kami melibatkan tim lain untuk memperbaiki insiden ketergantungan dengan prioritas tinggi, memastikan penyelesaian yang tepat, melakukan retrospeksi, dan mencari pola yang mungkin berlaku bagi kami.
Tim kami menghasilkan Laporan Keandalan Bulanan per Layanan yang mencakup semua SLI yang dijelaskan di sini, tiket yang kami buka karena masalah keandalan, serta insiden apa pun yang terkait dengan layanan tersebut. Kami sudah terbiasa membuat laporan ini sehingga langkah alami berikutnya adalah mengotomatiskan ekstraksi datanya. Melakukan aktivitas berkala ini sangat penting, dan ini menjadi pengingat bahwa keandalan terus dipantau dan dipertimbangkan dalam pengembangan kami.

Perangkat kami mencakup metrik khusus dan peringatan yang ditingkatkan sehingga kami dapat dihubungi sesegera mungkin ketika masalah yang diketahui dan diperkirakan terjadi. Semua peringatan, termasuk false positive, ditinjau setiap minggu. Pada tahap ini, menyempurnakan semua dokumentasi menjadi penting agar pengguna kami tahu apa yang diharapkan ketika peringatan terpicu dan ketika kesalahan terjadi, sehingga semua orang tahu apa yang harus dilakukan (misalnya, panduan tindakan dan pedoman integrasi diselaraskan dan diperbarui secara berkala).
Pada akhirnya, penerapan kualitas dalam budaya kami adalah faktor paling kritis dan menentukan dalam mencapai keandalan yang lebih tinggi. Kami dapat melihat bagaimana praktik-praktik ini yang diterapkan dalam pekerjaan sehari-hari kami sudah membuahkan hasil. Tim kami sangat fokus pada keandalan, dan ini merupakan pencapaian terpenting kami. Kami telah meningkatkan kesadaran akan dampak yang dapat ditimbulkan oleh potensi cacat dan kapan cacat tersebut dapat muncul. Layanan yang menerapkan praktik-praktik ini secara konsisten mencapai SLO dan SLA mereka. Laporan keandalan yang membantu kami melacak semua pekerjaan yang telah kami lakukan merupakan bukti dari kerja keras tim kami, dan menjadi pelajaran berharga untuk menginformasikan dan mempengaruhi tim lain. Inilah cara budaya keandalan menyentuh semua komponen platform kami.
Jalan menuju keandalan yang lebih tinggi bukanlah hal yang mudah, tetapi hal ini diperlukan jika Anda ingin membangun platform yang tepercaya yang mengubah cara orang berinteraksi.
Alberto adalah Principal Software Engineer di tim Account Identity di Roblox. Ia telah berkecimpung di industri game selama bertahun-tahun, dengan kontribusi pada banyak judul game AAA dan platform media sosial yang berfokus pada arsitektur yang sangat skalabel. Kini ia membantu Roblox mencapai pertumbuhan dan kematangan dengan menerapkan praktik pengembangan terbaik.


