Belajar Sistem Terdistribusi dengan Kloning YouTube:  Bagian 0 - Kickstarter

Photo by Clay Banks on Unsplash

Belajar Sistem Terdistribusi dengan Kloning YouTube: Bagian 0 - Kickstarter

Sistem terdistribusi adalah hal yang menarik, sepertinya paradigma inilah yang merupakan satu-satunya jawaban atas tantangan ketika sebuah sistem dihadapkan pada beban kerja yang luar biasa besar yang tidak mungkin ditangani oleh satu komputer saja. Beban kerja yang demikian juga rasanya makin hari makin menjadi sesuatu yang makin mudah dijumpai atau setidaknya makin mudah didengar. Kita bisa lihat bagaimana YouTube dituntut untuk mampu melayani 2.49 miliar pengguna aktif per bulan, lalu Discord yang diharuskan menangani penyimpanan triliunan pesan, bagaimana Apple merasa perlu untuk mengoperasikan lebih dari 160.000 node Cassandra untuk memenuhi kebutuhan mereka, serta bagaimana Netflix harus menangani ratusan juta pengguna aktif harian. Beban kerja yang masif membuat perusahaan-perusahaan di atas tidak mungkin mengandalkan satu komputer saja dan pada akhirnya harus mengimplementasikan sistem terdistribusi.

Kendati demikian, sistem terdistribusi bukanlah hal yang gratis pula. Mengadopsi sistem terdistribusi berarti harus siap berurusan dengan kompleksitas yang secara inheren merupakan bagian darinya. Mengoperasikan satu instansi PostgreSQL mungkin tidak begitu sulit, tetapi bagaimana dengan mengoperasikan 32 instansi PostgreSQL yang masing-masingnya memiliki 15 logical shard? Tentu tidak sesederhana itu. Demikian pula, mengoperasikan ribuan service yang saling berkomunikasi satu sama lain tidaklah sesederhana mengoperasikan satu instansi backend. Kombinasikan kompleksitas itu dengan sifat jaringan yang secara inheren tidak dapat diandalkan, serta begitu banyaknya pilihan perkakas, pola, dan hal yang bisa berjalan tidak sesuai ekspektasi tentu makin menambah kompleksitas yang perlu dihadapi ketika memutuskan untuk mengadopsi sistem terdistribusi.

"Distributed systems are hard," begitu kata sebagian orang.

Sebuah Seri Baru

Artikel ini merupakan artikel pertama dalam satu seri yang saya buat untuk mendokumentasikan perjalanan saya belajar sistem terdistribusi, lebih tepatnya sistem event-driven. Saya akan mendokumentasikan setiap fase dan tahap dalam proses saya belajar membangun sebuah layanan berbagi video seperti YouTube, di mana pengguna dapat mengunggah video, menonton, melakukan streaming, dan lain sebagainya. Kenapa membuat klon YouTube? Karena selain ingin belajar sistem terdistribusi saya juga penasaran bagaimana membuat sistem video streaming seperti YouTube. Tetapi lebih tepatnya rasa penasaran ini diawali dari masa kampanye pilpres kemarin di mana salah satu kandidat sering melakukan live di TikTok, dari situ saya bertanya-tanya bagaimana caranya TikTok bisa menangani livestream yang ditonton jutaan orang dengan mulus. Dan karena saya tidak terlalu suka TikTok, jadi saya tidak mencoba membuat klon TikTok, melainkan lebih memilih membuat klon YouTube saja yang memiliki fungsionalitas yang sama, livestream :p. Tentu sistem yang saya buat tidak dirancang untuk langsung menangani jutaan pengguna seperti TikTok, tetapi setidaknya saya dapat memiliki gambaran seperti apa implementasinya dengan mencoba membuat versi yang lebih sederhana.

Perlu dicatat seri ini utamanya ditujukan untuk mendokumentasikan proses belajar saya saja, bukan ditujukan sebagai panduan bagaimana mengimplementasikan sistem terdistribusi dengan baik dan benar, karena saya tidak merasa pantas untuk menulis artikel yang demikian. Hal ini juga berarti saya tidak hanya akan mendokumentasikan kemenangan-kemenangan saya saja selama belajar, saya juga akan mendokumentasikan kegagalan, kesalahan, dan penyesuaian selama perjalanan saya membuat sistem ini. Termasuk perubahan arsitektur, di mana ada 100% kemungkinan bahwa arsitektur yang saya gambarkan di awal-awal seri akan berakhir berbeda dengan hasil akhir ketika saya memutuskan bahwa seri ini sudah waktunya diakhiri. Tetapi yang pasti saya usahakan setiap kesalahan yang saya koreksi dan penyesuaian yang saya lakukan saya akan melampirkan penjelasan yang komprehensif kenapa hal itu dilakukan.

Gambaran Ikhtisar Proyek

Ada baiknya di artikel kickstarter ini saya memberikan sedikit gambaran tentang sistem seperti apa yang hendak saya bangun.

Berikut adalah fitur-fitur yang ada di kepala saya pada saat penulisan artikel ini:

  1. Pengguna dapat melakukan pendaftaran, login, dan logout, termasuk login dengan OAuth

  2. Pengguna dapat menonton video dalam berbagai pilihan resolusi

  3. Pengguna dapat meninggalkan komentar pada video

  4. Pengguna dapat mengontrol video dengan detail, termasuk mendiamkan audio, melakukan seeking, dan mengatur kualitas video secara on-the-fly

  5. Pengguna dapat mengunggah video

  6. Pengguna dapat melakukan livestreaming

  7. Pengguna dapat melakukan chatting secara real-time di sesi livestreaming

Daftar di atas hanyalah rancangan awal dan bukan daftar lengkap, hanya untuk memberikan gambaran singkat saja. Selain itu, daftar di atas saya rasa pasti akan mengalami perubahan seiring berjalannya seri ini kedepannya. Yang jelas setiap penambahan/pengurangan fitur akan saya dokumentasikan melalui artikel di seri ini.

Untuk teknologinya sendiri saya berencana menggunakan Go sebagai bahasa pemrograman utamanya, beberapa jenis basis data dan message queue, MinIO untuk object storage-nya, serta Kubernetes untuk infrastrukturnya. Selain itu, saya juga berencana menggunakan LGTM stack untuk kebutuhan monitoring cluster. Jika ada adopsi teknologi baru selama seri berlangsung saya akan mendokumentasikannya di artikel baru.

Akhir Kata

Saya penasaran sistem seperti apa yang berakhir saya bangun nanti, yang jelas saya senang dapat memulai seri baru ini dan berharap dapat belajar banyak hal darinya. Saya juga berharap tulisan-tulisan yang saya buat selama perjalanan saya membangun sistem ini dapat berguna bagi siapapun yang membaca, khususnya para pemrogram di Indonesia.

Tulisan ini hanyalah ditujukan sebagai kickstarter seri baru. Part 1 dari seri ini akan datang dalam waktu dekat, dan saya akan awali dengan pembahasan mengenai rancangan awal arsitektur sistemnya.