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

2014-04-04 23:25:23 +08:00
 yueyoum
客户端和服务器用http协议通信
所有请求都是post 打包好的二进制数据

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

现在要把构架修改为 这样

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

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

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

该如何做这个分发程序 ?

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

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

2 自己用 c/c++写

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

大家有什么看法?
5570 次点击
所在节点    程序员
21 条回复
9hills
2014-04-04 23:38:35 +08:00
你这个逻辑很简单。用高级语言很容易实现。

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

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

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

clients -> dispatch -> web servers

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

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

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

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

实际测试中可以看出还是nginx性能好,占内存低。
panlilu
2014-04-06 16:35:05 +08:00
nginx+lua 应该靠谱
hmaimi
2014-04-07 00:08:41 +08:00
我自己做的项目前段时间也有一个这样的需求,我用nginx_lua解决的
感觉效率很不错,编码成本也低
julyclyde
2014-04-07 11:01:20 +08:00
@yueyoum 在现代,想找个不支持cookie的浏览器还真难。实在不行还可以把sessionID放到querystring里。在body里加这个绝对是错误设计,将来会付出惨重代价

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/107318

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX