librelist archives

« back to archive

mongrel2 hack

mongrel2 hack

From:
fengxq
Date:
2012-11-17 @ 09:24
协程:mongrel2是用协程而非线程,区别在于协程是自调度,而线程是他他调度 
(os),所以不能有阻塞,也不能有“大任务”。
链接管理:   Connection_task函数做BS的链接管理
数据承载:Connection_delivier_task函数做BS的数据承载。
HANDLER交互:Handler_task负责与BAMBOO交互

链接浏览器的是socket句柄fd,而链接BAMBOO的是conn_id, Register结构就是管 
理fd,conn_id,connection的
核心。


disconnect问题
    在handler.c 的Handler_task中,只有当handler(bamboo)向Connection发 
送信息时,如果
conn_id对应的fd已经关闭,才会向handler(bamboo)发送discnnect通知。不会把 
这个消息通知到bamboo


     与客户端的链接是在connection里面处理的,在Connection_task里面处理 
的,如果发现链接已经关闭,
就会先把对应的Connection_deliver_task关掉,然后再在register里面把这个链 
接销毁(这个过程很隐晦,
找了半天才找到执行路径,要通过状态机)。

所以在这儿调用Handler_notify_leave就可以让BAMBOO及时的知道链接已经断开了

哈哈。。


如果BAMBOO不能及时得到链接已经断开,而仍然使用这个链接来发消息,同时这个 
链接已经重用到另一个客户端,
当然,数据就发送到另外的用户哪儿了


问题:一个用户会不会同时对应多个connection_id?如果会,怎么解决同一用户的 
消息窜的问题