Pada 2023, kejayaan hanya berjarak 11 MB/detik
(thmsmlr.com)- Bahkan situs web 1.000 besar dengan sekitar 200 juta pengunjung per bulan, jika hanya melihat HTML, membutuhkan sekitar 30 TB/bulan, rata-rata 11 MB/detik transfer, skala yang masih bisa ditangani oleh satu server
- Perhitungannya berangkat dari Business Insider sebagai acuan: 2 halaman per pengunjung, 400 juta dokumen HTML per bulan, HTML terkompresi sekitar 75 KB, dengan asumsi JS, CSS, dan gambar diserahkan ke CDN
- Eksekusi di edge punya keunggulan karena server dekat dengan pengguna, tetapi jika saat rendering terjadi round-trip ke database, latensi kembali terseret ke lokasi database origin
- Selisih biayanya juga besar: Hetzner menawarkan server 16-core, RAM 64 GB, NVMe seharga $0,34/jam, dengan 20 TB transfer gratis lalu $1,5/TB, sementara AWS dan Vercel punya harga bandwidth yang jauh lebih tinggi
- Jika bukan pekerjaan yang secara khusus membutuhkan cloud, konfigurasi satu server + SQLite + Litestream + CDN lebih sederhana dan murah, serta bisa menghindari scaling horizontal yang tidak perlu
Skala nyata situs web papan atas dilihat dari 11 MB/detik
- Menggunakan Business Insider sebagai contoh situs web di kisaran 1.000 besar
- Menurut SimilarWeb, peringkatnya 587 secara global dan jumlah pengunjung bulanannya sekitar 200 juta orang
- Jika rata-rata tiap pengunjung melihat 2 halaman, perlu menyajikan 400 juta dokumen HTML per bulan
- Berdasarkan contoh artikel, dokumen HTML standar setelah dikompresi berukuran sekitar 75 KB
- Jika dikalikan, hanya untuk HTML diperlukan bandwidth sekitar 30 TB/bulan
- 30 TB/bulan jika dirata-ratakan setara sekitar 11 MB/detik
- Pada kasus Business Insider, ini sekitar 150 requests/sec
- Asumsinya HTML tidak memakai CDN, sementara JS, CSS, dan gambar bisa disajikan lewat CDN
- HTML terkompresi 75 KB tergolong besar, sehingga tergantung implementasi, penyesuaian seperti mengurangi ukuran HTML atau menambah jumlah request juga memungkinkan
- Pada hardware modern, menghasilkan HTML 11 MB/detik dengan kode aplikasi adalah standar yang rendah
- Prosesor server AMD terbaru menyediakan 64 core dan 128 thread
- Prosesor server Zen 5 Turin dikabarkan memiliki 192 core, dan pada server dual-socket bahkan disebut-sebut konfigurasi mendekati 400 core dengan hingga 768 thread
- Dari sudut pandang ini, Docker, serverless, dan scaling horizontal tidak selalu menjadi pilihan yang diperlukan
Eksekusi di edge tidak selalu mengurangi latensi
- Batas bawah fisik latensi pulang-pergi ke sisi lain bumi berdasarkan kecepatan cahaya adalah sekitar 200 ms
- Dalam praktiknya, ke data center yang baik di sisi lain bumi sering kali memakan waktu kira-kira 300 ms
- Jika JS, CSS, dan media disajikan melalui CDN, mengurangi 300 ms waktu pemrosesan server pada rendering awal saja bisa memberi efek yang mirip dengan memindahkan server lebih dekat ke pengguna
- Teknologi serverless generasi kedua telah sangat mengurangi masalah masa lalu ketika cold boot mudah menghabiskan anggaran latensi 300 ms, tetapi round-trip ke database tetap tersisa
- Jika rendering halaman membutuhkan satu saja query database, server edge harus kembali melakukan round-trip ke lokasi seperti us-east-1 tempat database origin berada
- Latensi berpindah dari antara pengguna dan server origin menjadi antara server edge dan server origin
- Halaman yang kompleks sering membutuhkan 5 atau lebih query database untuk rendering
- Banyak framework web menjalankan query secara berurutan dengan model single-thread, sehingga jika terjadi beberapa kali round-trip antar data center, hasilnya bisa lebih lambat daripada sekali pergi ke origin
- Ada aturan praktis bahwa komunikasi antar data center 10 kali lebih lambat daripada komunikasi di dalam data center, dan komunikasi di dalam data center 10 kali lebih lambat daripada komunikasi di dalam perangkat yang sama
- Dalam konteks ini, SQLite lokal muncul sebagai pilihan yang menguntungkan untuk memangkas latensi
Perbedaan biaya Hetzner, AWS, dan Vercel
- Server 16-core Hetzner, termasuk RAM 64 GB dan drive NVMe, berharga $0,34/jam
- AWS EC2 m5a.4xlarge, yang dibandingkan sebagai server x86 serupa, berharga $0,68/jam
- Perbedaan harga bandwidth lebih besar lagi
- Hetzner memberi 20 TB transfer gratis dan setelah itu menagih $1,5/TB
- AWS memberi 100 GB gratis dan setelah itu menagih $90/TB
- Vercel disebut sebagai contoh yang menagih $200/TB setelah 1 TB pertama gratis
- Kuota gratis dari vendor cloud memudahkan masuk di awal, tetapi saat skala membesar bisa berbalik menjadi biaya tinggi
Menjalankan operasi secara sederhana dengan konfigurasi satu server
- Jika tidak ada kasus penggunaan cloud tertentu seperti transcoding video, menjalankan model AI sendiri, atau pekerjaan yang benar-benar memberi beban besar pada sistem, situs web atau SaaS dapat berjalan di satu server
- Menempatkan server di Virginia dapat memberikan latensi di bawah 100 ms bagi pengguna berbahasa Inggris
- Konfigurasi yang disarankan dibuat sederhana dengan berpusat pada satu server
- Database menggunakan SQLite di mesin yang sama
- SQLite dicadangkan secara terus-menerus dengan Litestream
- CSS, JS, dan gambar di-cache lewat CDN
- Server rendering dilakukan dekat dengan SQLite untuk mengurangi round-trip dan meningkatkan performa
- Deployment juga tidak perlu dibuat rumit
- CI cukup melakukan SCP kode ke server
- NGINX mendukung deployment tanpa downtime
- Docker dan virtualisasi diperlakukan sebagai faktor yang memperlambat eksekusi kode dan CI/CD
Kapan scaling horizontal diperlukan dan kapan tidak
- Narasi bahwa scaling horizontal diperlukan dalam kebanyakan kasus berlebihan
- Ada asumsi bahwa performa server membaik lebih cepat daripada pertumbuhan internet
- Jika latensi benar-benar penting, konfigurasi dengan menambahkan server di Jerman dan California memungkinkan
- Write diarahkan ke primary
- Read menggunakan read replica lokal
- Konfigurasi seperti ini cukup scalable, kompleksitas pengelolaannya rendah, dan biayanya juga jauh lebih murah
- Penyajian HTML pada skala 11 MB/detik tidak perlu dibuat rumit tanpa alasan
1 komentar
Pendapat di Hacker News
Bisnis hosting kecil saya dulu mengalami pasang-surut tepat di titik ini, dan saat itu saya tidak tahu apa yang sebenarnya terjadi
Saat bertumbuh pada awal 2000-an, pendapatan besar biasanya datang dari stack yang rumit, dan banyak konfigurasi seperti load balancer serta firewall redundan yang sebenarnya melebihi kebutuhan pelanggan, tetapi pelanggan menginginkannya
Failover sering kali biaya kompleksitas operasionalnya lebih besar daripada manfaat yang didapat saat server mati dengan cara yang memang diantisipasi, dan kami juga membuat platform cloud hosting berbasis API untuk melawan AWS, tetapi pendapatan mencapai puncaknya pada 2012
Pelanggan menginginkan solusi yang lebih rumit yang memakai AWS sebagian atau seluruhnya, sementara kami berpikir karena hardware sudah jauh lebih kuat dibanding 10 tahun sebelumnya, pelanggan besar pun akan menginginkan server yang lebih sedikit dan sederhana
Namun itu berarti menjual harga, bukan menjual kecerdikan, dan kami tidak memahami ambisi finansial yang diperlukan untuk transisi seperti itu. Tidak ada yang percaya pada satu server murah, dan membeli dua unit pun belum memberi jawaban memadai soal skalabilitas
Pada akhirnya pendapatan memang bertahan, tetapi kami tidak bisa membangun stack layanan terkelola dan ekosistem software lebih cepat daripada Amazon, dan setelah tantangan teknis baru mengering, kami menjual perusahaan pada 2018
Karena kami tumbuh secara bootstrap dan tagihan hosting tanpa batas terasa seperti risiko gila, desain produk kami pun lahir dari pola pikir seperti itu; baru belakangan terlihat bahwa semua orang ternyata bersedia mengambil risiko itu
Alasan AWS menancap bukan hanya karena VC memungkinkan produk yang mahal, tetapi juga karena kecerdikan khas mereka tertanam dalam satu generasi developer software. Namun pengetahuan tentang kapan cloud tidak diperlukan dan apa alternatifnya kini terasa cukup niche
Ada beberapa masalah dengan angka-angkanya
Pertama, traffic tidak tersebar merata. Angka 400 juta page load/bulan di tulisan itu bisa terkena hukum 80/20 secara rekursif, dan jika dilihat begitu, sekitar 205 juta request dapat menumpuk selama 5,8 jam, menjadi sekitar 9,7 ribu request per detik
Itu masih mungkin dengan satu sistem, tetapi bukan lagi hal sepele, apalagi jika juga menginginkan satu DB tanpa read replica. Meski total traffic sama, batas bandwidth yang dibutuhkan untuk peak load menjadi jauh lebih tinggi daripada rata-rata optimistis 11MB/s
Kedua, latensi end-to-end satu arah hanya berlaku untuk data streaming. Pada cold start dunia nyata, tanpa HTTP/3, koneksi TCP butuh 3 round trip, koneksi TLS minimal 2 round trip, baru setelah itu request dan response HTTP berjalan
Untuk melayani manusia sungguhan, semua hal yang dapat diamati harus terjadi dalam kurang dari 1 detik, dan setelah itu persentase pengguna yang menganggap sistem rusak lalu menutup tab meningkat tajam
Dulu saya membantu mengoperasikan betting exchange; traffic-nya melonjak ekstrem dan kebutuhan latensinya ketat, sementara volume transaksi terkonsentrasi pada bagian yang sangat kecil dari seluruh jendela event. Dalam trading real-time, hasil harus muncul di layar dalam 100ms sejak pengguna mulai bertindak, dan latensi round trip jaringan menggerus anggaran pemrosesan event
Referensi: https://www.nngroup.com/articles/response-times-3-important-...
Beban seperti itu pun masih bisa ditangani dengan konfigurasi satu server besar, tetapi kini itu bukan lagi web server sederhana, melainkan semacam frontend load balancer yang cukup kuat dengan web server bawaan
AWS memang mengenakan biaya mahal, tetapi ada engineering yang luar biasa besar di balik load balancer dan infrastruktur jaringannya, sehingga kita yang lain tidak perlu menjadi ahli di seluruh area stack tersebut
Sebenarnya berapa banyak layanan yang benar-benar membutuhkan jangkauan seluruh dunia? Apakah dukungan banyak bahasa juga ikut dibuat?
Jika melayani di dalam AS atau EU, satu server pusat yang bagus pun bisa memberi latensi di bawah 30ms ke seluruh kawasan tersebut
Kecuali benar-benar ada kebutuhan global dan harus mengelola database global juga, edge cenderung terlalu dibesar-besarkan
Melihat
500 Internal Server Errormuncul, sepertinya penulis sedang menerima traffic lebih dari 11MB/s. Arsipnya ada di sini: https://archive.is/UVpg0PR_END_OF_FILE_ERROR. Beberapa situs web mengatakan itu terjadi karena proxy, VPN, atau DNS-over-HTTPS, tetapi dalam kasus saya bukan itu penyebabnyaMenurut saya tulisan ini memandangnya dengan cara yang salah
Pendekatan yang lebih baik adalah jangan melakukan scaling terlalu dini
Bangun saja sesuai kebutuhan, dan dalam sebagian besar kasus bahkan CDN pun biaya yang tidak perlu. Dengan syarat, tidak membayar pajak bandwidth berlebihan dari penyedia cloud
Jika masalah performa mulai terlihat, tangani saat itu; dan jika kuda pekerja biasa tiba-tiba menjadi unicorn yang diinginkan semua orang, itu adalah masalah yang justru ingin dimiliki
Jika produknya bagus, pengguna akan mencoba lagi satu jam kemudian, bukan langsung pindah ke pesaing. Jika muncul masalah skalabilitas, cukup pindahkan bagian yang resource-intensive ke model hybrid yang bisa diskalakan
Namun jika sejak awal ingin web-scale, puluhan microservice, kondisi kegagalan yang meledak di antaranya, dan membakar uang VC lewat tagihan AWS sebelum pelanggan pertama, silakan saja
Mengoperasikan server fisik sendiri adalah urusan nanti, bukan masalah sekarang. Saat pilihan sudah antara tagihan AWS 1 juta dolar dan satu server besar, saya tidak akan memutuskan berdasarkan posting blog, melainkan sudah menjalankan pengujian sendiri
Jika memakai AWS, berarti Anda juga membeli kambing hitam. Gangguan besar layanan cloud mudah dijelaskan kepada atasan atau investor, tetapi jauh lebih sulit menjelaskan downtime kumulatif yang sama akibat kesalahan manusia di dalam tim
Kalau begitu, saya penasaran bagaimana itu selaras dengan tafsir bahwa cloud adalah kambing hitam
Jika menargetkan scaling vertikal, mengapa SQLite? Tidak ada yang menghalangi menjalankan Postgres yang di-host sendiri atau Supabase bersama aplikasi di server yang sama, dan selain butuh lebih banyak upaya konfigurasi, sulit terpikir kekurangannya
Jika berjalan tanpa DB dan menaruh seluruh state global di memori fisik satu server besar, menyimpannya sebagai objek internal proses tanpa round-trip ke Redis, sesekali membuat snapshot memori ke disk, serta memakai bahasa multithread yang dikompilasi, maka satu box bisa memenuhi NIC di atas 1Gbit dan melayani seluruh dunia
Saya juga merasa akan menarik kalau ada kasus nyata yang memakai arsitektur seperti itu
Di luar pola persistensi relasional standar, perbedaan fiturnya besar sehingga Postgres bisa lebih baik, tetapi dalam beberapa pola arsitektur SQLite juga bisa unggul
Untuk aplikasi berpusat konten seperti BusinessInsider, pola Baked Data berbasis SQLite bisa lebih baik dari sisi biaya dan latensi
simonw(datasette) telah banyak membuat alat dan tulisan tentang penggunaan SQLite di lingkungan produksi untuk situs web berpusat konten atau kaya data: https://simonwillison.net/2021/Jul/28/baked-data/
Itu masuk akal karena SQLite berjalan di dalam proses dan tidak perlu serialisasi. Ada juga keuntungan tambahan bahwa operasi bisa diproses secara serial, sehingga pengujian, penalaran, dan pembangunan lapisan cache menjadi jauh lebih mudah
Jika tidak memakai Unix socket, ada juga overhead jaringan, tetapi karena disebut server yang sama, itu saya sisihkan sebagai catatan tambahan. Dalam praktiknya, sangat umum menaruh Postgres di mesin lain demi isolasi, dan itu juga salah satu keunggulan utama DB jaringan
Fitur yang dibutuhkan semuanya ada, dan kesederhanaan serta kecepatannya juga lebih baik. SQLite mampu menangani data skala terabyte, banyak pembacaan, backup streaming real-time, dan secara keseluruhan merupakan implementasi SQL yang cukup seimbang
Rasanya saya baru akan mempertimbangkan Postgres/MySQL saat melampaui scaling vertikal satu box
https://blog.cloudflare.com/introducing-d1
Tampaknya banyak orang merasa perlu membela status quo dengan alasan ketersediaan dan keandalan ketika penulis berfokus pada latensi, bandwidth, dan biaya
Kesimpulan saya bukanlah menolak keunggulan cloud di hadapan trade-off, melainkan mempertanyakan apakah pola arsitektur cloud yang kini ada di mana-mana beserta ketergantungannya benar-benar wajib
Perbandingan ini lawan itu adalah perangkat retoris untuk memperkenalkan alternatif, dan solusi mana yang tepat bergantung pada sangat banyak faktor per penggunaan. Faktor-faktor seperti itulah yang juga membuat engineer mendapat pekerjaan
Namun bahkan dalam pola yang diusulkan penulis, kekhawatiran SRE bisa diatasi. “Kalau satu server mati, bagaimana dengan availability?” nyaris seperti strawman, karena availability bisa diselesaikan dengan cara yang berbeda dari sistem yang kita kenal, dan solusinya harus disesuaikan dengan hal yang benar-benar penting
Ada cara untuk mendapatkan jauh lebih banyak hanya dengan menambahkan satu tahap pada anggaran hemat: menaruh API dan DB SQLite bersama
Idealnya API memakai format serialisasi biner ber-overhead rendah dan koneksi persisten, sementara penyajian web memanfaatkan free tier layanan edge yang didukung VC dan sedang membakar uang. Saat ini Cloudflare Workers cukup murah hati dan traffic keluar juga gratis
Intinya, SQLite mampu menangani jumlah query per detik yang sangat besar bahkan dengan satu thread. Banyak operasi bisa dimasukkan secara serial sehingga mudah dinalar, dan caching memori serta invalidasi di sisi API juga menjadi sederhana
Dengan memisahkan web serving, kita bisa menikmati performa edge untuk handshake dan melewati DB sepenuhnya pada halaman statis. Tulisan itu meremehkan masalah waktu round-trip, padahal aplikasi nyata membutuhkan lebih banyak round-trip daripada yang dikira, sehingga masalah ini cukup nyata
Sebagian besar penggunaan CPU di luar DB berasal dari parsing, deserialisasi, penyalinan data, dan TLS; jadi jika potongan besar itu dikurangi, mesin kelas entry-level pun bisa dengan mudah mendapatkan puluhan ribu write per detik, dan read bahkan lebih cepat
Meski begitu, bottleneck klasik, terutama I/O, selalu layak di-benchmark. Penyedia sering melebih-lebihkan atau menyesatkan, jadi perlu dicoba sendiri di free tier. Sebaiknya siapkan juga integration test dan benchmark untuk berjaga-jaga jika harus pindah
Ini cukup bagus ketika hasilnya besar, tetapi saya berharap PostgreSQL sendiri tidak menjadi bottleneck saat membuat dataset besar menjadi JSON
Orang-orang bilang kita harus berada di edge, dekat dengan pengguna, dan mengurangi latensi
Sebenarnya, seberapa besar masalah latensi itu?
Contohnya adalah proyek rekomendasi buku Gnooks yang berjalan di server Jerman: https://www.gnooks.com
Penasaran apakah ada yang merasa situs itu terlalu lambat
Selama beberapa tahun terakhir, proyek ini menerima ribuan saran pengguna, tetapi seingat saya tidak ada yang pernah mengangkat latensi sebagai topik. Padahal kelompok pengguna terbesarnya berasal dari AS
Karena itu, masalah latensinya jauh lebih kecil dibanding PWA gaya sekarang yang mengimplementasikan sebagian besar logika di frontend lalu mengirim banyak kueri ke backend untuk memuat data yang diperlukan
Tetap saja situsnya sendiri baik-baik saja. Masalah baru muncul kalau situsnya memang sudah lambat
Jika dilakukan dari Eropa, latensinya akan sekitar 2 kali lipat dari yang dilihat pengguna Australia, sehingga membantu memperkirakan pengalaman terburuk
Bagusnya, ini bisa diuji secara andal untuk memastikan apakah benar-benar penting. Dengan begitu, akan ada jawaban yang konkret
Tulisan ini sama sekali tidak membahas ketersediaan. Layanan yang berjalan di satu box akan mengalami downtime terencana maupun tidak terduga
RPO/RTO juga perlu dipikirkan. Saat box itu jebol—atau lebih tepatnya, kalau jebol—perlu dilihat berapa lama pemulihannya dan berapa banyak data yang hilang
Untuk pernyataan bahwa jika rendering halaman punya satu saja kueri database maka harus kembali ke DB di us-east-1, ada juga opsi-opsi seperti ini:
https://aws.amazon.com/rds/aurora/global-database/
https://aws.amazon.com/dynamodb/global-tables/
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Conce...
https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/...
Ada banyak hal serupa lainnya, dan kalau mencoba merangkai sendiri hal yang sama secara tambal-sulam, itu akan merepotkan
Kalau 10–20 tahun lalu, saya mungkin setuju. Internet masih baru, dan kalau sebuah situs turun orang-orang menyalahkan situsnya, lalu situasi cepat menjadi buruk. Namun sekarang, mereka lebih mungkin menyalahkan penyedia internet lebih dulu atau mencoba lagi nanti
Tidak semua orang adalah Google, dan sistem yang lebih sederhana pada dasarnya juga lebih kecil kemungkinannya gagal. Pertahankan backup, dan kalau benar-benar khawatir, replikasi DB ke situs disaster recovery dingin. Itu sudah cukup untuk sebagian besar perusahaan dan situasi yang bukan FAANG
Selama data tidak hilang, bagi banyak perusahaan itu hanya menjadi gangguan singkat. Jika komunikasinya baik dan kejadiannya sangat jarang, downtime beberapa hari pun bisa ditoleransi; dalam beberapa kasus, kehilangan data pun bisa ditanggung
Ada ungkapan bahwa setiap tambahan satu angka 9 pada reliabilitas akan menggandakan biaya, dan itu harus benar-benar diperhitungkan saat menilai ROI. Seberapa besar reliabilitas yang sebenarnya dibutuhkan bisnis bergantung pada target pasarnya, dan menurut saya jawaban default IT berupa 100% otomatis itu keliru
Model satu server atau dua server juga jauh lebih rendah kompleksitasnya, dan karena itu tim operasi seperti LetsEncrypt pun memilih arsitektur dua server fisik seperti ini untuk menjalankan layanan global pada skala web: https://letsencrypt.org/2021/01/21/next-gen-database-servers...
Berkat latensi internal yang sangat rendah dari DB di dalam server atau DB tepat di sebelahnya, software dapat menjalankan kueri DB beberapa orde besaran lebih cepat, memakai lebih sedikit resource per pengguna, dan memberi pengalaman pengguna yang lebih responsif dibanding layanan DB terkelola di dunia nyata
Kompleksitas menciptakan jebakannya sendiri, dan menurut saya tidak ada layanan web yang belum pernah mengacaukannya sekali pun. AWS sendiri juga kadang menyebabkan insiden
Tidak bisa dibilang bahwa VPS lebih buruk dalam hal ini