- Saat klien terhubung ke Discord, mereka menerima pembaruan real-time tentang apa yang sedang terjadi melalui layanan yang disebut "gateway"
- Sejak akhir 2017, koneksi gateway klien dikompresi menggunakan zlib sehingga ukuran pesan menjadi 2 hingga 10 kali lebih kecil
- Zstandard (zstd) memiliki rasio kompresi lebih tinggi dan waktu kompresi lebih singkat dibanding zlib, serta mendukung fitur dictionary yang dapat lebih lanjut mengurangi bandwidth
- Hasil pengujian zstd pada 2019 tidak terlalu positif, tetapi dinilai layak untuk dicoba lagi
Streaming Zstd
- Zlib menggunakan kompresi streaming, sedangkan zstd tidak
- Pada payload kecil, performa zstd lebih buruk daripada zlib
- Mereka melakukan fork pada ezstd, binding zstd untuk Elixir, lalu menambahkan streaming
- Setelah beralih ke streaming zstd, ada peningkatan besar dalam rasio kompresi dan kecepatan dibanding streaming zlib
Upaya optimasi
Tuning
- Parameter kompresi zstd seperti chainlog, hashlog, dan windowlog disesuaikan untuk menyeimbangkan penggunaan memori dan waktu kompresi
Dictionary Zstd
- Mereka mencoba memanfaatkan fitur dictionary zstd untuk meningkatkan rasio kompresi, tetapi efeknya terbatas
- Karena kompleksitas penggunaan dictionary dinilai lebih besar daripada manfaatnya, mereka memutuskan untuk tidak mengadopsinya
Upgrade buffer
- Mereka mengimplementasikan loop umpan balik yang memanfaatkan memori cadangan pada jam-jam tidak sibuk untuk meng-upgrade buffer zstd
- Tingkat upgrade lebih rendah dari yang diharapkan, dan meski sempat mencoba perbaikan seperti menyesuaikan pengaturan allocator BEAM, manfaatnya tidak sebanding dengan kompleksitasnya sehingga pendekatan ini dibatalkan
Implementasi dan peluncuran
- Karena peningkatan bandwidth dari Zstd cukup besar, mereka memutuskan untuk menerapkannya tidak hanya di mobile tetapi juga di desktop
- Mereka menemukan binding zstd yang sesuai untuk tiap platform seperti Java, Objective-C, dan Rust, lalu merilisnya secara bertahap selama beberapa bulan
Hasil tambahan: Passive Sessions V2
- Dalam proses penerapan zstd, mereka menemukan bahwa pesan passive_update_v1 menyumbang lebih dari 30% bandwidth gateway
- Dengan memperkenalkan passive_update_v2 yang hanya mengirim kanal/anggota yang berubah, porsi bandwidth itu turun dari 35% menjadi 5%
Penghematan besar
- Kombinasi Passive Sessions v2 dan zstd mengurangi hampir 40% bandwidth gateway yang digunakan klien
- Menemukan peluang optimasi yang tidak disengaja ini menunjukkan pentingnya instrumentasi yang tepat dan menganalisis grafik dengan sudut pandang kritis
1 komentar
Komentar Hacker News
Ada keluhan tentang waktu startup Discord yang memakan 20-30 detik
Tampaknya fokusnya ada pada rasio kompresi dan pengurangan bandwidth jaringan
Pendekatan kompresi berbasis kamus dengan JSON dan Erlang ETF terasa menarik
Mengejutkan bahwa respons bootstrapping umum (READY) berukuran lebih dari 2MB
Ada penyebutan tentang isi aktual dispatch PASSIVE_UPDATE_V1
Tidak ada penyebutan tentang keamanan terhadap serangan seperti compression oracle attack (BREACH)
Ada masalah di mana membuka tab Discord membuat komputer melambat
Sangat bagus karena dijelaskan juga hal-hal yang sudah dicoba tetapi tidak berhasil
Ada pendapat bahwa mIRC melakukannya dengan lebih baik