做架构设计,难免有时候被人问及系统的瓶颈在哪,那首先来了解下什么是瓶颈?
打个形象 的比方,人的嘴巴可以吞下一整个面包,但是却咽不下去,因为食管不给力,它比较细,所以嘴巴能吞 下的食物大小要受到食管的粗细限制。
城市内部每天会产生几十万件跨城快递,可是跨城的交 通不给力,只允许走小型卡车,一卡车一次就能装几千件,一天下来也不一定能投送的完。
人 在一定时间内能咽下多少食物,货运公司在一天运送多少货物,物理上叫做吞吐量,系统整体的吞吐量 等于最小区域的吞吐量。
下面这张图能够反映:
土黄色管子的流量要受 到红色部分的制约。
服务器上也是这样,好一点的设计框架结合物理高配可以处理高达几十万 的并发,像土黄色的管子,可是偏偏有一些模块像图中红色的管子那样,一秒中只能同时处理几百次, 这样就严重拖慢了服务器的性能,成了瓶颈。
现实开发中有时可能会要加上数据库模块,如 mysql,虽然mysql号称每秒处理几十万的查询根本没问题,但那只是运算能力。
服务器连mysql 是要通过tcp网络的,有连接就需要时间,再加上数据量如果大点,自然就成了瓶颈。
相似的情 况,一些特殊的业务,比如加解密服务,密钥和随机数的产生依赖加密机,中间件的性能就是我们图中 的红管子。
有些开发还会涉及到跨网服务器查询,比如腾讯电商会调用QQ服务器的登录网关, 跨网查询的速度肯定没有本地执行的快。
系统架构的设计是争对业务的,业务里如果存在这些 红管子,就必须要有相应的解决办法。
不同人的处理方法不同,据我经验,可以将瓶颈子分成 两类:
1.阻塞串行处理
2.异步并行处理
mysql,中间件的处理属于第一类,异步 网关查询属于第二类。
对于第一类,一种通用的解决方法是增加处理进程,其实是横向扩容的 思想,打个比方,一个进程的并发是600,10个进程就可以达到6000了,如何才能将请求均匀地分配到 这10个进程是关键。
多个进程同时监听一个端口,负载均衡的方法很多,这里介绍nginx的做法 ,直接上代码:
//接收握手后连接 void ngx_event_accept(ngx_event_t *ev) { ... ngx_accept_disabled = ngx_cycle->connection_n / 8 - ngx_cycle->free_connection_n; ... } //事件模型处理函数 void ngx_process_events_and_timers(ngx_cycle_t *cycle) { ... if (ngx_use_accept_mutex) { if (ngx_accept_disabled > 0) { ngx_accept_disabled--; } else { if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) { return; } if (ngx_accept_mutex_held) { flags |= NGX_POST_EVENTS; } else { if (timer == NGX_TIMER_INFINITE || timer > ngx_accept_mutex_delay) { timer = ngx_accept_mutex_delay; } } } ... } //取得端口监听的锁 ngx_int_t ngx_trylock_accept_mutex(ngx_cycle_t *cycle) { ... if (ngx_enable_accept_events(cycle) == NGX_ERROR) { ngx_shmtx_unlock(&ngx_accept_mutex); return NGX_ERROR; } ... } //启动端口监听 static ngx_int_t ngx_enable_accept_events(ngx_cycle_t *cycle) { ngx_uint_t i; ngx_listening_t *ls; ngx_connection_t *c; ls = cycle->listening.elts; for (i = 0; i < cycle->listening.nelts; i++) { c = ls[i].connection; if (c->read->active) { continue; } if (ngx_event_flags & NGX_USE_RTSIG_EVENT) { if (ngx_add_conn(c) == NGX_ERROR) { return NGX_ERROR; } } else { if (ngx_add_event(c->read, NGX_READ_EVENT, 0) == NGX_ERROR) { return NGX_ERROR; } } } return NGX_OK; }
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索服务器
, 进程
, mysql 中间件
, 瓶颈
, 处理
, cycle
吞吐量
高并发服务器架构、大并发服务器架构、c高并发服务器架构、10万并发 服务器架构、java高并发服务器设计,以便于您获取更多的相关知识。