确实有很多代码重复,与request无关的代码可以直接移植,与request相关的代码比较麻烦。可以考虑把请求无关的代码独立成小模块,这样tcp也可以作为一个模块,和http共用一些基础设施。貌似春哥之前考虑过拆分ngx-lua模块的吧?
这两天在考虑收敛连接的问题,无论是upstream keepalive还是cosocket,每个请求都会对应一个后端连接,所以碰到海量push的情况,即使协议上支持,ngx用于后端连接的端口也会不够用。前面有个帖子讨论过,一时找不到了。收敛连接还有个好处就是适合用于做数据库代理。
想了两个方案,感觉都不是太好:
1. 另外起进程用于和后端服务器通信,通过share mem在lua之间传递数据
2. 在worker启动的时候运行一个lua,用于连接后端服务器;在这个lua和请求处理的lua之间,通过两个队列,完成生产者和消费者的处理模型。
在 2012年12月2日星期日UTC+8上午4时10分04秒,agentzh写道:
Hello!2012/11/14 Simon:
> https://github.com/bigplum/nginx-tcp-lua-module
>
> 移植了很多ngx-lua模块的代码,接口和api基本上原封不动抄过来,lua-resty-redis模块可以直接运行。
>
> 简单写了一个redis-proxy测试了下性能,单进程处理能力总体上约比redis降低了60%左右,不过nginx强在有多进程,做redis
> sharding还是没问题。想来做mysql-proxy应该也没问题。
>
哈哈!没想到你这么快就搞定原型实现了!热烈祝贺!
> 移植过程还是挺happy的,很多代码拷贝过来改改就能用,哈哈
>
呵呵,真好 :)
后面我找时间看看能否把你的工作融合回 ngx_http_lua_module,希望二者之间能复用尽可能多的代码,以避免同时维护两份非常相近的代码之苦,呵呵。
Thanks!
-agentzh