대규모 애플리케이션에서 버퍼링되지 않은 채널을 사용할 때 발생할 수 있는 잠재적인 단점은 다음과 같습니다.
1. 동기화 지점: 버퍼링되지 않은 채널은 고루틴이 서로 완료될 때까지 기다려야 하는 동기화 지점을 생성합니다. 이는 순차적 실행으로 이어질 수 있으며, 이는 병렬성이 필수적인 대규모 애플리케이션에서는 바람직하지 않을 수 있습니다[1][3][5].
2. 숨겨진 경쟁 조건: 버퍼링되지 않은 채널은 버퍼 크기가 0보다 큰 경우 발생할 수 있는 경쟁 조건을 숨길 수 있습니다. 이는 성능상의 이유로 버퍼 크기를 늘려야 하는 경우 기술 부채의 한 형태일 수 있는 여러 경쟁 조건을 갑자기 해결해야 함을 의미합니다[1].
3. 차단: 버퍼링되지 않은 채널은 상대방이 준비될 때까지 발신자와 수신자를 모두 차단합니다. 이로 인해 수신자가 발신자보다 느리거나 채널[2][3][5]을 놓고 경쟁하는 고루틴이 많은 경우 성능 문제가 발생할 수 있습니다.
4. 제한된 확장성: 버퍼링되지 않은 채널은 고루틴이 서로 완료될 때까지 기다려야 하는 병목 현상을 일으키기 때문에 애플리케이션의 확장성을 제한할 수 있습니다. 이로 인해 애플리케이션이 사용 가능한 CPU 리소스를 완전히 활용하지 못하는 상황이 발생할 수 있습니다[1][3][5].
5. 복잡성: 버퍼링되지 않은 채널은 고루틴이 무기한 차단되지 않도록 주의 깊은 관리가 필요하기 때문에 애플리케이션에 복잡성을 추가할 수 있습니다. 이로 인해 디버깅 및 유지 관리가 더 어려워질 수 있습니다[1][3][5].
6. 성능: 버퍼링되지 않은 채널은 고루틴이 서로를 기다리도록 추가 오버헤드를 생성하므로 성능에 영향을 미칠 수 있습니다. 이로 인해 응답 시간이 느려지고 처리량이 감소할 수 있습니다[2][3][5].
7. 오류 처리: 버퍼링되지 않은 채널은 고루틴이 제대로 동기화되지 않으면 교착 상태가 발생할 수 있으므로 오류 처리를 더 어렵게 만들 수 있습니다. 이로 인해 오류 처리 및 디버깅이 더 복잡해질 수 있습니다[1][3][5].
요약하자면, 버퍼링되지 않은 채널은 특정 상황에서 유용할 수 있지만 대규모 애플리케이션에서는 심각한 단점을 초래할 수도 있습니다. 장단점을 신중하게 고려하고 애플리케이션의 특정 요구 사항에 따라 적절한 채널 유형을 선택하는 것이 중요합니다.
인용:[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/