Prinsip dalam pilar keberlanjutan dari Google Cloud Well-Architected Framework ini memberikan rekomendasi untuk menulis software yang meminimalkan konsumsi energi dan beban server.
Ringkasan prinsip
Saat Anda mengikuti praktik terbaik untuk mem-build aplikasi cloud, Anda mengoptimalkan energi yang digunakan oleh resource infrastruktur cloud: AI, komputasi, penyimpanan, dan jaringan. Anda juga membantu mengurangi kebutuhan air pusat data dan energi yang dikonsumsi perangkat pengguna akhir saat mereka mengakses aplikasi Anda.
Untuk mem-build software yang hemat energi, Anda harus mengintegrasikan pertimbangan keberlanjutan di seluruh siklus proses software, mulai dari desain dan pengembangan hingga deployment, pemeliharaan, dan pengarsipan. Untuk panduan mendetail tentang penggunaan AI untuk mem-build software yang meminimalkan dampak lingkungan dari beban kerja cloud, lihat the Google Cloud ebook, Membangun Software Secara Berkelanjutan.
Rekomendasi
Rekomendasi di bagian ini dikelompokkan ke dalam area fokus berikut:
- Meminimalkan pekerjaan komputasi: Pilih kode yang ringkas dan fokus yang menghilangkan logika berlebihan dan menghindari komputasi atau fitur yang tidak perlu.
- Menggunakan algoritma dan struktur data yang efisien: Pilih algoritma yang efisien waktu dan memori yang mengurangi beban CPU dan meminimalkan penggunaan memori.
- Mengoptimalkan operasi komputasi dan data: Kembangkan dengan tujuan menggunakan semua resource yang tersedia secara efisien, termasuk CPU, memori, I/O disk, dan jaringan. Misalnya, saat Anda mengganti loop sibuk dengan logika berbasis peristiwa, Anda menghindari polling yang tidak perlu.
- Menerapkan pengoptimalan frontend: Untuk mengurangi daya yang dikonsumsi oleh perangkat pengguna akhir, gunakan strategi seperti minimisasi, kompresi, dan pemuatan lambat untuk gambar dan aset.
Meminimalkan pekerjaan komputasi
Untuk menulis software yang hemat energi, Anda harus meminimalkan jumlah total pekerjaan komputasi yang dilakukan aplikasi Anda. Setiap instruksi yang tidak perlu, loop berlebihan, dan fitur tambahan mengonsumsi energi, waktu, dan resource. Gunakan rekomendasi berikut untuk mem-build software yang melakukan komputasi minimal.
Menulis kode yang ringkas dan fokus
Untuk menulis kode minimal yang penting untuk mencapai hasil yang diperlukan, gunakan pendekatan berikut:
- Menghilangkan logika berlebihan dan fitur yang tidak perlu: Tulis kode yang hanya menjalankan fungsi penting. Hindari fitur yang meningkatkan overhead dan kompleksitas komputasi, tetapi tidak memberikan nilai terukur kepada pengguna Anda.
- Refaktor: Untuk meningkatkan efisiensi energi dari waktu ke waktu, audit aplikasi Anda secara rutin untuk mengidentifikasi fitur yang tidak digunakan. Ambil tindakan untuk menghapus atau memfaktorkan ulang fitur tersebut sebagaimana mestinya.
- Menghindari operasi yang tidak perlu: Jangan menghitung nilai atau menjalankan tindakan hingga hasilnya diperlukan. Gunakan teknik seperti evaluasi lambat, yang menunda komputasi hingga komponen dependen dalam aplikasi memerlukan output.
- Memprioritaskan keterbacaan dan penggunaan kembali kode: Tulis kode yang mudah dibaca dan dapat digunakan kembali. Pendekatan ini meminimalkan duplikasi dan mengikuti prinsip jangan ulangi diri Anda (DRY), yang dapat membantu mengurangi emisi karbon dari pengembangan dan pemeliharaan software.
Menggunakan backend caching
Backend caching memastikan bahwa aplikasi tidak melakukan pekerjaan yang sama berulang kali. Rasio cache hit yang tinggi akan menghasilkan pengurangan konsumsi energi per permintaan yang hampir linear. Untuk menerapkan backend caching, gunakan teknik berikut:
- Cache data yang sering digunakan: Simpan data yang sering diakses di lokasi penyimpanan sementara dan berperforma tinggi. Misalnya, gunakan caching dalam memori layanan seperti Memorystore. Saat aplikasi mengambil data dari cache, volume kueri database dan operasi I/O disk akan berkurang. Akibatnya, beban pada database dan server di backend akan berkurang.
- Cache respons API: Untuk menghindari panggilan jaringan yang berlebihan dan mahal, cache hasil permintaan API yang sering digunakan.
- Memprioritaskan caching dalam memori: Untuk menghilangkan operasi I/O disk yang lambat dan kueri database yang kompleks, simpan data dalam memori berkecepatan tinggi (RAM).
- Memilih strategi cache-write yang sesuai:
- Strategi write-through memastikan data ditulis secara sinkron ke cache dan penyimpanan persisten. Strategi ini meningkatkan kemungkinan cache hit, sehingga penyimpanan persisten mendapatkan lebih sedikit permintaan baca yang intensif energi.
- Strategi write-back (write-behind) meningkatkan performa aplikasi yang banyak melakukan operasi tulis. Data ditulis ke cache terlebih dahulu, dan database akan diupdate secara asinkron nanti. Strategi ini mengurangi beban tulis langsung pada database yang lebih lambat.
- Menggunakan kebijakan penghapusan cerdas: Jaga agar cache tetap ringkas dan efisien. Untuk menghapus data yang sudah tidak berlaku atau data yang jarang digunakan dan memaksimalkan ruang yang tersedia untuk data yang sering diminta, gunakan kebijakan seperti time to live (TTL), least recently used (LRU), dan least frequently used (LFU).
Menggunakan algoritma dan struktur data yang efisien
Algoritma dan struktur data yang Anda pilih menentukan kompleksitas komputasi mentah software Anda. Saat Anda memilih algoritma dan struktur data yang sesuai, Anda akan meminimalkan jumlah siklus CPU dan operasi memori yang diperlukan untuk menyelesaikan tugas. Siklus CPU dan operasi memori yang lebih sedikit akan menghasilkan konsumsi energi yang lebih rendah.
Memilih algoritma untuk kompleksitas waktu yang optimal
Prioritaskan algoritma yang mencapai hasil yang diperlukan dalam waktu sesingkat mungkin. Pendekatan ini membantu mengurangi durasi penggunaan resource. Untuk memilih algoritma yang mengoptimalkan penggunaan resource, gunakan pendekatan berikut:
- Berfokus pada pengurangan kompleksitas: Untuk mengevaluasi kompleksitas, lihat di luar metrik runtime dan pertimbangkan kompleksitas teoretis algoritma. Misalnya, jika dibandingkan dengan bubble sorting, merge sorting secara signifikan mengurangi beban komputasi dan konsumsi energi untuk set data besar.
- Menghindari pekerjaan yang berlebihan: Gunakan fungsi bawaan yang dioptimalkan dalam bahasa atau framework pemrograman yang Anda pilih. Fungsi ini sering kali diimplementasikan dalam bahasa tingkat rendah dan lebih hemat energi seperti C atau C++, sehingga lebih dioptimalkan untuk hardware yang mendasarinya dibandingkan dengan fungsi yang dikodekan secara kustom.
Memilih struktur data untuk efisiensi
Struktur data yang Anda pilih menentukan kecepatan pengambilan, penyisipan, atau pemrosesan data. Kecepatan ini memengaruhi penggunaan CPU dan memori. Untuk memilih struktur data yang efisien, gunakan pendekatan berikut:
- Mengoptimalkan penelusuran dan pengambilan: Untuk operasi umum seperti memeriksa apakah item ada atau mengambil nilai tertentu, pilih struktur data yang dioptimalkan untuk kecepatan. Misalnya, peta hash atau set hash memungkinkan pencarian waktu yang hampir konstan, yang merupakan pendekatan yang lebih hemat energi daripada menelusuri array secara linear.
- Meminimalkan jejak memori: Struktur data yang efisien membantu mengurangi jejak memori keseluruhan aplikasi. Pengurangan akses dan pengelolaan memori akan menghasilkan konsumsi daya yang lebih rendah. Selain itu, profil memori yang lebih ringkas memungkinkan proses berjalan lebih efisien, sehingga Anda dapat menunda upgrade resource.
- Menggunakan struktur khusus: Gunakan struktur data yang dibuat khusus untuk masalah tertentu. Misalnya, gunakan a trie struktur data untuk penelusuran awalan string yang cepat, dan gunakan antrean prioritas saat Anda hanya perlu mengakses nilai tertinggi atau terendah secara efisien.
Mengoptimalkan operasi komputasi dan data
Saat Anda mengembangkan software, fokuslah pada penggunaan resource yang efisien dan proporsional di seluruh teknologi stack. Perlakukan CPU, memori, disk, dan jaringan sebagai resource terbatas dan bersama. Ketahuilah bahwa penggunaan resource yang efisien akan menghasilkan pengurangan biaya dan konsumsi energi yang nyata.
Mengoptimalkan pemakaian CPU dan waktu idle
Untuk meminimalkan waktu yang dihabiskan CPU dalam keadaan aktif dan mengonsumsi energi tanpa melakukan pekerjaan yang berarti, gunakan pendekatan berikut:
- Memilih logika berbasis peristiwa daripada polling: Ganti loop sibuk yang intensif resource atau pemeriksaan konstan (polling) dengan logika berbasis peristiwa. Arsitektur berbasis peristiwa memastikan bahwa komponen aplikasi hanya beroperasi saat dipicu oleh peristiwa yang relevan. Pendekatan ini memungkinkan pemrosesan sesuai permintaan, yang menghilangkan kebutuhan akan polling yang intensif resource.
- Mencegah frekuensi tinggi yang konstan: Tulis kode yang tidak memaksa CPU untuk terus beroperasi pada frekuensi tertinggi. Untuk meminimalkan konsumsi energi, sistem yang tidak aktif harus dapat memasuki status daya rendah atau mode tidur.
- Menggunakan pemrosesan asinkron: Untuk mencegah thread terkunci selama waktu tunggu idle, gunakan pemrosesan asinkron. Pendekatan ini membebaskan resource dan menghasilkan pemakaian resource keseluruhan yang lebih tinggi.
Mengelola memori dan I/O disk secara efisien
Penggunaan memori dan disk yang tidak efisien akan menyebabkan pemrosesan yang tidak perlu dan peningkatan konsumsi daya. Untuk mengelola memori dan I/O secara efisien, gunakan teknik berikut:
- Pengelolaan memori yang ketat: Ambil tindakan untuk melepaskan resource memori yang tidak digunakan secara proaktif. Hindari menyimpan objek besar dalam memori untuk jangka waktu yang lebih lama dari yang diperlukan. Pendekatan ini mencegah bottleneck performa dan mengurangi daya yang dikonsumsi untuk akses memori.
- Mengoptimalkan I/O disk: Kurangi frekuensi interaksi baca dan tulis aplikasi Anda dengan resource penyimpanan persisten. Misalnya, gunakan buffer memori perantara untuk menyimpan data. Tulis data ke penyimpanan persisten pada interval tetap atau saat buffer mencapai ukuran tertentu.
- Operasi batch: Gabungkan operasi disk kecil yang sering digunakan menjadi operasi batch yang lebih sedikit dan lebih besar. Operasi batch mengonsumsi lebih sedikit energi daripada banyak transaksi kecil individual.
- Menggunakan kompresi: Kurangi jumlah data yang ditulis ke atau dibaca dari disk dengan menerapkan teknik kompresi data yang sesuai. Misalnya, untuk mengompresi data yang Anda simpan di Cloud Storage, Anda dapat menggunakan transcoding dekompresif.
Meminimalkan traffic jaringan
Resource jaringan mengonsumsi energi yang signifikan selama operasi transfer data. Untuk mengoptimalkan komunikasi jaringan, gunakan teknik berikut:
- Meminimalkan ukuran payload: Desain API dan aplikasi Anda untuk hanya mentransfer data yang diperlukan untuk permintaan. Hindari mengambil atau menampilkan struktur JSON atau XML yang besar jika hanya beberapa kolom yang diperlukan. Pastikan struktur data yang ditampilkan ringkas.
- Mengurangi round-trip: Untuk mengurangi jumlah round-trip jaringan yang diperlukan untuk menyelesaikan tindakan pengguna, gunakan protokol yang lebih cerdas. Misalnya, pilih HTTP/3 daripada HTTP/1.1, pilih GraphQL daripada REST, gunakan protokol biner, dan gabungkan panggilan API. Saat Anda mengurangi volume panggilan jaringan, Anda mengurangi konsumsi energi untuk server dan perangkat pengguna akhir.
Menerapkan pengoptimalan frontend
Pengoptimalan frontend meminimalkan data yang harus didownload dan diproses oleh pengguna akhir, yang membantu mengurangi beban pada resource perangkat pengguna akhir.
Meminimalkan kode dan aset
Saat pengguna akhir perlu mendownload dan memproses resource yang lebih kecil dan terstruktur lebih efisien, perangkat mereka akan mengonsumsi lebih sedikit daya. Untuk meminimalkan volume download dan beban pemrosesan pada perangkat pengguna akhir, gunakan teknik berikut:
- Minimisasi dan kompresi: Untuk file JavaScript, CSS, dan HTML, hapus karakter yang tidak perlu seperti spasi dan komentar menggunakan alat minimisasi yang sesuai. Pastikan file seperti gambar dikompresi dan dioptimalkan. Anda dapat mengotomatiskan minimisasi dan kompresi aset web menggunakan pipeline CI/CD.
- Pemuatan lambat: Muat gambar, video, dan aset non-kritis hanya saat benar-benar diperlukan, seperti saat elemen ini di-scroll ke dalam area pandang halaman web. Pendekatan ini mengurangi volume transfer data awal dan beban pemrosesan pada perangkat pengguna akhir.
- Paket JavaScript yang lebih kecil: Hapus kode yang tidak digunakan dari paket JavaScript Anda menggunakan bundler modul modern dan teknik seperti tree shaking. Pendekatan ini menghasilkan file yang lebih kecil yang dimuat lebih cepat dan menggunakan lebih sedikit resource server.
- Browser caching: Gunakan header caching HTTP untuk menginstruksikan browser pengguna menyimpan aset statis secara lokal. Browser caching membantu mencegah download berulang dan traffic jaringan yang tidak perlu pada kunjungan berikutnya.
Memprioritaskan pengalaman pengguna (UX) yang ringan
Desain antarmuka pengguna dapat memiliki dampak yang signifikan terhadap kompleksitas komputasi untuk merender konten frontend. Untuk mem-build antarmuka frontend yang menyediakan UX ringan, gunakan teknik berikut:
- Rendering yang efisien: Hindari manipulasi Document Object Model (DOM) yang intensif resource dan sering dilakukan. Tulis kode yang meminimalkan kompleksitas rendering dan menghilangkan rendering ulang yang tidak perlu.
- Pola desain yang ringan: Jika sesuai, pilih situs statis atau progressive web app (PWA). Situs dan aplikasi tersebut dimuat lebih cepat dan memerlukan lebih sedikit resource server.
- Aksesibilitas dan performa: Situs yang responsif dan dimuat dengan cepat sering kali lebih berkelanjutan dan dapat diakses. Desain yang dioptimalkan dan tidak berantakan mengurangi resource yang dikonsumsi saat konten dirender. Situs yang dioptimalkan untuk performa dan kecepatan dapat membantu mendorong pendapatan yang lebih tinggi. Menurut studi penelitian oleh Deloitte dan Google, Milliseconds Make Millions, peningkatan kecepatan situs sebesar 0,1 detik (100 md) menghasilkan peningkatan konversi sebesar 8,4% untuk situs retail dan peningkatan nilai pesanan rata-rata sebesar 9,2% .