Apa itu Skalabilitas Perangkat Lunak, dan Mengapa Perusahaan Anda Harus Menganggapnya Serius?

Diterbitkan: 2023-08-01

Bahkan perusahaan yang berpengalaman dan sukses pun dapat mengalami masalah dengan skalabilitas. Apakah Anda ingat aplikasi Tepuk Tangan Disney? Ini memungkinkan pengguna untuk berinteraksi dengan berbagai acara Disney. Ketika aplikasi muncul di Google Play, itu sangat populer. Namun, tidak begitu terukur. Itu tidak dapat menangani sejumlah besar penggemar, menghasilkan pengalaman pengguna yang buruk. Orang-orang sangat marah, meninggalkan umpan balik negatif dan peringkat satu bintang di Google Play. Aplikasi tidak pernah pulih dari publisitas negatif ini.

Anda dapat menghindari masalah seperti ini jika Anda memperhatikan skalabilitas perangkat lunak selama tahap awal pengembangan, apakah Anda mengimplementasikannya sendiri atau menggunakan layanan rekayasa perangkat lunak.

Jadi, apa itu skalabilitas dalam perangkat lunak? Bagaimana cara memastikan solusi Anda dapat diskalakan? Dan kapan Anda perlu memulai penskalaan?

Apa itu skalabilitas perangkat lunak?

Gartner mendefinisikan skalabilitas sebagai ukuran kemampuan sistem untuk menurunkan atau meningkatkan kinerja dan biaya sebagai respons terhadap perubahan permintaan pemrosesan.

Dalam konteks pengembangan perangkat lunak, skalabilitas adalah kemampuan aplikasi untuk menangani variasi beban kerja sambil menambahkan atau menghapus pengguna dengan biaya minimal. Jadi, solusi yang dapat diskalakan diharapkan tetap stabil dan mempertahankan kinerjanya setelah peningkatan beban kerja yang tajam, baik yang diharapkan maupun yang spontan. Contoh peningkatan beban kerja adalah:

  • Banyak pengguna mengakses sistem secara bersamaan
  • Ekspansi dalam persyaratan kapasitas penyimpanan
  • Peningkatan jumlah transaksi yang diproses

Jenis skalabilitas perangkat lunak

Anda dapat menskalakan aplikasi baik secara horizontal maupun vertikal. Mari kita lihat apa keuntungan dan kerugian dari masing-masing pendekatan.

Skalabilitas perangkat lunak horizontal (penskalaan)

Anda dapat menskalakan perangkat lunak secara horizontal dengan memasukkan node tambahan ke dalam sistem untuk menangani beban yang lebih tinggi, karena akan didistribusikan ke seluruh mesin. Misalnya, jika sebuah aplikasi mulai mengalami penundaan, Anda dapat memperbesarnya dengan menambahkan server lain.

Skalabilitas horizontal adalah pilihan yang lebih baik ketika Anda tidak dapat memperkirakan berapa banyak beban yang perlu ditangani aplikasi Anda di masa mendatang. Ini juga merupakan opsi masuk untuk perangkat lunak yang perlu diskalakan dengan cepat tanpa waktu henti.

Manfaat:

  • Ketahanan terhadap kegagalan. Jika satu node gagal, yang lain akan mengambil kendur
  • Tidak ada periode downtime selama penskalaan karena tidak perlu menonaktifkan node yang ada saat menambahkan yang baru
  • Secara teoritis, kemungkinan untuk menskalakan secara horizontal tidak terbatas

Keterbatasan:

  • Menambahkan kompleksitas. Anda perlu menentukan bagaimana beban kerja didistribusikan di antara node. Anda dapat menggunakan Kubernetes untuk manajemen beban
  • Biaya lebih tinggi. Menambahkan node baru lebih mahal daripada memutakhirkan yang sudah ada
  • Kecepatan perangkat lunak secara keseluruhan mungkin dibatasi oleh kecepatan komunikasi node

Skalabilitas perangkat lunak vertikal (peningkatan)

Skalabilitas vertikal adalah tentang menambahkan lebih banyak daya ke perangkat keras yang ada. Jika dengan skalabilitas horizontal Anda akan menambahkan server lain untuk menangani beban aplikasi, di sini Anda akan memperbarui server yang ada dengan menambahkan lebih banyak daya pemrosesan, memori, dll. Opsi lainnya adalah menghapus server lama dan menghubungkan server yang lebih maju dan mampu.

Jenis skalabilitas ini bekerja dengan baik ketika Anda mengetahui jumlah beban ekstra yang perlu Anda masukkan.

Manfaat:

  • Tidak perlu mengubah konfigurasi atau logika aplikasi untuk beradaptasi dengan infrastruktur yang diperbarui
  • Biaya lebih rendah, karena lebih murah untuk meningkatkan daripada menambah mesin lain

Keterbatasan:

  • Ada downtime selama proses upgrade
  • Mesin yang ditingkatkan masih menyajikan satu titik kegagalan
  • Ada batasan seberapa banyak Anda dapat memutakhirkan satu perangkat

Skalabilitas perangkat lunak vertikal vs horizontal

Berikut adalah tabel perbandingan yang memberikan ikhtisar tentang berbagai aspek dari kedua jenis skalabilitas perangkat lunak.

Kapan Anda benar-benar membutuhkan skalabilitas?

Banyak perusahaan mengesampingkan skalabilitas dalam rekayasa perangkat lunak demi biaya yang lebih rendah dan siklus hidup pengembangan perangkat lunak yang lebih pendek. Dan meskipun ada beberapa kasus di mana skalabilitas bukan merupakan atribut kualitas sistem yang penting, dalam banyak situasi, Anda perlu mempertimbangkannya dari tahap awal siklus hidup produk Anda.

Ketika skalabilitas perangkat lunak tidak diperlukan:

  • Jika perangkat lunak adalah proof of concept (PoC) atau prototipe
  • Saat mengembangkan perangkat lunak internal untuk perusahaan kecil yang hanya digunakan oleh karyawan
  • Aplikasi seluler/desktop tanpa backend

Selebihnya, sangat disarankan untuk melihat opsi skalabilitas agar siap ketika saatnya tiba. Dan bagaimana Anda tahu sudah waktunya untuk mengukur? Ketika Anda melihat penurunan kinerja. Berikut beberapa indikasinya:

  • Waktu respons aplikasi meningkat
  • Ketidakmampuan untuk menangani permintaan pengguna secara bersamaan
  • Peningkatan tingkat kesalahan, seperti kegagalan koneksi dan waktu habis
  • Kemacetan sering terjadi. Anda tidak dapat mengakses database, otentikasi gagal, dll.

Kiat untuk membangun perangkat lunak yang sangat skalabel

Skalabilitas perangkat lunak jauh lebih murah dan lebih mudah diimplementasikan jika dipertimbangkan sejak awal pengembangan perangkat lunak. Jika Anda harus menskalakan secara tidak terduga tanpa mengambil langkah-langkah yang diperlukan selama penerapan, prosesnya akan menghabiskan lebih banyak waktu dan sumber daya. Salah satu pendekatan tersebut adalah dengan memfaktorkan ulang kode, yang merupakan upaya duplikat, karena tidak menambahkan fitur baru. Itu hanya melakukan apa yang seharusnya dilakukan selama pengembangan.

Di bawah ini Anda dapat menemukan delapan tip yang akan membantu Anda membuat perangkat lunak yang lebih mudah untuk diskalakan di masa mendatang. Tabel di bawah ini membagi tip ke dalam tahapan pengembangan perangkat lunak yang berbeda.

Kiat #1: Pilih hosting di cloud untuk skalabilitas perangkat lunak yang lebih baik

Anda memiliki dua opsi untuk menghosting aplikasi Anda, baik di cloud atau di tempat. Atau Anda dapat menggunakan pendekatan hybrid.

Jika Anda memilih model lokal , Anda akan mengandalkan infrastruktur Anda sendiri untuk menjalankan aplikasi, mengakomodasi penyimpanan data Anda, dll. Penyiapan ini akan membatasi kemampuan Anda untuk menskalakan dan membuatnya lebih mahal. Namun, jika Anda beroperasi di sektor yang diatur secara ketat, Anda mungkin tidak punya pilihan, karena hosting lokal memberi Anda lebih banyak kendali atas data.

Selain itu, di beberapa sektor, seperti perbankan, waktu penanganan transaksi sangat penting dan Anda tidak dapat menunggu cloud merespons atau mentolerir downtime dari penyedia cloud. Perusahaan yang beroperasi di industri ini dibatasi untuk menggunakan perangkat keras tertentu dan tidak dapat mengandalkan penyedia cloud apa pun yang ditawarkan. Hal yang sama berlaku untuk aplikasi misi-kritis yang sensitif terhadap waktu, seperti kendaraan otomatis.

Memilih layanan cloud computing akan memberi Anda kemungkinan untuk mengakses sumber daya pihak ketiga alih-alih menggunakan infrastruktur Anda. Dengan cloud, Anda memiliki kemungkinan yang hampir tak terbatas untuk menaikkan dan menurunkan skala tanpa harus berinvestasi di server dan perangkat keras lainnya. Vendor cloud juga bertanggung jawab untuk memelihara dan mengamankan infrastruktur.

Jika Anda bekerja di industri perawatan kesehatan, Anda dapat membaca artikel kami tentang komputasi awan di sektor medis.

Tip #2: Gunakan load balancing

Jika Anda memutuskan untuk menskalakan secara horizontal, Anda perlu menerapkan perangkat lunak penyeimbang muatan untuk mendistribusikan permintaan masuk di antara semua perangkat yang mampu menanganinya dan memastikan tidak ada server yang kewalahan. Jika satu server mati, penyeimbang muatan akan mengalihkan lalu lintas server ke mesin daring lain yang dapat menangani permintaan ini.

Ketika node baru terhubung, secara otomatis akan menjadi bagian dari pengaturan dan akan mulai menerima permintaan juga.

Tip #3: Cache sebanyak yang Anda bisa

Cache digunakan untuk menyimpan konten statis dan hasil pra-perhitungan yang dapat diakses pengguna tanpa perlu melakukan penghitungan lagi.

Cache data sebanyak yang Anda bisa untuk mengambil beban dari database Anda. Konfigurasikan logika pemrosesan Anda sedemikian rupa sehingga data yang jarang diubah tetapi sering dibaca dapat diambil dari cache terdistribusi. Ini akan lebih cepat dan lebih murah daripada menanyakan database dengan setiap permintaan sederhana. Selain itu, ketika ada sesuatu yang tidak ada di dalam cache tetapi sering diakses, aplikasi Anda akan mengambilnya dan menyimpan hasilnya dalam cache.

Ini membawa masalah, seperti, seberapa sering Anda harus membatalkan cache, berapa kali data perlu diakses untuk disalin ke cache, dll.

Tip #4: Aktifkan akses melalui API

Pengguna akhir akan mengakses perangkat lunak Anda melalui berbagai klien, dan akan lebih nyaman untuk menawarkan antarmuka pemrograman aplikasi (API) yang dapat digunakan semua orang untuk terhubung. API seperti perantara yang memungkinkan dua aplikasi untuk berbicara. Pastikan Anda memperhitungkan jenis klien yang berbeda, termasuk ponsel cerdas, aplikasi desktop, dll.

Ingatlah bahwa API dapat memaparkan Anda pada kerentanan keamanan. Coba atasi ini sebelum terlambat. Anda dapat menggunakan gateway aman, autentikasi kuat, metode enkripsi, dan lainnya.

Tip #5: Manfaatkan pemrosesan asinkron

Proses asinkron adalah proses yang dapat menjalankan tugas di latar belakang. Klien tidak perlu menunggu hasilnya dan dapat mulai mengerjakan hal lain. Teknik ini memungkinkan skalabilitas perangkat lunak karena memungkinkan aplikasi menjalankan lebih banyak utas, memungkinkan node menjadi lebih terukur dan menangani lebih banyak beban. Dan jika tugas yang memakan waktu masuk, itu tidak akan memblokir ancaman eksekusi, dan aplikasi akan tetap dapat menangani tugas lain secara bersamaan.

Pemrosesan asinkron juga tentang menyebarkan proses ke dalam langkah-langkah ketika tidak perlu menunggu satu langkah diselesaikan sebelum memulai langkah berikutnya jika ini tidak penting untuk sistem. Pengaturan ini memungkinkan pendistribusian satu proses melalui beberapa utas eksekusi, yang juga memfasilitasi skalabilitas.

Pemrosesan asinkron dicapai pada level kode dan infrastruktur, sedangkan penanganan permintaan asinkron adalah level kode.

Tip #6: Pilih jenis database yang lebih mudah untuk diskalakan, jika memungkinkan

Beberapa database lebih mudah untuk diskalakan daripada yang lain. Misalnya, database NoSQL, seperti MongoDB, lebih terukur daripada SQL. MongoDB yang disebutkan di atas adalah open source, dan biasanya digunakan untuk analisis data besar secara real-time. Opsi NoSQL lainnya adalah Amazon DynamoDB dan Google Bigtable.

SQL bekerja dengan baik dalam hal penskalaan operasi baca, tetapi terhenti pada operasi tulis karena kesesuaiannya dengan prinsip ACID (atomisitas, konsistensi, isolasi, dan daya tahan). Jadi, jika prinsip-prinsip ini bukan perhatian utama, Anda dapat memilih NoSQL untuk penskalaan yang lebih mudah. Jika Anda perlu bergantung pada basis data relasional, untuk konsistensi atau masalah lainnya, masih mungkin untuk menskalakan menggunakan sharding dan teknik lainnya.

Kiat #7: Pilih layanan mikro daripada arsitektur monolit, jika ada

Arsitektur monolitik

Perangkat lunak monolitik dibangun sebagai satu unit yang menggabungkan operasi sisi klien dan sisi server, database, dll. Semuanya digabungkan dengan erat dan memiliki basis kode tunggal untuk semua fungsinya. Anda tidak bisa hanya memperbarui satu bagian tanpa memengaruhi aplikasi lainnya.

Perangkat lunak monolit dapat diskalakan, tetapi harus diskalakan secara holistik menggunakan pendekatan penskalaan vertikal, yang mahal dan tidak efisien. Jika Anda ingin memutakhirkan bagian tertentu, tidak ada jalan keluar dari membangun kembali dan menerapkan ulang seluruh aplikasi. Jadi, pilih monolitik jika solusi Anda tidak rumit dan hanya akan digunakan oleh sejumlah orang.

arsitektur layanan mikro

Layanan mikro lebih fleksibel daripada monolit. Aplikasi yang dirancang dengan gaya ini terdiri dari banyak komponen yang bekerja sama tetapi diterapkan secara mandiri. Setiap komponen menawarkan fungsi tertentu. Layanan yang merupakan satu aplikasi dapat memiliki tumpukan teknologi yang berbeda dan mengakses database yang berbeda. Misalnya, aplikasi eCommerce yang dibuat sebagai layanan mikro akan memiliki satu layanan untuk pencarian produk, satu lagi untuk profil pengguna, satu lagi untuk penanganan pesanan, dan seterusnya.

Komponen aplikasi layanan mikro dapat diskalakan secara independen tanpa membebani seluruh perangkat lunak. Jadi, jika Anda mencari solusi yang dapat diskalakan, layanan mikro adalah desain pilihan Anda. Skalabilitas perangkat lunak yang tinggi hanyalah salah satu dari banyak keuntungan yang dapat Anda peroleh dari arsitektur ini. Untuk informasi lebih lanjut, lihat artikel kami tentang manfaat layanan mikro.

Kiat #8: Pantau kinerja untuk menentukan waktu penskalaan

Setelah penerapan, Anda dapat memantau perangkat lunak untuk mengetahui tanda-tanda awal penurunan kinerja yang dapat diatasi dengan penskalaan. Ini memberi Anda kesempatan untuk bereaksi sebelum masalah meningkat. Misalnya, ketika Anda melihat bahwa memori hampir habis atau pesan sedang menunggu untuk diproses lebih lama dari batas yang ditentukan, ini merupakan indikasi bahwa perangkat lunak Anda berjalan sesuai kapasitasnya.

Untuk dapat mengidentifikasi ini dan masalah terkait skalabilitas perangkat lunak lainnya, Anda perlu menyematkan sistem pemantauan telemetri ke dalam aplikasi Anda selama fase pengkodean. Sistem ini akan memungkinkan Anda untuk melacak:

  • Waktu respons rata-rata
  • Throughput, yaitu jumlah permintaan yang diproses pada waktu tertentu
  • Jumlah pengguna bersamaan
  • Metrik kinerja database, seperti waktu respons kueri
  • Pemanfaatan sumber daya, seperti CPU, penggunaan memori, GPU
  • Tingkat kesalahan
  • Biaya per pengguna

Anda bisa mendapatkan keuntungan dari solusi pemantauan dan kerangka agregasi log yang ada, seperti Splunk. Jika perangkat lunak Anda berjalan di cloud, Anda dapat menggunakan solusi vendor cloud. Misalnya, Amazon menawarkan AWS CloudWatch untuk tujuan ini.

Contoh solusi perangkat lunak yang dapat diskalakan dari portofolio ITRex

Cermin kebugaran pintar dengan pelatih pribadi

Deskripsi Proyek

Klien ingin membangun cermin kebugaran dinding berukuran penuh yang akan membantu pengguna dengan rutinitas latihan mereka. Itu bisa memantau bentuk pengguna selama berolahraga, menghitung repetisi, dan banyak lagi. Sistem ini seharusnya menyertakan perangkat lunak yang memungkinkan pelatih membuat dan mengunggah video, dan pengguna merekam dan mengelola latihan mereka.

Apa yang kami lakukan untuk memastikan skalabilitas perangkat lunak

  • Kami memilih arsitektur layanan mikro
  • Menerapkan skalabilitas horizontal untuk distribusi beban. Node baru ditambahkan setiap kali ada terlalu banyak beban pada node yang sudah ada. Jadi, setiap kali penggunaan CPU melebihi 90% dari kapasitasnya dan bertahan di sana selama jangka waktu tertentu, node baru akan ditambahkan untuk meringankan beban.
  • Kami harus menyebarkan database relasional — yaitu, SQL dan PostgreSQL — untuk alasan arsitektural. Meskipun basis data relasional lebih sulit untuk diukur, masih ada beberapa pilihan. Pada awalnya, karena basis pengguna masih relatif kecil, kami memilih penskalaan vertikal. Jika audiens bertambah besar, kami berencana menerapkan pendekatan master-slave — mendistribusikan data ke beberapa database.
  • Sangat diuntungkan dari caching karena sistem ini berisi banyak informasi statis, seperti nama pelatih, judul latihan, dll.
  • Menggunakan RestAPI untuk pemrosesan permintaan asinkron antara aplikasi latihan dan server
  • Mengandalkan arsitektur tanpa server, seperti AWS Lambda, untuk jenis pemrosesan asinkron lainnya. Salah satu contohnya adalah pemrosesan video asinkron. Setelah pelatih memuat video latihan baru dan mengelompokkannya ke dalam latihan yang berbeda, mereka menekan "simpan", dan server mulai memproses video ini untuk streaming langsung HTTP untuk membuat empat versi video asli dengan resolusi berbeda. Pelatih dapat mengunggah video baru secara bersamaan.
  • Dalam contoh lain, sistem secara asinkron melakukan pemangkasan cerdas pada video pengguna untuk menghapus bagian mana pun yang tidak aktif oleh pengguna.

Sistem keamanan siber berbasis biometrik

Deskripsi Proyek

Klien ingin membangun platform keamanan siber yang memungkinkan bisnis mengautentikasi karyawan, kontraktor, dan pengguna lain berdasarkan biometrik, serta menghindari kata sandi dan PIN. Platform ini juga akan berisi alat video langsung untuk mengonfirmasi identitas pengguna dari jarak jauh.

Bagaimana kami memastikan perangkat lunak ini dapat diskalakan

  • Kami menggunakan arsitektur layanan mikro terdesentralisasi
  • Menerapkan tiga penyeimbang beban untuk mendistribusikan beban di antara layanan mikro yang berbeda
  • Beberapa bagian dari platform ini dapat diskalakan secara otomatis berdasarkan desain. Jika beban melampaui ambang tertentu, instance baru dari layanan mikro dibuat secara otomatis
  • Kami menggunakan enam database berbeda — empat PostgreSQL dan dua MongoDB. Basis data PostgreSQL diskalakan secara vertikal bila diperlukan. Saat merancang arsitektur, kami menyadari bahwa beberapa database harus lebih sering diskalakan, jadi kami mengadopsi MongoDB untuk tujuan itu, karena lebih mudah untuk diskalakan secara horizontal.
  • Menerapkan pemrosesan asinkron untuk pengalaman pengguna yang lebih baik. Misalnya, pasca-pemrosesan video dilakukan secara tidak sinkron.
  • Kami memilih algoritme pengenalan wajah penyedia layanan pihak ketiga. Jadi, kami memastikan untuk memilih solusi yang sudah dapat diskalakan dan memasukkannya ke dalam platform kami melalui API.

Tantangan yang mungkin Anda temui saat melakukan penskalaan

Jika Anda berniat untuk merencanakan skalabilitas perangkat lunak selama pengembangan aplikasi dan ingin menerapkan tips di atas, Anda masih dapat menghadapi tantangan berikut:

  • Akumulasi hutang teknis . Stakeholder proyek mungkin masih berusaha untuk mengesampingkan skalabilitas demi biaya yang lebih rendah, kecepatan, dll. Skalabilitas bukanlah persyaratan fungsional dan dapat dibayangi oleh karakteristik yang lebih nyata. Akibatnya, aplikasi akan menumpuk fitur teknis yang tidak kompatibel dengan skalabilitas.
  • Penskalaan dengan metodologi pengembangan Agile . Metodologi tangkas adalah tentang merangkul perubahan. Namun, ketika klien ingin menerapkan terlalu banyak perubahan terlalu sering, skalabilitas perangkat lunak dapat dikesampingkan demi mengakomodasi tuntutan perubahan.
  • Pengujian skalabilitas . Sulit untuk melakukan pengujian beban yang realistis. Katakanlah Anda ingin menguji bagaimana sistem akan berperilaku jika Anda meningkatkan ukuran database 10 kali lipat. Anda perlu menghasilkan data realistis dalam jumlah besar, yang cocok dengan karakteristik data asli Anda, lalu menghasilkan beban kerja realistis untuk penulisan dan pembacaan.
  • Skalabilitas layanan pihak ketiga . Pastikan penyedia layanan pihak ketiga Anda tidak membatasi skalabilitas. Saat memilih vendor teknologi, pastikan mereka dapat mendukung tingkat skalabilitas perangkat lunak yang diinginkan, dan integrasikan solusi mereka dengan benar.
  • Memahami penggunaan aplikasi Anda . Anda perlu memiliki pandangan yang kuat tentang bagaimana perangkat lunak Anda akan bekerja dan berapa banyak orang yang akan menggunakannya, yang jarang dapat diperkirakan secara tepat.
  • Pembatasan arsitektur . Terkadang Anda terbatas dalam pilihan arsitektur Anda. Misalnya, Anda mungkin perlu menggunakan database relasional dan harus berurusan dengan penskalaan baik secara horizontal maupun vertikal.
  • Memiliki bakat yang tepat . Untuk merancang solusi yang dapat diskalakan yang tidak akan membuat Anda pusing di masa mendatang, Anda memerlukan arsitek berpengalaman yang mengerjakan proyek serupa sebelumnya dan yang memahami skalabilitas perangkat lunak dari perspektif pengkodean dan infrastruktur. Di sini, di ITRex Group, kami telah mengerjakan banyak proyek dan selalu mengingat skalabilitas selama pengembangan perangkat lunak.

Untuk menyimpulkan

Kecuali jika Anda benar-benar yakin bahwa Anda tidak perlu melakukan penskalaan, pertimbangkan skalabilitas perangkat lunak pada tahap awal pengembangan dan lakukan tindakan pencegahan yang diperlukan. Bahkan jika Anda terbatas dalam pilihan arsitektur Anda dan tidak selalu dapat mengimplementasikan opsi yang paling dapat diskalakan, Anda masih akan tahu di mana hambatannya dan akan memiliki waktu untuk mempertimbangkan alternatif.

Membiarkan skalabilitas demi persyaratan fungsional lainnya akan menjadi bumerang. Pertama, perusahaan akan berjuang dengan penurunan kinerja. Butuh waktu terlalu lama untuk memproses permintaan. Pengguna akan mengalami penundaan yang tidak dapat diterima. Setelah semua ini, perusahaan akan menskalakan pembayaran dua kali lipat dan tiga kali lipat dari jumlah yang bisa dibelanjakan pada tahap sebelumnya.

Mempertimbangkan untuk menerapkan perangkat lunak perusahaan baru atau memperbarui sistem yang ada, tetapi khawatir itu tidak akan memenuhi kebutuhan bisnis yang berkembang pesat? Berhubungan! Kami akan memastikan perangkat lunak Anda tidak hanya memiliki semua fungsi yang diperlukan tetapi juga dapat ditingkatkan dengan investasi dan waktu henti yang minimal.


Awalnya diterbitkan di https://itrexgroup.com pada 24 Juli 2023.