发布于2019-09-06 12:06 阅读(1465) 评论(0) 点赞(18) 收藏(5)
一般的web应用,都会使用ajax轮询来获得服务器的更新。但轮询方式会增加服务器的压力,而且很多请求获得的数据并没有更新,这些请求都是无意义的,徒增服务器压力而已。
使用Comet技 术可以一定程度地解决以上问题。Comet的实现很多,大多数需要使用特定的HTTP Server来实现。本文介绍使用基于python的Tornado Web Server来实现Server Side的Comet,为了贴近生产环境,还会介绍Tornado如何配合Nginx工作。
安装
到http://www.tornadoweb.org/可以下载到最新的Tornado,那里也有安装的说明。
编写第一个Tornado程序
编辑comet.py,内容如下
#!/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()
此时执行comet.py,一个non-blocking的server端已经搭建成功。
要注意的问题是,如果不加超时机制,服务端会不断执行,即使客户端已经断开。因此还需自己实现超时机制。
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.pythonheidong.com/blog/article/98288/f08e51545fb2c7ffa473/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!