如何实现Go
的并发控制,浏览了一下hystrix
库的代码,看看别人是怎么实现的。
通过带有buffer
的channel
来实现的控制并发。因为channel
的特性是,当buffer
满了之后,程序会阻塞。设计上,分成2步:
- 初始化固定长度的
channel
,并用特定的对象将它塞满(推荐空对象)。 - 处理程序从
channel
中读取对象,读取到对象后,程序开始处理。处理完成后,重新将对象塞回channel
。
错误率/正常请求数量是怎么统计的呢?
对时间进行分片,比方说,500ms
作为一个时间分片。系统保存一个map
结构,key
表示具体的分片,value
表示处理成功的请求。在hystrix
中,key
是当前的时间戳。
如果我们要统计10s
内的正常请求数量,只需要对这个map
做过滤,过滤出10s
内的分片,把它们的值相加。当然,要及时清空旧的key
,避免map
数据量过大。
结合上一篇说的《频率控制》
,这一节引入了新的设计频率控制的想法。不仅仅可以通过ZSet
结构来设计,还可以通过Hash
,甚至是KV
也可以实现。
控制并发/请求错误率 有什么用呢?在微服务中,如果我们能通过请求的错误率,来调整并发,能很好的保护下游系统。