Channel 没有buffer的,需要发送和接收的同时准备好,不然另一方就会阻塞住
可以用channel实现 future
Rate Limit 限流
不是限制并发量,而是限制请求的频率,比如一分钟可以处理10个,但是可能10个都是第一秒请求,就需要进行限制。可以通过token实现
Traps
golang都是传值的,slice 和 channel也是传值的,只不过复制了结构里面的指针
上图,第一个所有值都是一个,第二个才是正确的。
上图,第一个 会导致其他的go routine 泄露,因为用的无buffer的channel,其他的会阻塞
Recipes
-
Rate Limit 限流
-
Timeout/Circuit Break 熔断
-
number of Goroutine limit 不建议
close之后,channel所有的接收方会有广播的效果,上面的函数会立即返回true
但是对于父子协程这种复杂的树形关系,用context更好,另外context还可以实现传递消息
能不用锁,一定不要用锁
Disruptor框架
key points
-
continuous memory
使用连续的内存,CPU的catch机制,catch in line,64 byte,读的时候会读一个连续的64字节,
如果用list等非连续的,可能加载的并非是自己想用的,所以尽量用数组用连续存储空间
-
avoid of the high cost operations(memory allocation, GC)
slice是数组,但是每次重分配都会有GC和mem 碎片压力
-
Lock Free
-
Leverage modern CPU
Cache-line/False Share
Memory Barrier
使用大的mem+偏移量提高性能
视频链接:https://mp.weixin.qq.com/s/5r6VPoOlooMaL_baoVS2GA