软件开发的惊群

2020-07-11  本文已影响0人  追梦人在路上不断追寻

现在的web开发中,高并发已经成了标配,即使你是一个小应用,你也需要考虑性能问题,相比较加多台服务器,从软件架构上解决大流量是很划算的。

惊群效应(thundering herd)是指多进程(多线程)在同时阻塞等待同一个事件的时候(休眠状态),如果等待的这个事件发生,那么他就会唤醒等待的所有进程(或者线程),但是最终却只能有一个进程(线程)获得这个时间的“控制权”,对该事件进行处理,而其他进程(线程)获取“控制权”失败,只能重新进入休眠状态,这种现象和性能浪费就叫做惊群效应。

所有的工作进程都在等待一个socket,当socket客户端连接时,所有工作线程都被唤醒,但最终有且仅有一个工作线程去处理该连接,其他进程又要进入睡眠状态。

Nginx通过控制争抢处理socket的进程数量和抢占ngx_accept_mutex锁解决惊群现象。只有一个ngx_accept_mutex锁,谁拿到锁,谁处理该socket的请求。

缓存:将一些经常访问的资源保存到可以快速访问的介质里面,比如内存等

对于高并发,我们会想到redis做缓存,可以避免请求直接访问数据库,这样可以确保我们的服务器不会崩溃掉。

但是有这样一种情况,假设某一个时刻某个缓存失效了,但是却有很多请求请求它,因为没有命中缓存,将会导致所有的请求直接访问数据库,就会导致数据库挂掉。

面对这样的情况,我们可以通过设置锁来解决,或者在redis设置标识位来解决,某一时刻只有一个请求可以访问数据库,其它请求等待这个请求更新缓存即可,虽然会增加返回时间,但是我们的数据库不会崩掉。

上一篇下一篇

猜你喜欢

热点阅读