V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
CzaOrz
V2EX  ›  Python

为什么线性增加集群量,却无法线性提升效率?

  •  
  •   CzaOrz ·
    czasg · 2020-01-11 22:51:10 +08:00 · 2434 次点击
    这是一个创建于 1560 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先说下单机器工作:

    以 Flask 为例:
    Flask 是基于 wsgi 协议搭建的 web 后端框架,协议部分由 werkzeug 实现。
    从 socket 角度来讲,就是底层开启有 socket 监听服务,服务端监听到请求后,与客户端建立 TCP 连接,从中读取并解析此次请求内容。
    werkzeug 再将其打包为 wsgi 协议可接收的形式,也就是传出来两个参数:environ 和 start_response, flask 的 web 应用就基于此实现业务逻辑。
    业务处理完,最后再由 werkzeug 中对应 socket 传回 HTTP 响应给客户端。
    在整个流程中,socket 是保持连接的,且一直占用一个线程资源。

    然后就是我对集群的想法:

    以 Nginx+uWSGI+Flask 为例,
    其中 nginx 主要作用就是反向代理、负载均衡。
    从 socket 角度讲,nginx 挂起监听服务,服务端监听到请求后,建立 TCP 连接。

    第一种想法:

    在整个 HTTP 请求过程中,socket 连接都还留在 nginx 所在的服务器中
    所谓反向代理,负载均衡,就是把解析出来的数据,先打包成 uwsgi 协议可接收的形式,再由 uWSGI 打包为 wsgi 协议可接收的形式,再分发给各个 web 应用进行业务处理。
    每一个 web 应用都有能力、有机会处理业务,这就是一种集群把。

    如果是我这样想的,那 nginx 实际上就是在分发数据
    那限制最高并发连接瓶颈的,不是就 nginx 所在的服务器了吗?
    所以线性增加集群量,也无法线性提高效率?

    第二种想法:

    是关于 websocket 长连接的疑惑
    websocket 集群,逻辑上我确实想不通..
    只要有调度者角色存在,长连接肯定还是在该角色所在机器上把?
    除非,调度者分发的不是数据,而是一个完整的"连接"...
    这个可以实现吗,不用 Location 重定向的那种


    ps**我知道最好的答案肯定就是手撕 nginx 源码了,但是功力不够啊...
    7 条回复    2020-01-13 20:45:55 +08:00
    billlee
        1
    billlee  
       2020-01-12 00:33:04 +08:00   ❤️ 1
    是的,规模大了以后 nginx 也可能成为瓶颈。但处理同样数量的并发,uwsgi 消耗的资源要比简单做转发的 nginx 多,所以一台 nginx 机器可以给多台 uwsgi 机器做均衡负载。
    规模更大的情况下,会在 nginx 前再加 LVS, 这个就只做网络层的转发,不做缓冲和协议转换了,还可以通过改包,让回包不经过 LVS.
    更大的规模下,网络链路都可能成为瓶颈了。这时就会从 anycast 和域名解析上做负载均衡了。
    helloworld000
        2
    helloworld000  
       2020-01-12 01:45:45 +08:00   ❤️ 1
    为什么线性增加集群量,却无法线性提升效率?

    内容太长没看,只回复标题内容:

    因为除了 performance bottlenecks 除了计算,还有 I/O ( bandwidth, memory, disk r/w )
    CzaOrz
        3
    CzaOrz  
    OP
       2020-01-12 08:49:53 +08:00
    @billlee 多谢,戳中我知识盲区了。
    cheng6563
        4
    cheng6563  
       2020-01-12 21:05:16 +08:00 via Android   ❤️ 1
    nginx 一般用作 7 层代理,撑不住了可以在前面加 4 层代理
    CzaOrz
        5
    CzaOrz  
    OP
       2020-01-12 21:23:08 +08:00
    @cheng6563 是的,学习了。
    wusatosi
        6
    wusatosi  
       2020-01-13 15:45:41 +08:00   ❤️ 1
    请 Google queue theory
    CzaOrz
        7
    CzaOrz  
    OP
       2020-01-13 20:45:55 +08:00
    @wusatosi 可以,又戳中我知识盲区了 0.0
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2851 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:14 · PVG 14:14 · LAX 23:14 · JFK 02:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.