Potensi kelemahan penggunaan saluran tanpa buffer pada aplikasi skala besar meliputi:
1. Titik Sinkronisasi: Saluran tanpa buffer membuat titik sinkronisasi di mana goroutine harus menunggu satu sama lain hingga selesai. Hal ini dapat menyebabkan eksekusi berurutan, yang mungkin tidak diinginkan dalam aplikasi berskala besar yang memerlukan paralelisme.
2. Kondisi Balapan Tersembunyi: Saluran tanpa buffer dapat menyembunyikan kondisi balapan yang akan terjadi dengan ukuran buffer lebih besar dari nol. Artinya, jika Anda perlu meningkatkan ukuran buffer karena alasan performa, Anda tiba-tiba harus menyelesaikan sejumlah kondisi balapan, yang dapat menjadi bentuk utang teknologi[1].
3. Pemblokiran: Saluran tanpa buffer memblokir pengirim dan penerima hingga pihak lain siap. Hal ini dapat menyebabkan masalah kinerja jika penerima lebih lambat dari pengirim atau jika ada banyak goroutine yang bersaing untuk mendapatkan saluran tersebut[2][3][5].
4. Skalabilitas Terbatas: Saluran tanpa buffer dapat membatasi skalabilitas aplikasi Anda karena saluran tersebut menciptakan kemacetan di mana goroutine harus menunggu satu sama lain untuk selesai. Hal ini dapat menyebabkan situasi di mana aplikasi tidak sepenuhnya memanfaatkan sumber daya CPU yang tersedia[1][3][5].
5. Kompleksitas: Saluran tanpa buffer dapat menambah kompleksitas pada aplikasi Anda karena memerlukan pengelolaan yang hati-hati untuk memastikan bahwa goroutine tidak diblokir tanpa batas waktu. Hal ini dapat menyebabkan proses debug dan pemeliharaan menjadi lebih sulit [1] [3] [5].
6. Kinerja: Saluran tanpa buffer dapat memengaruhi kinerja karena saluran tersebut menimbulkan overhead tambahan bagi goroutine untuk menunggu satu sama lain. Hal ini dapat menyebabkan waktu respons lebih lambat dan mengurangi throughput [2] [3] [5].
7. Penanganan Kesalahan: Saluran tanpa buffer dapat membuat penanganan kesalahan menjadi lebih sulit karena dapat menyebabkan kebuntuan jika goroutine tidak disinkronkan dengan benar. Hal ini dapat menyebabkan penanganan kesalahan dan proses debug yang lebih kompleks [1] [3] [5].
Singkatnya, meskipun saluran tanpa buffer dapat berguna dalam situasi tertentu, saluran tersebut juga dapat menimbulkan kelemahan yang signifikan dalam aplikasi skala besar. Penting untuk mempertimbangkan secara hati-hati trade-off dan memilih jenis saluran yang sesuai berdasarkan kebutuhan spesifik aplikasi Anda.
Kutipan:[1] https://www.reddit.com/r/golang/comments/9cqcx4/help_understanding_the_use_cases_and_pitfalls_of/
[2] https://www.linkedin.com/pulse/buffered-unbuffered-channels-golang-lucas-schenkel-schieferdecker
[3] https://www.scaler.com/topics/golang/buffered-and-unbuffered-channel-in-golang/
[4] https://clavinjune.dev/en/blogs/buffered-vs-unbuffered-channel-in-golang/
[5] https://notes.shichao.io/gopl/ch8/