深夜失眠修改下答案,想说说题主说的只要控制gorountine数量的问题,我觉得就像sync.Pool一样,Pool中的数据在每次GC的时候都会清掉,所以不能用在一些需要保持连接的场景下,但是存在即合理,sync.Pool就是个临时对象池,可以减轻程序频繁创建对象的消耗,以减轻垃圾回收的压力,gorountine是不是也是一样呢,虽然起一个协程的开销很小,但是在极限情况下,合理复用总是没错的,这事儿还是得结合具体场景来选择,简单限制数量,开发起来快速,彻底池化,可以压榨极限性能。
可能有考虑不周的地方,只是晚上睡不着的一点思考
==========================
原回答:
先明确一些概念:
goroutine是如何调度的,这个需要去了解一下协程的 G-P-M 调度模型,网上已经有太多了,我就不多说了,官方给出的链接:
贴一个中文的比较易懂的链接吧
goroutinegoroutinegoroutineGo Schedulergorountine
下面来说说这个问题, Golang开发需要协程池么?
goroutine
net/httpServergoroutinegoroutine
gorountineDDOSgoroutinegoroutine
(歪一下,GC这事儿,可以看看这个)
这个时候!首先要做一些简单的,比如漏斗限流,限制客户端对某一行为的频率等等...
如果加上协程池会不会更好呢?
goroutine
使用协程池将让多余的请求进入排队状态,等待池中有空闲协程的时候来处理,这是模拟的I/O多路复用机制,贴一个原理:
这样就可以通过控制协程池的大小,来控制内存的消耗,让其在极端状态下,也尽可能的保证服务的可用性。
代码的话其他答案里写了有开源的,我就不写啦~
点个赞再走呗~