Miskonsepsi pada sistem komputasi terdistribusi
Ketika kita membangun sebuah aplikasi, kita berasumsi bahwa aplikasi tersebut akan berjalan sesuai dengan apa yang kita inginkan, terlepas dari bagaimanapun aplikasi tersebut dijalankan.
Ketika kita mendesain sebuah sistem, kita berasumsi bahwa sistem tersebut akan bekerja dengan baik, terlepas dari dimanapun lingkungan sistem tersebut berada.
Asumsi-asumsi tersebut seringkali terbukti salah dan dalam jangka waktu panjang akan mengakibatkan masalah pada sistem atau program yang kita jalankan.
Asumsi-asumsi yang salah itu dapat disebut sebagai miskonsepsi — pengertian yang tidak akurat tentang sebuah konsep, penggunaan sebuah konsep yang salah, dan pemaknaan sebuah konsep yang berbeda.
Pada tulisan ini, kita akan membahas delapan miskonsepsi yang seringkali terjadi ketika kita mendesain sebuah sistem, atau membangun sebuah aplikasi yang berjalan di atas sistem komputasi terdistribusi. Delapan miskonsepsi ini dikemukakan pada 1994 oleh Peter Deutsch (walaupun empat miskonsepsi pertama sudah dikemukakan sebelumnya oleh Bill Joy dan Tom Lyon sebagai “The Fallacies of Networked Computing”), dan pada 1997, James Gosling menambahkan satu miskonsepsi terakhir.
Miskonsepsi #1 — The Network is Reliable (Bill Joy & Tom Lyon)
- Sistem yang kita bangun berjalan di atas multiple nodes, dan nodes tersebut saling berkomunikasi melalui sebuah jaringan.
- Tidak ada jaminan bahwa perangkat jaringan yang digunakan selalu berfungsi, atau power yang dibutuhkan selalu tersedia setiap waktu.
- Ada ancaman keamanan jaringan yang bisa terjadi setiap saat.
Apa yang perlu dilakukan?
- Jangan berasumsi seakan-akan jaringan yang kita gunakan untuk berkomunikasi selalui berfungsi dengan baik dan selalu dalam kondisi aman.
- Dari sisi infrastruktur, pertimbangkan redundansi hardware dan software.
- Dari sisi aplikasi, pertimbangkan mekanisme asynchronous messaging, retry and backoff, acknowledge message, verifikasi message integrity, dsb.
Miskonsepsi #2 — Latency is Zero (Bill Joy & Tom Lyon)
- Latency adalah seberapa cepat data dapat dipindahkan dari satu tempat ke tempat lain, sedangkan bandwidth adalah berapa banyak data yang dapat dipindahkan dalam satu waktu. Latency diukur dalam ms, sedangkan bandwidth dalam Mbps.
- Request yang dilakukan melalui WAN (internet), memiliki latency yang berbeda dengan request yang dilakukan melalui LAN.
- Request yang dilakukan melalui network tidak instan (ada delay).
Apa yang perlu dilakukan?
- Jangan berasumsi seakan-akan tidak ada delay ketika kita melakukan request.
- Jangan berasumsi sistem yang kita bangun hanya berjalan di sebuah LAN.
- Tempatkan data/server sedekat mungkin dengan klien untuk mengurangi latency, misalnya dengan memanfaatkan cache dan CDN.
Miskonsepsi #3 — Bandwidth is Infinite (Bill Joy & Tom Lyon)
- Bandwidth yang tersedia terbatas. Walaupun bandwidth terus berkembang saat ini, tetapi data yang kita kirimkan juga bertambah banyak.
- Bandwidth yang tidak memadai biasanya menyebabkan terjadinya packet loss.
Apa yang perlu dilakukan?
- Pertimbangkan toleransi terjadinya packet loss saat melakukan komunikasi melalui jaringan.
- Kirimkan data hanya yang diperlukan oleh klien.
- Gunakan metode yang efisien dalam berkomunikasi melalui jaringan, misalnya dengan memanfaatkan HTTP/2, gRPC dan Protobuf.
Miskonsepsi #4 — The Network is Secure (Bill Joy & Tom Lyon)
- Walaupun security berkembang, tetap tidak ada jaminan sebuah jaringan bisa 100% aman, misalnya celah The Heartbleed pada OpenSSL, yang memungkinkan seseorang mencuri data yang telah dilindungi oleh TLS.
- “Satu-satunya sistem yang aman adalah sistem yang tidak terhubung ke jaringan.”
Apa yang perlu dilakukan?
- Jangan bergantung pada security di satu layer. Lakukan implementasi security di berbagai layer, misalnya pada level jaringan, infrastruktur, dan aplikasi.
- Implementasikan zero trust architecture.
- Lakukan update dan patch pada software yang kita gunakan.
Miskonsepsi #5 — Topology doesn’t Change (Peter Deutsch)
- Setiap kali ada node yang masuk atau keluar pada sebuah jaringan, maka jaringan tersebut mengalami perubahan state/kondisi.
- Node masuk atau keluar dapat berupa banyak hal, misalnya dalam konteks containerized applications, containers yang un-healthy akan digantikan oleh containers yang baru, dan ada kemungkinan alamat IP-nya berubah.
Apa yang perlu dilakukan?
- Jangan bergantung pada endpoints tertentu, dan jalankan mekanisme service discovery untuk melakukan abstraksi pada jaringan.
- Manfaatkan DNS, dan tidak bergantung pada alamat IP.
- Implementasikan konsep cattle, bukan pets.
Miskonsepsi #6 — There is one Administrator (Peter Deutsch)
- Tidak ada satu orang pun yang mengetahui semua hal. Pasti ada lebih dari satu orang yang terlibat pada sebuah aplikasi.
- Karena banyak orang yang terlibat pada sebuah aplikasi, ketika terjadi masalah pada aplikasi tersebut, mungkin akan sulit untuk mengetahui siapa yang tahu cara memperbaikinya. Selain itu, mungkin diperlukan koordinasi lebih dari satu orang untuk memperbaikinya.
Apa yang perlu dilakukan?
- “You build it, you run it.” — Werner Vogels.
- Lakukan centralized logging dan monitoring.
Miskonsepsi #7 — Transport Cost is Zero (Peter Deutsch)
- Melakukan pemindahan data dari satu tempat ke tempat lain melalui sebuah jaringan memerlukan cost, baik secara waktu, uang dan resources yang lain.
- Miskonsepsi ini berkaitan dengan miskonsepsi #2 dan #3 (latency dan bandwidth).
- Transport cost dapat diartikan sebagai (1) computer resources (CPU/memory, uang) untuk melakukan pemrosesan data, atau (2) biaya untuk infrastruktur jaringan sebagai media transportasi data (on-premises atau cloud).
Apa yang perlu dilakukan?
- Melakukan efisiensi resources. Misalnya, dengan memanfaatkan HTTP/2, gRPC dan Protobuf untuk berkomunikasi melalui jaringan.
- Kirimkan data hanya yang diperlukan oleh klien.
Miskonsepsi #8 — The Network is Homogeneous (James Gosling)
- Jaringan yang homogen dapat diartikan sebagai sebuah jaringan dimana semua node di dalamnya mempunyai spesifikasi dan konfigurasi yang sama, serta berkomunikasi dengan menggunakan protokol yang seragam. Hal ini tentunya merupakan asumsi yang salah.
- Di dalam sebuah sistem komputasi terdistribusi, kita akan menemukan beragam devices dan protokol, dengan spesifikasi yang berbeda-beda.
Apa yang perlu dilakukan?
- Mengadopsi format yang standar dalam melakukan komunikasi, seperti menggunakan XML, JSON atau Protobuf. Hindari menggunakan protokol proprietari yang memiliki tingkat adopsi rendah.