• 请不要在回答技术问题时复制粘贴 AI 生成的内容
yueyoum
V2EX  ›  程序员

如何实现一个高性能的 http 请求分发服务

  •  
  •   yueyoum ·
    yueyoum · Apr 4, 2014 via Android · 6241 views
    This topic created in 4442 days ago, the information mentioned may be changed or developed.
    客户端和服务器用http协议通信
    所有请求都是post 打包好的二进制数据

    目前开发的时候就是一个web server

    现在要把构架修改为 这样

    所有请求达到入口,入口解析发来的数据,根据消息本身或者解开的内容决定将这个请求转发给哪个后端 web server

    也就是 以前只有一个 web server ,现在有多个,并且在前端有个 dispatch来分发请求

    所以就要求 这个 分发程序的性能要足够高。
    因为要解开发来的二进制数据,判断,转发,接收后端web server的返回,最后再发回客户端

    该如何做这个分发程序 ?

    我现在有两个思路
    1 nginx + lua

    但这种方法是否可行 还没实验过

    2 自己用 c/c++写

    肯定可行 但就是要花点时间

    大家有什么看法?
    21 replies    1970-01-01 08:00:00 +08:00
    9hills
        1
    9hills  
       Apr 4, 2014 via iPad
    你这个逻辑很简单。用高级语言很容易实现。

    做个原型,然后性能测试比对。建议用Golang
    G2bN4dbX9J3ncp0r
        2
    G2bN4dbX9J3ncp0r  
       Apr 4, 2014
    nginx 不是自带负载均衡吗?后端可以用riak
    ETiV
        3
    ETiV  
       Apr 4, 2014 via iPhone
    请求分发的判定条件写在 http 头里,就不用从二进制里解一次了
    aszxqw
        4
    aszxqw  
       Apr 4, 2014
    要高性能的话,思路2其实还好,c/c++使用libevent应该还不错。libevent连http协议解析的东西也帮你做好了。

    目测似乎nodejs非常满足你的需求吧。
    raptor
        5
    raptor  
       Apr 5, 2014
    用C/C++写个nginx扩展模块应该不错
    luckyduck
        6
    luckyduck  
       Apr 5, 2014
    这个性能更好吧~
    http://haproxy.1wt.eu/
    Comdex
        7
    Comdex  
       Apr 5, 2014 via Android
    golang应该可以吧
    Actrace
        8
    Actrace  
       Apr 5, 2014
    nginx就可以了
    pubby
        9
    pubby  
       Apr 5, 2014
    不太清楚“解二进制”的计算量。

    可以先用熟悉的技术写一个dispatch测试一下

    clients -> dispatch -> web servers

    如果一个dispatch不够,就部署多个

    clients -> nginx -> dispatch(s) -> web servers
    roricon
        10
    roricon  
       Apr 5, 2014
    @ETiV 同意这条,如果要decode stream,效率怎么都不会太高……
    真不如把特征放在http header种。
    guotie
        11
    guotie  
       Apr 5, 2014
    golang, 几百行代码就搞定了
    missdeer
        12
    missdeer  
       Apr 5, 2014
    用C++不如用golang
    yakczh
        13
    yakczh  
       Apr 5, 2014   ❤️ 1
    第一次给客户端写个cookie,下次请求过来直接取出http头,做相应的转发,用nodejs就几行代码就搞定了 这种场景应该才是nodejs能派上用场的地方,可惜很多人都在用nodejs在那里绕圈圈地查数据库写数据库 只是为了证明"我能,我行"
    julyclyde
        14
    julyclyde  
       Apr 5, 2014
    这个设计是错的
    往哪儿分发应该纯粹由URL决定,而不涉及body
    yueyoum
        15
    yueyoum  
    OP
       Apr 5, 2014 via Android
    回ls各位,其实这是一个手游项目,通信用了http协议。 server会生成一个game session 给 client 。client 只要带着这个session 就行。一切对 client都是透明的,并且万一客户端不接受cookie 那怎么办?
    所以放弃 cookie headers 的方式

    nodejs 我看看
    cnbuff410
        16
    cnbuff410  
       Apr 6, 2014 via Android
    你要想开发快,性能足够高,那就上Go吧
    leofml
        17
    leofml  
       Apr 6, 2014 via iPad
    这种需求我也做过类似的,用go或者nodejs或者nginx实现起来其实基本不难。

    用nginx+lua其实就是使用ngx.capture做一个子请求就能搞定。

    实际测试中可以看出还是nginx性能好,占内存低。
    panlilu
        18
    panlilu  
       Apr 6, 2014
    nginx+lua 应该靠谱
    hmaimi
        19
    hmaimi  
       Apr 7, 2014
    我自己做的项目前段时间也有一个这样的需求,我用nginx_lua解决的
    感觉效率很不错,编码成本也低
    julyclyde
        20
    julyclyde  
       Apr 7, 2014
    @yueyoum 在现代,想找个不支持cookie的浏览器还真难。实在不行还可以把sessionID放到querystring里。在body里加这个绝对是错误设计,将来会付出惨重代价
    halfbloodrock
        21
    halfbloodrock  
       Apr 7, 2014
    可能我理解不太准确, 但是从LZ说 "所有请求达到入口,入口解析发来的数据,根据消息本身或者解开的内容决定将这个请求转发给哪个后端 web server " 这个需求, 其实应该就是负载均衡的7层负载均衡.
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5871 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 93c8b4a0 · 58ms · UTC 06:31 · PVG 14:31 · LAX 23:31 · JFK 02:31
    ♥ Do have faith in what you're doing.