惊群
2021-10-25 14:32:43 25 举报
牛逼立体 不填不行?
作者其他创作
大纲/内容
phpmemcache
每个accpet都会加入到worker的epollfd中,但是只有获取到共享锁的worker才会调用epoll_wait
本地memcache,减少网络io
创建listener创建epollfd
new connection
释放锁
apigateway
后台管理、中台、大数据
accept惊群
memcachenotify
如果高频发生数据变化,会发生啥?在还没notify更新删除其他节点的情况下,connection命中其他机器,读的确是老的缓存,从而造成惊群效应
4.同步给redis
db-cluster
子进程/线程共享listenersyscall.accpet
mutexlock共享锁获取锁的worker执行
2. 本地无缓存读redis
nginx惊群
golang中,只使用一个epoll对象的话,从使用侧就不需要担心
epoll惊群
像这种缓存架构,只适合低频数据改动,并允许有短暂数据不一致出现
epoll_wait获取就绪列表并处理
更新数据
失败继续获取
移除accpet之外的事件(会造成小范围惊群,其他worker获取锁并且有accept进入,会通知2个worker)
缓存惊群
我们之前阅读源码,golang为什么只有一个epoll对象?
6. 通知memcache其他节点删除
1. 命中机器a
5. 通知控制中心
内核
master
内核2.6之前,所有进程accept都会惊醒,但只有一个可以accept成功,其他返回EGAIN,造成不必要的损耗。
accpet该给哪个epoll???
主进程/线程创建 listener
redis-cluster
3. 本地无缓存读redis
并行通知控制中心
accpet
如何减少呢?1. 负载均衡策略,同样的请求,会固定绑定到同一台机器2. 数据版本记录,当控制中心收到数据更新请求时,附带数据版本,如果低于旧版本,不通知其他节点操作(网络不一定先发先得)。
nginx的问题和上面的说的是一致的,但是nginx又是多个epoll(不像go只有一个),那么nginx是如何解决的呢?
处理完成的事件,如果需要返回
0 条评论
回复 删除
下一页