Http环境下的保持连接方式
Http环境本身是一种无连接状态的架构,在这种架构下服务器只能是被动的接受客户端的请求,返回结果,而无法主动的给客户端发送数据。而在很多需要实时数据交互(比如Web IM)的场景中,我们却希望能及时得到服务器给我们返回的数据。此时,一种最为普遍的做法是:在客户端用定时器,定时去请求服务器的服务,来得到最新数据。而这样一来,很多时候却是在做无用功,频繁的请求也会无端的增加服务器和客户端在请求Web服务上的消耗。那么是否有一种更好的办法,既可以及时得到服务器的返回,同时又可以减少做无用功,以及频繁请求带来的性能问题呢?
记得前不久,在园子里有这样的一篇文章,介绍了几种WEB环境定时刷新数据的机制。其中就有提到google gmail的一种比较巧妙的做法,现在记不得当时是怎么理解这种做法了,只记得有“保持长连接”的基本做法。(当然现在也找不到这篇文章了,希望了解的朋友能提醒一下)。今天由于架构方案的需要,再来仔细思考连接保持方案,以及参考gmail的请求行为,总结了一下,应该是这样的:客户端一直保持一个与服务器的连接,这个连接一直保持着对服务器的请求动作,直到服务器发现有数据后给它返回后,才结束返回这一次请求。客户端在接收到请求返回后,在处理这些返回之前,又向服务器发送了一次连接请求,直到下一次有数据返回。不可避免的有一种情况,就是如果服务器长时间没有需要给客户端发送数据的话,那么可以就会造成请求失败(超时或其它原因)。对于这种情况的处理也是一样的,在错误的回调事件中重新发送一次请求连接。这样就可以模拟保持连接状态了。
用伪代码来描述一下思路吧:
客户端脚本:
1: function Request()
2: {
3: Ajax.Request(url,OnSuccessed,OnFailed);
4: }
5: function OnSuccessed(response)
6: {
7: //重新发送一次请求
8: Request();
9: //处理返回数据
10: }
11: function OnFailed()
12: {
13: //错误(超时)重新请求
14: Request();
15: }
Web服务:
1: public class IMService : IHttpHandler
2: {
3: public bool IsReusable{return false;}
4: public void ProcessRequest(HttpContext context)
5: {
6: //读取最新数据
7: while(true)
8: {
9: string message = GetMessage();
10: if(!string.IsNullOrEmpty(message))
11: {
12: context.Response.Write(message);
13: break;
14: }
15: Thread.Sleep(500);//等待一段时间再重新读取。
16: }
17: }
18: private string GetMessage()
19: {
20: //取得最新数据
21: }
22: }
这种方案的好处有:客户端可以第一时间得到服务器需要给客户端发送的数据(而至于Web服务怎么知道要给客户端发送数据,也就是服务器的轮循设计,则是另一个需要考虑的方案);可以减化客户端逻辑,无需要创建和释放定时器,并减小由此产生的对客户端性能的损失;减少去服务器的请求次数,减少做无用功,节约节省带宽和减少服务器资源需要处理的连接请求。
相信在此之前,已经有很多人在使用这种方案了。欢迎大家就此方案发表自己的见解。
补充:服务器部分的设计,除了使用轮循外,也可以考虑使用资源互斥访问的方式来设计,这样做可以获得更佳性能,更高实时性,具体的方案应当根据实际情况来考虑。
相关文章:

22岁专访库克、B站3天涨粉百万,他将毕设树莓派扫描仪升级,繁星散落在校空!...
整理 | 禾木木出品 | AI科技大本营(ID:rgznai100)近日,#何同学毕业#冲上了热搜,4 亿网友阅读词条,1.7 万讨论为他送上毕业祝福,最新毕业视频燃爆朋友圈。过去几个月,要说B站网友苦苦等待的UP主是…

Database Appliance并非Mini版的Exadata-还原真实的Oracle Unbreakable Database Appliance
Oracle甲骨文系统有限公司在北京时间9月23日发布了一款Oracle数据库机即Oracle Database Appliance。Oracle Database Appliance是一款面向中小型企业的使用简单、用得起的高可用数据库专用服务器,该数据库机基于Sun Fire服务器、Oracle Enterprise Linux和Oracle D…

一款基于jquery和css3的响应式二级导航菜单
今天给大家分享一款基于jquery和css3的响应式二级导航菜单,这款导航是传统的基于顶部,鼠标经过的时候显示二级导航,还采用了当前流行的响应式设计。效果图如下: 在线预览 源码下载 实现的代码。 html代码: <div i…

基于PyTorch,如何构建一个简单的神经网络
本文为 PyTorch 官方教程中:如何构建神经网络。基于 PyTorch 专门构建神经网络的子模块 torch.nn 构建一个简单的神经网络。完整教程运行 codelab→https://openbayes.com/console/open-tutorials/containers/OgcYkLjKw89torch.nn 文档→https://pytorch.org/docs/s…

C#语言的几个层次
作者: 李建忠 接到一位前不久C#培训学员的来信,这位学员虽然以前功底欠缺,但学习劲头很足,在培训中成长很快。即便基本吃透《.NET框架(修订版)》还嫌不够过瘾,一心要成为高手中的高手。来信的目…

确定安全威胁与漏洞-A
1、社会工程学攻击是一种使用欺骗和诡计说服不知情的用户提供敏感信息或做出违背安全准则行为的攻击类型。通常通过人、电子邮件、电话等方式表现出来。 2、社会工程学攻击类型主要有电子欺骗、冒名顶替、骗局、网络钓鱼、电话钓鱼、大型网络钓鱼(鱼叉式网络钓鱼&am…

C# 特性(Attribute)学习。
特性(attribute)是被指定给某一声明的一则附加的声明性信息。 在C#中,有一个小的预定义特性集合。在学习如何建立我们自己的定制特性(custom attributes)之前,我们先来看看在我们的代码中如何使用预定义特性…

JMeter学习(二十三)关联
话说LoadRunner有的一些功能,比如:参数化、检查点、集合点、关联,Jmeter也都有这些功能,只是功能可能稍弱一些,今天就关联来讲解一下。 JMeter的关联方法有两种:后置处理器-正则表达式提取器与X…

程序员千万不要选全栈开发
作者 | 千鸟(网名) 小路助手开发者责编 | 晋兆雨出品 | CSDN(ID:CSDNnews)对于大多数人来说,大学毕业后选择一家满意的公司,一路升职加薪才是正解,但他却偏偏选择了一条鲜有人知的…

手动初始化设置3PAR存储系统
准备工作 1. 具备串口的终端电脑(USB to serial). 2. 使用标记为“180-055”灰色适配器(3par自带). 3. 标准RJ45网线. 4. 下载HP 3par OS及SP Patch包. 5. PuTTY软件(或其他串口软件) 其他说明 手动设置存储系统…

C# 里怎样得到当前执行的函数名,当前代码行,源代码文件名。
得到函数名: System.Diagnostics.StackTrace st new System.Diagnostics.StackTrace(); this.Text st.GetFrame(0).ToString(); 得到代码行,源代码文件名: StackTrace st new StackTrace(new StackFrame(true));Consol…

特斯拉Model 3国内起售价下调至23.59万元
7月30日11:00,特斯拉官方微博宣布,即日起,特斯拉Model 3标准续航升级版的价格下调15000元人民币,调整后的价格为235900元人民币(此为补贴后起售价)。此次价格调整反映了成本波动的实际情况。特斯拉一直秉承…

Maven内置变量
1、Maven内置变量说明: ${basedir} 项目根目录${project.build.directory} 构建目录,缺省为target${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes${project.build.finalName} 产出物名称,缺省为${proje…

在客户端调用MOSS的搜索服务,实现更加灵活的搜索控制
MOSS中提供了很多web services的服务,都放在http://<Site>/_vti_bin下 我们可以在其他地方,比如winForm,webForm中调用,对MOSS的对象进行灵活操作。 下面我简单列一下调用一个MOSS中的搜索服务的方法: 1、在VS…

年收入百万美元AI科学家的烦恼与思考
AI 研究科学家 Alexis Conneau 只需敲击了几下键盘,包含数千亿字的信息洪流,就能在他的电脑屏幕窗口中滚动起来。多年来,自动化 “爬虫” 用 100 种语言将互联网中的古老诗歌、愤怒的评论、甜点食谱和其他一切信息吸进庞大的数据库中。作为人…

web架构设计经验分享
本人作为一位web工程师,着眼最多之处莫过于 性能与架构,本次幸得参与sd2.0大会,得以与同行广泛交流,于此二方面,有些心得,不敢独享,与众博友分享,本文是这次参会与众同撩交流的心得,…

BOM和DOM的区别
为什么80%的码农都做不了架构师?>>> BOM 浏览器对象模型提 供了独立于内容而与浏览器窗口进行交互的对象。描述了与浏览器进行交互的方法和接口,可以对浏览器窗口进行访问和操作,譬如可以弹出新的窗口,改变状态栏 中的…

C#编码简单性之语义篇(如何编写简短的C#代码,随时更新)
以前写C的时候曾经在自己网站上发表过一个编码“简单性”之文章,现在编写C#了才发现自己无意之间就会写下一些浪费屏幕的代码。下面是自己编码中偶然发现的一些案例,欢迎中等水平的编程者参考。因为要积累案例,所以随时更新。---------------…

网站性能越来越差怎么办?
新的一年,你的老板或客户,是否曾和你抱怨公司的网站性能愈来愈差?网站大家都会写,自从有了 Visual Studio 之后,连你家楼下的正妹小喵和隔壁的王大婶都会写 ASP.NET。但同样的一个画面,背后的性能却可能是天…

如何设计一个高性能CPU?
任何一种技术都会经历从阳春白雪到下里巴人的过程,就像我们对计算机的理解从“戴着鞋套才能进的机房”变成了随处可见的智能手机。在前面20年中,大数据技术也经历了这样的过程,从曾经高高在上的 “火箭科技(rocket science&#x…

Python包管理工具Distribute的安装
Python包管理工具Distribute的安装Python的包管理工具常见的有easy_install, setuptools, 还有pip, distribute,那麽这几个工具有什么关系呢,看一下下面这个图就明白了:可以看到distribute是setuptools的替代方案,pip是easy_insta…

如何用 Graylog 管理日志?- 每天5分钟玩转 Docker 容器技术(93)
上一节已经部署好了 Graylog,现在学习如何用它来管理日志。 首先启动测试容器。 docker run -d \ --log-drivergelf \ --log-opt gelf-addressudp://localhost:12201 \ --log-opt tag"log-test-container-A" \ b…

php调用C代码的方法详解
在php程序中需要用到C代码,应该是下面两种情况: 1 已有C代码,在php程序中想直接用2 由于php的性能问题,需要用C来实现部分功能针对第一种情况,最合适的方法是用system调用,把现有C代码写成一个独立的程序。…

如何在Django中接收JSON格式的数据
Django做了大量工作简化我们的Web开发工作, 这其中当然也包括接收来自客户端的数据这一普遍需求. 大部分时候,从客户端传入的数据主要是FORM的POST数据,和来自URL的GET数据, 在Django中对应了HttpRequest对象的POST和GET属性, 例如读取FORM表单中的用户名username输入框的内容:…

写了篇爬虫文章,收到律师函,怎么办
大家好,我是早起。从写公众号开始,不论是私信还是交流群,常常都会有粉丝会问出类似下面的问题xx网站能不能爬?爬xx数据有没有风险?其实我并不是爬虫从业人员,充其量算爬虫爱好者,去年也转载过一…

在SQL中使用CRL函数示例
在SQL中使用CRL函数 实验目标: 1. 在SQL中创建CRL函数,使之能够向指定的计算机发送消息 实验步骤 2. 在VS中创建类发送消息的类 3. 将以下代码黏贴进去 using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; …

ASP.NET的(HttpModule,HttpHandler)
在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为inetinfo.exe进程所截获,这个进程实际上就是www服务。截获之后它会将这个请求转交给asp.dll进程,这个进程就会解释这个asp页面,然后将解释…

页面GBK,用jquery.post乱码问题
2019独角兽企业重金招聘Python工程师标准>>> jquery ajax默认为UTF-8,所以页面上要 encodeURIComponent ("内容") 后台代码 再 URLDecoder.decode("内容" "utf-8") 转载于:https://my.oschina.net/wangchongya/blog/34651…

专访陈天桥:把钱投给甘坐冷板凳的AI研究员
作者:钱童心 责编:刘佳“别的投资人听陶虎说,要10年才能做出消费级产品,就不投了,我跟陶虎说,我给你20年时间做。”人工智能(AI)技术正在为各行各业赋能,这使得一场人才…

使用DPM2007备份还原Exchange2007邮箱数据库
创建演示环境1. 在这里,由于要演示备份和还原,所以我们先让用户bob给alice发一封信以作测试验证。2. 用户alice登录OWA后,可以看到bob发来的一封信,主题为“DPM Test For Exchange”,如图1.创建保护组并备份Exchange…