Di Rust, pemrograman asinkron mengandalkan konsep future untuk merepresentasikan operasi yang berpotensi berjalan lama dan mungkin tidak segera selesai. Future ini memerlukan mekanisme untuk mendorong eksekusi dan penyelesaiannya. Di sinilah pelaksana asinkron berperan.
Eksekutor asinkron bertanggung jawab untuk mengelola dan menjalankan future ini. API ini menyediakan lingkungan tempat future dapat dijadwalkan, dipantau progresnya, dan pada akhirnya diselesaikan. Anggap saja ini sebagai orchestrator yang menangani kompleksitas tugas asinkron, sehingga kode Anda tetap responsif dan efisien.
Rust menawarkan berbagai eksekutor asinkron, yang masing-masing memiliki kelebihan dan karakteristiknya sendiri.
Eksekutor asinkron
Pilihan executor untuk layanan Rust Anda sangat bergantung pada sifat workload-nya. Meskipun Tokio adalah runtime asinkron yang canggih, Tokio mungkin bukan solusi optimal untuk semua skenario.
Untuk layanan yang terutama menjalankan operasi berurutan, pengenalan runtime asinkron seperti Tokio dapat menimbulkan overhead yang tidak perlu tanpa memberikan peningkatan performa yang signifikan. Dalam kasus seperti ini, eksekutor ber-thread tunggal mungkin merupakan pilihan yang lebih sesuai dan ringan. Pendekatan ini menyederhanakan codebase dan mengurangi konsumsi resource.
Mengonfigurasi thread pekerja
Saat berurusan dengan layanan yang memiliki operasi serentak atau asinkron secara inheren, memanfaatkan kemampuan runtime asinkron seperti Tokio menjadi sangat penting. Untuk memaksimalkan performa dalam skenario ini, konfigurasi runtime untuk menggunakan sejumlah thread pekerja yang cocok dengan jumlah core CPU yang tersedia di sistem. Hal ini memungkinkan runtime mendistribusikan workload secara efisien dan memanfaatkan daya pemrosesan yang tersedia sepenuhnya.
Pertimbangkan lingkungan sistem secara keseluruhan saat mengonfigurasi thread pekerja. Jika beberapa layanan berjalan secara aktif di virtual machine yang sama, sesuaikan jumlah thread pekerja per layanan untuk mencegah penggunaan CPU yang berlebihan dan memastikan alokasi resource yang adil di antara semua proses aktif.
Operasi pemblokiran
Penting untuk memastikan bahwa thread pekerja dalam runtime asinkron tidak pernah diblokir oleh operasi sinkron atau yang berjalan lama. Memblokir thread pekerja dapat sangat menghambat kemampuan runtime untuk memproses tugas yang masuk dan mempertahankan responsivitas.
Jika fungsi yang dieksekusi pada thread pekerja perlu melakukan operasi pemblokiran, gunakan tokio::spawn_blocking. Fungsi ini memindahkan operasi pemblokiran ke kumpulan thread terpisah yang dirancang khusus untuk tugas semacam itu, sehingga mencegah gangguan pada thread pekerja asinkron dan memastikan responsivitas layanan secara keseluruhan.