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

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

  •  
  •   yueyoum ·
    yueyoum · Apr 4, 2014 via Android · 6573 views
    This topic created in 4595 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
    9hills
    Apr 4, 2014 via iPad
    1
    你这个逻辑很简单。用高级语言很容易实现。

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

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

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

    clients -> dispatch -> web servers

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

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

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

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

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