V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yueyoum
V2EX  ›  程序员

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

  •  
  •   yueyoum ·
    yueyoum · 2014-04-04 23:25:23 +08:00 via Android · 5694 次点击
    这是一个创建于 3890 天前的主题,其中的信息可能已经有所发展或是发生改变。
    客户端和服务器用http协议通信
    所有请求都是post 打包好的二进制数据

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

    现在要把构架修改为 这样

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

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

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

    该如何做这个分发程序 ?

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

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

    2 自己用 c/c++写

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

    大家有什么看法?
    21 条回复    1970-01-01 08:00:00 +08:00
    9hills
        1
    9hills  
       2014-04-04 23:38:35 +08:00 via iPad
    你这个逻辑很简单。用高级语言很容易实现。

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

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

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

    clients -> dispatch -> web servers

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

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

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

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

    实际测试中可以看出还是nginx性能好,占内存低。
    panlilu
        18
    panlilu  
       2014-04-06 16:35:05 +08:00
    nginx+lua 应该靠谱
    hmaimi
        19
    hmaimi  
       2014-04-07 00:08:41 +08:00
    我自己做的项目前段时间也有一个这样的需求,我用nginx_lua解决的
    感觉效率很不错,编码成本也低
    julyclyde
        20
    julyclyde  
       2014-04-07 11:01:20 +08:00
    @yueyoum 在现代,想找个不支持cookie的浏览器还真难。实在不行还可以把sessionID放到querystring里。在body里加这个绝对是错误设计,将来会付出惨重代价
    halfbloodrock
        21
    halfbloodrock  
       2014-04-07 22:44:47 +08:00
    可能我理解不太准确, 但是从LZ说 "所有请求达到入口,入口解析发来的数据,根据消息本身或者解开的内容决定将这个请求转发给哪个后端 web server " 这个需求, 其实应该就是负载均衡的7层负载均衡.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3388 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:48 · PVG 19:48 · LAX 03:48 · JFK 06:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.