Comet (web技术)

http://zh.wikipedia.org/wiki/Comet_(web%E6%8A%80%E6%9C%AF)

维基百科,自由的百科全书

Comet是一种用于web的技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和流。

实现方式:

1.长轮询
长轮询是在打开一条连接以后保持,等待服务器推送来数据再关闭的方式。

2.iframe流
一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长链接,服务器向iframe传输数据(通常是HTML,内有负责插入信息的javascript),来实时更新页面。

 

基于python的Tornado Web Server来实现Server Side的Comet[http://simple-is-better.com/news/356]

 

1.写一个tornado程序,并运行

#!/usr/bin/env python
import tornado.httpserver
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous #说明1
    def get(self):
        some_async_func(callback=self.wait)

    def wait(self, result):
        if result:
            self.write(result)
            self.finish() #说明2
        else:
            tornado.ioloop.IOLoop.instance().add_timeout(time.time() + 0.5,lambda: some_async_func(callback=self.wait))
            #说明3

application = tornado.web.Application([
    (r"/", MainHandler),
])


if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(8999)
    tornado.ioloop.IOLoop.instance().start()

说明1:使用此decorator即可以把get方法non-blocking化
说明2:non-blocking化的请求必须调用self.finish()完成请求
说明3:如果需要sleep等待,应该使用Tornado的IOLoop的add_timeout方法。使用其他休眠方法如time.sleep会block住当前线程,而Tornado是一个单线程Server,会导致其他请求无法执行的问题。
此时执行comet.py,一个non-blocking的server端已经搭建成功。

要注意的问题是,如果不加超时机制,服务端会不断执行,即使客户端已经断开。因此还需自己实现超时机制。

 

2.可以结合Nginx做测试,配置如下:

 

upstream frontends {
    server 127.0.0.1:8999;
}

server {
    listen 8888;
    location / {
        proxy_read_timeout 1800;
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://frontends;
    }
}

此配置采用proxy upstream到backend的原因是方便upstream负载均衡,只需要upstream中添加多几个ip端口即可。前面提过,Tornado是单线程Server,启动cpu核数个Tornado进程并绑定到cpu,能够提高机器的吞吐量。
需要特别指出的是,要根据上述应用的超时机制,设置proxy_read_timeout,proxy_read_timeout必须大于应用的超时。否则将会有504请求返回。
至此,一个Comet应用的服务器端就完成了。由于Comet使用的是长连接机制,需要特别注意从客户端到真正后端程序之间每个环节的超时机制,而且网络连接的不可靠性影响将会更大,需要考虑更多边界条件。

 

 

 

  

 

 

 

 

转载于:https://www.cnblogs.com/javapy/archive/2012/11/22/2783043.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值