一个长链接的不同协议转换的proxy,用openresty写该如何架构?

598 views
Skip to first unread message

roger

unread,
Oct 28, 2015, 12:30:23 PM10/28/15
to openresty
原系统S是一个tcp长链接服务器, 有专有协议p
现在有新的客户端, 以websocket协议对外沟通的,
现在新客户端C, 想和S沟通, 
设想是用openresty开发一个websocket协议到专用协议P的 转发程序

初步想了一下, 不知道应该是用openresty 的lua-resty-websocket来实现, 
还是upsteam的途径去实现.

注, 没用过openresty写过代码, 只对其有一点了解.

YuanSheng Wang

unread,
Oct 28, 2015, 8:02:04 PM10/28/15
to open...@googlegroups.com
nginx的会话资源回收都是在这个请求完毕的时候集体释放的。所以对于基于 nginx + lua 的 openresty ,目前还不适合在一次会话中有大量、反复的子请求使用。

还好的是 openresty 准备近期解决反复使用 cosocket 占用过多 pool 内存的问题。

实现方向上个人推荐 lua-resty-websocket ,更为灵活容易控制。

@agentzh 准备在近期实现纯净的 nginx lua stream 操作 api,用这套API实现,资源占用更小。


--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com
发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
归档: http://groups.google.com/group/openresty
官网: http://openresty.org/
仓库: https://github.com/agentzh/ngx_openresty
教程: http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html



--

DeJiang Zhu

unread,
Oct 28, 2015, 9:25:05 PM10/28/15
to open...@googlegroups.com
Hello,

在 2015年10月29日 上午12:30,roger <feihu...@gmail.com>写道:
原系统S是一个tcp长链接服务器, 有专有协议p
现在有新的客户端, 以websocket协议对外沟通的,
现在新客户端C, 想和S沟通, 
设想是用openresty开发一个websocket协议到专用协议P的 转发程序

你说的应该是这个意思吧?

C   (1. websocket) ==>  OpenResty   (2. 专有协议 p) ===>  S

如果是,那么
1. websocket 用 lua-resty-websocket 是很合适的
2. 专有协议 p,需要你用 cosocket 来实现
3. 中间的转换逻辑,就要根据两端具体的协议来实现了(如果协议不复杂的话,应该也比较简单)

如果是这样的话,一个 websocket 长连接,一个 cosocket 长连接 就可以完成一次会话
 

初步想了一下, 不知道应该是用openresty 的lua-resty-websocket来实现, 
还是upsteam的途径去实现.

以我的理解,不太明白 upstream 的实现方式,如果是需要开发 C module 的话,还是上面一种要简单得多 :)

DeJiang Zhu

unread,
Oct 28, 2015, 9:34:30 PM10/28/15
to open...@googlegroups.com
hello,院生

哈哈,看来我跟你的理解还不大一样 :)

在 2015年10月29日 上午8:00,YuanSheng Wang <yuan...@iresty.org>写道:
nginx的会话资源回收都是在这个请求完毕的时候集体释放的。所以对于基于 nginx + lua 的 openresty ,目前还不适合在一次会话中有大量、反复的子请求使用。

我的理解里,两边都是长连接,并不需要子请求呢
 

还好的是 openresty 准备近期解决反复使用 cosocket 占用过多 pool 内存的问题。

如果私有协议也是长连接的话,那么就一次会话,一个长连接

同一个 cosocket 反复使用带来的问题倒是不大:
也就是 socket 的 buffer 都是在 request pool 里申请的,而 buffer 是可以复用的,所以问题不大
如果是反复 connect, 那就是另外一回事了

YuanSheng Wang

unread,
Oct 29, 2015, 12:06:19 AM10/29/15
to open...@googlegroups.com
也就是 socket 的 buffer 都是在 request pool 里申请的,而 buffer 是可以复用的,所以问题不大

这个我还真的需要看看代码了,我一直以为是每次都是新申请buffer。 多谢。

roger

unread,
Oct 29, 2015, 1:08:51 AM10/29/15
to openresty
非常感谢各位高手解惑


On Thursday, October 29, 2015 at 9:25:05 AM UTC+8, doujiang wrote:
Hello,

在 2015年10月29日 上午12:30,roger <feihu...@gmail.com>写道:
原系统S是一个tcp长链接服务器, 有专有协议p
现在有新的客户端, 以websocket协议对外沟通的,
现在新客户端C, 想和S沟通, 
设想是用openresty开发一个websocket协议到专用协议P的 转发程序

你说的应该是这个意思吧?

C   (1. websocket) ==>  OpenResty   (2. 专有协议 p) ===>  S

如果是,那么
1. websocket 用 lua-resty-websocket 是很合适的
2. 专有协议 p,需要你用 cosocket 来实现
3. 中间的转换逻辑,就要根据两端具体的协议来实现了(如果协议不复杂的话,应该也比较简单)

如果是这样的话,一个 websocket 长连接,一个 cosocket 长连接 就可以完成一次会话

是的, 就是你图示中的这个意思, 可能是我表述的不是很清楚, 两段都是长连接, 
 

初步想了一下, 不知道应该是用openresty 的lua-resty-websocket来实现, 
还是upsteam的途径去实现.

以我的理解,不太明白 upstream 的实现方式,如果是需要开发 C module 的话,还是上面一种要简单得多 :)
 
哦, 我以为openresty可以去操作upstream的, 那可能是我理解它的问题了,
没想到用C module去开发了(那样自己独立写一个更方便了, golang什么的) 

roger

unread,
Oct 29, 2015, 1:09:39 AM10/29/15
to openresty


On Thursday, October 29, 2015 at 9:34:30 AM UTC+8, doujiang wrote:
hello,院生

哈哈,看来我跟你的理解还不大一样 :)
 
在 2015年10月29日 上午8:00,YuanSheng Wang <yuan...@iresty.org>写道:
nginx的会话资源回收都是在这个请求完毕的时候集体释放的。所以对于基于 nginx + lua 的 openresty ,目前还不适合在一次会话中有大量、反复的子请求使用。

我的理解里,两边都是长连接,并不需要子请求呢
 

还好的是 openresty 准备近期解决反复使用 cosocket 占用过多 pool 内存的问题。

如果私有协议也是长连接的话,那么就一次会话,一个长连接

这个是我没说清楚, 两端都是长连接的.

DeJiang Zhu

unread,
Oct 29, 2015, 6:34:26 AM10/29/15
to open...@googlegroups.com
Hello,院生

在 2015年10月29日 下午12:05,YuanSheng Wang <yuan...@iresty.org>写道:
也就是 socket 的 buffer 都是在 request pool 里申请的,而 buffer 是可以复用的,所以问题不大

这个我还真的需要看看代码了,我一直以为是每次都是新申请buffer。 多谢。

非常抱歉,我是记错了

一般情况都能在 buffer 里搞定,但是当要返回的数据不在一个 buffer 内时,就需要创建一块临时内存,如果恰好这个内存不够大,没有超过 request_pool_size 就会空置(nginx 会提前释放大内存)

YuanSheng Wang

unread,
Oct 29, 2015, 6:55:18 AM10/29/15
to open...@googlegroups.com
非常抱歉,我是记错了

> 一般情况都能在 buffer 里搞定,但是当要返回的数据不在一个 buffer 内时,就需要创建一块临时内存,如果恰好这个内存不够大,没有超过 request_pool_size 就会空置(nginx 会提前释放大内存)


感谢感谢,已经在看源码,对这块我一直有点底气不足,先仔细看看,有问题再请教。

Reply all
Reply to author
Forward
0 new messages