V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
banxi1988
V2EX  ›  程序员

OpenResty + Lua VS Nginx + Go ?

  •  
  •   banxi1988 ·
    banxi1988 · 2019-01-18 21:37:35 +08:00 · 6514 次点击
    这是一个创建于 2171 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,最近最两个高并发的组合在我脑海中打转。

    背景

    1. 应用后端主要是 Django 来实现的。
    2. 其中一个 API 接口的请求频率比较高,主要是一些计数统计写缓存加一点点数据库查询。 考虑到这个 API 压力比较大,考虑进行优化。

    方案 1:OpenResty + lua

    其实这种方案我感觉比较 Hack 不怎么优雅。怎么说呢? openresty 内置的 resty-redis 等库 + ngx.capture 基本可以解决需求。但是通过 rewrite_by_lua_file 这样。开发调试体验并不太好。

    方案 2:Nginx + Go

    Go 语言以高并发高性能著称。

    比较

    1. 开发体验,Go 完爆 resty + Lua。
    2. 生态及工程化, 显然 Go 也胜出。
    3. 性能上 resty+lua 稍微胜出。

    我算是后端新人,基本没有大型网站架构经验 ,希望能得到各位的见解。

    17 条回复    2019-01-19 14:48:41 +08:00
    lhx2008
        1
    lhx2008  
       2019-01-18 21:40:30 +08:00   ❤️ 1
    先看看现有程序为什么慢,Python 慢是不是 IO 有问题?能不能搞异步 IO ?
    fengjianxinghun
        2
    fengjianxinghun  
       2019-01-18 22:02:32 +08:00 via iPhone   ❤️ 1
    openresty+lua 然后 luaffi 调用编译成 shared 库的 go 满足你的所有问题
    Vegetable
        3
    Vegetable  
       2019-01-18 22:07:53 +08:00   ❤️ 1
    怎么说呢,个人看法.
    Django 你们如果不打算一直用下去,那就早早切到 go 那边,少走点弯路.
    如果近期没那个打算,可以考虑写个 lib 给 python 用,很多语言都行比如 GO.一样能解决眼下的问题,不要把系统搞太复杂.
    LukeChien
        4
    LukeChien  
       2019-01-18 22:50:30 +08:00 via Android
    这个可以用 nodejs 试试
    misaka19000
        5
    misaka19000  
       2019-01-18 22:56:45 +08:00
    不知道你的并发量高指的是有多高哈,我们用 Python 开发的项目 qps1000 左右完全没有压力。。。

    当然如果高指的是特别高那当我没说
    dongqihong
        6
    dongqihong  
       2019-01-18 23:15:34 +08:00
    Don ’ t make claims about performance without measurements

    先确定瓶颈在哪儿,最好的解决方案也就呼之欲出了
    junbaor
        7
    junbaor  
       2019-01-18 23:24:23 +08:00
    高并发比较模糊,得说你想支撑多大量
    kran
        8
    kran  
       2019-01-18 23:36:40 +08:00 via Android
    先用现有技术栈解决问题。
    有一句话怎么说,如无必要…
    cloudyplain
        9
    cloudyplain  
       2019-01-19 08:02:10 +08:00
    开发效率 python > openResty > go
    性能 go >= openResty >> python
    生态 python > go > openResty
    如果不打算更换 python,只是实现简单高性能的 api,openResty 可以算是比较好的选择,至于其他方面需要自己找平衡点。
    pathbox
        10
    pathbox  
       2019-01-19 08:22:50 +08:00 via iPhone
    真要改,我觉得 go,Nginx 就够你用了
    hujianxin
        11
    hujianxin  
       2019-01-19 09:32:42 +08:00
    @cloudyplain openresty 开发效率比 go 还高?
    lihongjie0209
        12
    lihongjie0209  
       2019-01-19 10:09:45 +08:00   ❤️ 1
    你的并发量到什么程度才让你决定你的程序已经到极限了, 只能优化 nginx ??

    异步写尝试过吗? 多线程? 消息队列? 内存数据库?


    你直接优化 nginx, 程序逻辑分散到两处, debug 和维护的时候都是坑
    KgM4gLtF0shViDH3
        13
    KgM4gLtF0shViDH3  
       2019-01-19 11:21:17 +08:00 via iPhone
    要高并发为啥用 django
    szq8014
        14
    szq8014  
       2019-01-19 12:23:16 +08:00   ❤️ 1
    @lihongjie0209 现在太多程序员谈程序必谈并发,甚至程序还没写出来就开始想遇到高并发怎么办,我甚至在怀疑真的需要这么高并发么,先快速写个“低并发”初版出来再迭代。。不要纠结语言么,nodejs, java , python 都是可以优化的,但是要记住“过早的优化是万恶之源”
    lihongjie0209
        15
    lihongjie0209  
       2019-01-19 13:02:57 +08:00
    @szq8014 对的
    byteli
        16
    byteli  
       2019-01-19 13:41:55 +08:00 via Android
    过早优化是万恶之源。先 profile 找到原因。cpu 硬盘 带宽 io,总有一个是限制,web 的一般都在 io
    msg7086
        17
    msg7086  
       2019-01-19 14:48:41 +08:00
    所以你是问 Nginx + Lua 和 Nginx + Go 哪个好?

    Nginx 你准备怎么连接 Go 呢? FastCGI 或者 HTTP Proxy 么?考虑过这之间的开销么。Lua 是进程内部执行的,少个进程间通信开销还有协议序列化之类的开销。

    另外做开发的话还要考虑后期招人维护的成本。能不能招到 Lua 和 Go 的程序员也是一个问题,建议从多方面考虑。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1002 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 23:24 · PVG 07:24 · LAX 15:24 · JFK 18:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.