Reliabilitas dan Durabilitas Go di Dropbox

Bagus Aji Santoso 21 Juli 2017

Reliabilitas dan Durabilitas Go di Dropbox

Tammy Butow (@tammybutow) adalah seorang Engineering Manager di Developer Infrastructure Dropbox. Tammy mengelola alurkerja pengkodean di Dropbox, termasuk pengalaman dalam menggunakan Go di Dropbox, mulai dari coding hingga shipping. Ia menjadi salah seorang pembicara di GopherConn 2017 dan membagikan pengalaman bagaimana developer Dropbox membangun dan menjalankan service berskala besar menggunakan Go.

Perjalanan Dropbox dalam Menggunakan Go

Tammy mengutip artikel Go at Google: Language Design in the Service of Software Engineering dari tahun 2012 sebagai ringkasan yang menggambarkan mengapa Go juga dapat bekerja dengan baik di Dropbox:

"Go itu efisien, scalable, dan produktif. Beberapa programmer menyukainya, yang lain menganggapnya bahasa yang membosankan. Di artikel ini kami ingin menjelaskan mengapa kedua posisi tersebut tidak berada dalam kondisi yang kontradiktif. Go didesain untuk mengatasi masalah yang ditemukan di Google, sehingga hasilnya adalah bahasa yang tidak menjadi bahasa riset yang penuh terobosan namun tak lain merupakan tool terbaik untuk proyek perangkat lunak yang berskala besar." — Rob Pike, 2012

Dropbox adalah proyek yang sangat besar:

  • Lebih dari 500 juta pengguna
  • Lebih dari 200.000 pelanggan bisnis
  • Lebih dari 500 petabytes data pengguna
  • Sistem penyimpanan Go yang mencapai ukuran exabyte (1 exabyte = 1000 petabyte)

Dengan proyek yang begitu besar, Dropbox menuntut sistem, bahasa, dan developernya untuk:

  • Membangun sistem yang reliable
  • Membangun sistem yang aman
  • Memadukan reliabilitas dengan keamanan dalam desain awal
  • Memiliki reliabilitas sebesar 99.9999999999% (dua belas angka 9)
  • Ketersediaan sebesar 99.99%

Kondisi Go di Dropbox

Hari ini, sebagian besar infrastruktur Dropbox dirulis dengan Go. Infrastruktur tersebut adalah:

  • Server repositori Go dengan kontributor sebanyak 150 orang (dari 500 yang ada)
  • Terdapat 15 lebih tim yang membangun dan menjalankan service Go di Dropbox
  • Ditingkat perusahaan, Dropbox memiliki 1,3 juta baris kode yang ditulis dengan Go

Bebrapa sistem utama yang ditulis di Go adalah:

  • RAT: rate limiting and throttling
  • HAT: pengganti memcached
  • AFS: file system untuk menggantikan global Zookeeper
  • Edgestore: distributed database
  • Bolt: untuk messaging
  • DBmanager: untuk otomasi dan monitoring database Dropbox yang berjumlah 6,000 lebih
  • “Jetstream”, “Telescope”, block routing, dan masih banyak lagi

Sebagian besar sistem ini adalah penerus sistem yang sebelumnya tidak dibuat dengan Go.

Mengapa Dropbox Memutuskan Menggunakan Go?

Tammy berbagi beberapa cerita bagaimana penggunakan Go tumbuh di Dropbox.

Hack week prototype

Sebelum hack week one year, developer Dropbox mengimplementasi limitasi rate dan throttling secara terpisah ditiap service yang membutuhkannya. Untuk acara hack week, developer Dropbox memutuskan untuk membuat common service implementation untuk kebutuhan ini. Saat itu RAT (Rate limiting And Throttling) lahir.

Prototipe RAT dibuat dalam waktu empat hari dan didemokan pada hari kelima. Dalam beberapa minggu, kabar mulai tersebar. Tim developer Dropbox lain menghubungi tim Tammy dan ingin melihat apakah mereka dapat menggunakan RAT dari proyek Python. Integrasi ini berjalan dengan lancar dan RAT menjadi berguna dalam waktu singkat. Sekarang beberapa tim di Dropbox menggunakan RAT.

DBmanager

Dropbox memilih lebih dari 6.000 database, sistem sebesar itu tentu memerlukan otomasi dan monitoring. Database dapat melakukan replikasi, gagal, dipindah dari replika ke database primer, dan operasi lain kapan saja.

Untuk mengatasi hal ini, seorang developer di Dropbox membangun DBmanager, sebuah antarmuka web untuk melihat dengan cepat apa saja yang terjadi terhadap 6.000 database saat itu. Aplikasi ini juga mempublikasikan status database ke sistem lain.

Upgrade versi Go di Dropbox

Dengan ratusan developer, Dropbox dapat mengkoordinasikan upgrade versi Go dengan hati-hati. Tammy tidak menyebutkan kesulitan dari proses pembaruan ini, itu artinya proses berlangsung dengan lancar!

Beberapa fakta menarik:

  • Dropbox baru-baru ini meperbarui production service dari Go 1.5 ke 1.6
  • Untuk melacak proses upgrade mereka membuat dokumen Dropbox Paper sederhana dan setiap pemilik service untuk menulis progress atau meminta bantuan saat diperlukan.
  • Dropbox akan melewat Go 1.7 untuk Go 1.8 saat migrasi Go 1.6 selesai (termasuk service non-production).

Bagaimana Dropbox Melatih Developer Baru untuk menggunakan Go

Setiap developer Dropbo melalui proses pelatihan Go yang sama. Pelatihan itu terdiri atas:

  • Membaca topologi infrastruktur, Go style guide dan Photobuf style guide
  • Code review yang ketat tapi bersahabat
  • Membuat sebuah aplikasi contoh dengan Go
  • Mempelajari Bazel untuk membangun dan menguji kode Go

Apa Saja yang Didapatkan Dropbox dari Go

Secara umum, penggunaan Go di Dropbox sangat berhasil.

  • Mudah untuk produktif dengan Go.
  • Mudah untuk menulis dan mengonsumsi service di Go.
  • Pustaka standarnya sangat bagus.
  • Debugging tools-nya berjalan dengan baik.

Satu poin yang perlu diketahui adalah Dropbox tidak ada usaha untuk menulis ulang service yang mereka buat dengan Go ke bahasa lain, ini menunjukkan bahwa developer pada umumnya suka bekerja dengan Go.

Apa yang Menyulitkan Dropbox dalam Menggunakan Go

Kesulitan terbesar bekerja dengan Go menurut Tammy adalah saat berurusan dengan race condition.

  • Data race adalah tipe bug yang sulit untuk di debug, ditemukan, dan diperbaiki.
  • Hanya sedikit developer Dropbox yang pintar menemukan bug-bug ini dan developer yang lain bergantung pada keahlian mereka.
  • Go data race detector tidak selalu menolong.
  • Penting untuk mendesain dengan sangat hati-hati bagaimana program Go mengakses data secara konkuren.

Sumber: https://about.sourcegraph.com/go/go-reliability-and-durability-at-dropbox-tammy-butow