De potentielle ulemper ved at bruge ubuffrede kanaler i en storstilet applikation omfatter:
1. Synkroniseringspunkter: Ubuffrede kanaler skaber synkroniseringspunkter, hvor goroutiner skal vente på, at hinanden fuldføres. Dette kan føre til sekventiel eksekvering, hvilket måske ikke er ønskeligt i en storstilet applikation, hvor parallelitet er afgørende[1][3][5].
2. Skjulte løbsbetingelser: Ubuffrede kanaler kan skjule løbsforhold, der ville forekomme med en bufferstørrelse større end nul. Det betyder, at hvis du skal øge bufferstørrelsen af præstationsmæssige årsager, skal du pludselig løse en masse raceforhold, som kan være en form for tech-gæld[1].
3. Blokering: Ubuffrede kanaler blokerer både afsender og modtager, indtil den anden side er klar. Dette kan føre til ydeevneproblemer, hvis modtageren er langsommere end afsenderen, eller hvis der er mange goroutiner, der konkurrerer om kanalen[2][3][5].
4. Begrænset skalerbarhed: Ubuffrede kanaler kan begrænse skalerbarheden af din applikation, fordi de skaber en flaskehals, hvor goroutiner skal vente på, at hinanden fuldføres. Dette kan føre til en situation, hvor applikationen ikke fuldt ud udnytter de tilgængelige CPU-ressourcer[1][3][5].
5. Kompleksitet: Ubuffrede kanaler kan tilføje kompleksitet til din applikation, fordi de kræver omhyggelig styring for at sikre, at goroutiner ikke blokeres på ubestemt tid. Dette kan føre til vanskeligere fejlfinding og vedligeholdelse[1][3][5].
6. Ydeevne: Ubuffrede kanaler kan påvirke ydeevnen, fordi de skaber ekstra overhead, så goroutiner kan vente på hinanden. Dette kan føre til langsommere svartider og reduceret gennemløb[2][3][5].
7. Fejlhåndtering: Ubuffrede kanaler kan gøre fejlhåndtering vanskeligere, fordi de kan føre til dødvande, hvis goroutiner ikke er korrekt synkroniseret. Dette kan føre til mere kompleks fejlhåndtering og debugging[1][3][5].
Sammenfattende, mens ubuffrede kanaler kan være nyttige i visse situationer, kan de også introducere betydelige ulemper i en storstilet applikation. Det er vigtigt nøje at overveje afvejningen og vælge den passende kanaltype baseret på de specifikke krav til din applikation.
Citater:[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/da/blogs/buffered-vs-unbuffered-channel-in-golang/
[5] https://notes.shichao.io/gopl/ch8/