请教亦春,关于nginx扩展和drizzle的问题

223 views
Skip to first unread message

珠珠

unread,
Oct 26, 2012, 5:28:38 AM10/26/12
to open...@googlegroups.com
亦春,你好
很惊艳与openresty 和nginx的性能,我准备设计一个类似msn的im系统,想要在web server上登录,然后将sessionid发送到im的服务器上,这样im服务器不必处理数据库操作。
由于刚刚接触openresty ,厚颜请教:这样的结构是否可以用 类似upstream的扩展来给im服务器发送信息,如发送后收到回复然后response http客户端,是否有现成的第三方扩展呢?
 
另外是否有关于 drizzle +lua 这方面简单的网站例子,这样能把握如何设计这样的网站,而我找到的都是一些片段代码,如access_by_lua 之类的,有点看不清。
 
再次感谢

珠珠

unread,
Oct 26, 2012, 5:30:48 AM10/26/12
to open...@googlegroups.com
其他大侠也请帮助,谢谢

smallfish

unread,
Oct 26, 2012, 5:31:58 AM10/26/12
to open...@googlegroups.com
建议先围观 ngx_drizzle 和 ngx_lua 官方文档,先尝试一下里面的小例子。包括可以手动尝试如何配置式的操作数据库,然后在ngx_lua中如何子请求的这些操作。

upstream扩展可以通过代码里配置,然后reload也可以达到:)

文档:
--


2012/10/26 珠珠 <zhuj...@gmail.com>

agentzh

unread,
Oct 26, 2012, 2:03:36 PM10/26/12
to open...@googlegroups.com
Hello!

2012/10/26 珠珠:


> 亦春,你好
> 很惊艳与openresty 和nginx的性能,我准备设计一个类似msn的im系统,想要在web
> server上登录,然后将sessionid发送到im的服务器上,这样im服务器不必处理数据库操作。
> 由于刚刚接触openresty ,厚颜请教:这样的结构是否可以用 类似upstream的扩展来给im服务器发送信息,如发送后收到回复然后response
> http客户端,是否有现成的第三方扩展呢?
>

可以参考老王同学的这两篇文章:

* 《Nginx与Lua》 http://huoding.com/2012/08/31/156
*《实现一个简单的服务端推方案》 http://huoding.com/2012/09/28/174

openresty.org 网站上也有不少示例和指向用户教程文章的链接:

http://openresty.org/

Best regards,
-agentzh

珠珠

unread,
Oct 29, 2012, 3:31:48 AM10/29/12
to open...@googlegroups.com
感谢2位,这2天学习了点,感觉结构上无法让所有的worker进程共用一条upstream的长连接,keepalive的长连接某一时刻也只能给一个前端http用户使用;不过适应这个构架很好

agentzh

unread,
Oct 29, 2012, 2:46:14 PM10/29/12
to open...@googlegroups.com
Hello!

2012/10/29 珠珠:
> 感谢2位,这2天学习了点,感觉结构上无法让所有的worker进程共用一条upstream的长连接,

从技术上讲,在目前的多进程模型下,通过 sendmsg
等机制来实现连接的跨进程共享,涉及的进程同步和通信开销还是比较大的(如果不是不可能的话)。几年前我和晓哲老师讨论的结果是暂不予尝试(因为很可能得不偿失)。

当然,我们也不会因此而切换到多 OS 线程模型下,因为又会引入很多新的问题,比如线程安全的问题、锁的问题,等等。

> keepalive的长连接某一时刻也只能给一个前端http用户使用;不过适应这个构架很好
>

你肯定不会希望看到一个 TCP 连接在一个时刻同时被多个客户端所读写。因为 TCP
连接是有状态的、面向流的,所以你真的那么做的话就意味着灾难。在那种情形下,你根本无法保证各个客户端的读写逻辑是彼此相对独立的 :)

Best regards,
-agentzh

珠珠

unread,
Oct 29, 2012, 10:28:06 PM10/29/12
to open...@googlegroups.com
开始我的设想是:整个webserver部分已有一条tcp连接到upstream,接着看到nginx是多进程的,设想每个进程1条tcp连接到upstream,不过确实实现起来可能得不偿失。
 
> keepalive的长连接某一时刻也只能给一个前端http用户使用;不过适应这个构架很好
>
这里我的意思是后台 upstream的那个长连接,我看ngx_http_upstream_keepalive_module 是用连接池的,如果只用一条upstream的长连接,势必要保存前端http连接socket,并将该信息关联,等upstream返回再找到前端http连接socket做回应。从效率上看,连接池也是十分高效的,所以我说改动后台服务器代码适应了这个也是很不错的。
以上是我现在的想法,也有可能对nginx upstream keepalive理解错误。

Simon

unread,
Oct 29, 2012, 11:08:54 PM10/29/12
to open...@googlegroups.com
http请求的socket信息必然需要存储,直到这个http请求结束。upstream的长连接是非阻塞的,一个http请求通过upstream发送给后端的服务器,如果服务器没有响应,那么这个upstrem会处理其他http请求。感觉并不需要修改你们的后端服务器,除非这个后端服务器只支持一个连接接入。

ngx-lua的cosocket功能可以完全替换upstream的功能,所以能写lua尽量写lua,写upstream就要用c了。


在 2012年10月30日星期二UTC+8上午10时28分06秒,珠珠写道:

agentzh

unread,
Oct 29, 2012, 11:51:35 PM10/29/12
to open...@googlegroups.com
Hello!

2012/10/29 珠珠:


>> keepalive的长连接某一时刻也只能给一个前端http用户使用;不过适应这个构架很好
>>
> 这里我的意思是后台 upstream的那个长连接,我看ngx_http_upstream_keepalive_module
> 是用连接池的,如果只用一条upstream的长连接,势必要保存前端http连接socket,并将该信息关联,等upstream返回再找到前端http连接socket做回应。从效率上看,连接池也是十分高效的,所以我说改动后台服务器代码适应了这个也是很不错的。
> 以上是我现在的想法,也有可能对nginx upstream keepalive理解错误。
>

虽然我对 ngx_http_upstream_keepalive_module 的实现非常熟悉并且据此实现了 ngx_lua 的
cosocket 连接池,但我仍然不能看懂你的意思,非常抱歉 :P

在 upstream_keepalive 和 ngx_lua cosocket
连接池的模型中,上游连接与下游连接都是多对多的关系,即使是在一个 OS 线程中(或者说在一个 nginx worker
进程中)。这里不存在任何形式的串行化。

当然,一个下游(http)请求可以同时发起多个并发的上游请求(对应多个上游连接),但不会出现多个下游请求同时使用一个上游连接。对于后者,需要自己实现串行化以解决并发访问的问题,而且这种串行化的模型一般效率奇差,因为上游的并发只有
1,所有的下游(并发)请求都要等待一个上游连接逐一地进行处理。

Best regards,
-agentzh

pengqi

unread,
Oct 30, 2012, 12:05:57 AM10/30/12
to open...@googlegroups.com
hi,

多个前端请求共用一个后端的连接,这需要自定义协议来实现,这样的实现有利于减少后端服务器的连接数,淘宝的tbnet库就支持,tair,tfs都使用了tbnet这个网络库,客服端可以在一条连接上同时处理多个请求。




--
Jinglong
Software Engineer
Server Platforms Team at Taobao

珠珠

unread,
Oct 30, 2012, 12:08:27 AM10/30/12
to open...@googlegroups.com
谢谢 Simon、亦春,看来我理解错误,我再努力学习学习。现在后端服务器同一类型最好一条连接,但修改也不难,所以开始时觉得这种server 2 server上没必要太多的连接,一条够了,同一时间几百几千甚至几万个前端http访问通过这一个socket连接到后台服务器。这种串行化的模型效率应该与解包的程度和方式有关,估计效率会差点,除非1对1时没有后续处理不解包直接转发,不然效率相差不多,后台一般也是基于epoll和多线程之类的。

agentzh

unread,
Oct 30, 2012, 12:36:25 AM10/30/12
to open...@googlegroups.com
Hello!

2012/10/29 pengqi:


> 多个前端请求共用一个后端的连接,这需要自定义协议来实现,这样的实现有利于减少后端服务器的连接数,淘宝的tbnet库就支持,tair,tfs都使用了tbnet这个网络库,客服端可以在一条连接上同时处理多个请求。
>

嗯,你描述的这种模型类似 DNS
协议那样需要对上游请求和上游响应自己进行类似编号和配对这样的处理,需要传输协议本身以及上游服务器端的特殊支持。目前,ngx_http_upstream
和 ngx_lua cosocket 都不支持定义这种模型。

这里在 ngx_lua cosocket 连接池一侧可以做得更好的一个地方是,当连接池空了的时候,可以让 connect()
调用排队等待某段(可配置的)时间,以便有新的空闲连接入池可供使用,而不是像现在这样直接创建新的连接。这样可以避免后端的连接数在前端的并发度瞬时提高时变得过大。晓哲和网易的一位工程师都曾经提到过这个问题。

Regards,
-agentzh

珠珠

unread,
Oct 30, 2012, 12:42:52 AM10/30/12
to open...@googlegroups.com


谢谢 jinglong、亦春

 

zeta...@gmail.com

unread,
Oct 17, 2014, 4:06:06 AM10/17/14
to open...@googlegroups.com
Hello!
老帖子发文,又惊扰各位了。 

这里在 ngx_lua cosocket 连接池一侧可以做得更好的一个地方是,当连接池空了的时候,可以让 connect()
调用排队等待某段(可配置的)时间,以便有新的空闲连接入池可供使用,而不是像现在这样直接创建新的连接。这样可以避免后端的连接数在前端的并发度瞬时提高时变得过大。晓哲和网易的一位工程师都曾经提到过这个问题。

避免后端的连接数并发度瞬时提高的问题,这个目前有相应解决方案了吗?

Yichun Zhang (agentzh)

unread,
Oct 17, 2014, 2:36:20 PM10/17/14
to openresty
Hello!
我有一个本地分支基本实现了 connect() 在超出活动连接数限制后的自动排队功能。不过这个分支对 connect() 和
set_keepalive() 的接口作了修改,即连接池的容量上限此后需要在 connect() 调用中指定,而非
set_keepalive() 中(通过第二个参数)。

我在把本地分支整理完成之后会提给社区 review. 在此之前,建议直接在 Lua 里对会产生上游访问的下游连接的并发度进行控制。

Regards,
-agentzh

魏泽涛

unread,
Oct 20, 2014, 4:44:48 AM10/20/14
to open...@googlegroups.com

向春哥致敬!期待ing


--
--
邮件来自列表“openresty”,专用于技术讨论!
订阅: 请发空白邮件到 openresty...@googlegroups.com

发言: 请发邮件到 open...@googlegroups.com
退订: 请发邮件至 openresty+...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages