-
Comet中使用HTTP11NioProtocal的问题20
最近在研究Comet,已经实现了几种Comet模型,但是基本上所有的说明上都写着要用到Http11NioProtocal,因为Comet要用到长连接或者一直不停的发送连接,而Nio模式能更多的支持连接数。Comet要实现CometProcessor接口,用的是事件驱动模型。
问题:比如设置最大连接数150,如果不使用NIO模式,那么第151个请求不能被处理。如果使用NIO模式,第151个请求能处理吗?如果处理的话是怎么处理的?这跟Comet的事件有什么关系?在event函数中,事件到达怎么处理(比如第151个请求来了,能收到这个事件吗)?
问题补充:Http11NIOProtocal到底有什么好处?我知道它可以支持很多连接,但是它接受了这么多连接如果处理不了,不是也得有很多连接等着吗?2012年10月26日 10:08
1个答案 按时间排序 按投票排序
-
web服务器一般有两种处理http请求的机制,阻塞和非阻塞,阻塞式因为每一个连接都产生一个线程,当线程数达到一定数量的时候,CPU用于线程切换的时间会变多,整体的性能会下降,所以线程池的数量要控制在一定的数量内,这是就需要引入非阻塞的机制,就是把连接先缓冲在一个队列中,然后再分给后台的线程池中的空闲线程慢慢处理。
Comet属于长连接,所以对于web服务器的吞吐量要求要更高,也就是要具备处理大量http请求的能力,所以必须使用Http11NioProtocal来提高吞吐量。
至于把连接缓存在队列中,依然排队等待的问题,和阻塞式处理方式比,至少客户端不会收到500 connection refused,只是感觉响应慢一些,还有因为comet属于消息推送,一般客户端的http请求是异步的,比如通过ajax在后台发起http请求,所以对于这种情况,连接缓存在等待队列中也没有关系,因为是异步的,而且用户也看不到,所以对用户的使用也没有影响。
下面看一下这两种方式的区别:
1.Http11Protocal
使用阻塞IO,服务器端使用Socket类和ServerSocket类负责请求的接入
一个请求接入线程,专门负责请求的接入accept,接入后把socket扔给后面的线程池,线程池中有具体的处理线程,负责后续的处理,一个线程对应一个请求,直到请求处理完毕并返回response,这个线程数就是web服务器能承载的最大线程数,如果线程池中没有空闲线程,那么下一个请求就无法接入,如果ServerSocket的等待队列也满了的话,客户端就会收到500 connection refused。
2.Http11NioProtocal
使用非阻塞IO,服务器端使用SocketChannel类和Server把SocketChannel类负责请求的接入
这种方式也有一个请求接入线程,专门负责请求的接入accept,但是接入后不是直接扔给后面的处理线程池,而是又多了一个或多个中间线程,这个中间线程里面有一个队列,接入后直接把SocketChannel以及对应的Selector监听信息包装成一个事件对象扔到队列中,这个队列可以容纳足够多的事件对象,Selector相当于对socket状态进行监视的监听器。这个中间线程不断地对这个事件队列进行循环处理,当Selector中有需要处理的事件时(比如socket read就绪,socket write就绪),再把socket转给后面的处理线程池进行后续的处理。
前面提到的中间线程可以有一个或者多个,每个里面都有一个队列,所以可以容纳足够多的socket连接。这样即使后面的线程池中没有空闲线程,一样可以对请求进行接入,然后缓存在中间线程的队列中。这样就加大了web服务器的吞吐量。comet长连接很多时也可以应付得了。
这种方式不单单是对连接进行缓存,前面提到了中间线程对Selector中的事件进行监视,直到有事件到达时才把socket转给后台线程池进行处理,这样就减少了线程池中的处理线程的等待时间,此外,对每个SocketChannel都分配了readbuffer和writebuffer,这样可以减少实际的socket流的读写次数,以减少IO等待。2012年10月30日 22:57
相关推荐
在IT行业中,HTTP长连接(也称为Comet技术)是一种用于实现服务器向客户端实时推送数据的方法,常用于构建实时交互的应用,如聊天室、股票报价、在线游戏等。C#作为.NET框架的主要编程语言,提供了丰富的工具和技术...
Comet技术是解决Web应用程序实时性问题的一种方法,通过长时间保持HTTP连接来实现实时数据推送。下面将详细介绍Comet4j的使用方法,适合初学者参考。 ### 客户端配置 1. **下载客户端JS文件**:首先,你需要从官方...
在实际应用中,使用Comet4j可以显著提升用户体验,因为它避免了传统的AJAX轮询带来的频繁请求和高延迟问题。同时,Comet4j也支持大规模并发,可以处理成千上万的并发连接,这对于构建高并发、实时性的互联网应用非常...
在C#中,可以使用各种库和框架来实现Comet技术,这些框架通常会对HTTP连接的管理、数据序列化和反序列化、错误处理等方面提供支持,简化开发流程。这里提到的"C#Web即时通讯Comet框架"可能是一个特定的开源项目,它...
在Web应用中,通常的HTTP请求是客户端发起的,而Comet打破了这种模式,使得服务器可以在适当的时候主动向客户端推送信息,极大地提升了实时性。 这个"comet demo"是一个展示如何在Java环境下利用Tomcat服务器实现...
在Comet技术中,HTTP连接被保持开放状态,直到有新的数据需要推送或者连接因为超时、网络问题等原因断开。主要有两种实现方式: 1. **HTTP流(HTTP Streaming)**:服务器在响应头中设置`Connection: keep-alive`和...
### Java Comet 服务器推送使用步骤详解 #### 一、引言 在现代Web开发中,实时数据推送技术已经成为不可或缺的一部分。Comet作为一种实现服务器向客户端推送数据的技术方案,在早期的Web应用中扮演了重要的角色。...
- **Comet4j API**:学习如何在Java代码中使用Comet4j提供的API,创建和管理Comet连接,注册事件监听器,以及发送和接收数据。 - **服务器配置**:了解如何在Tomcat等支持的服务器上配置Comet4j,包括添加必要的...
要使用这些文件,你需要首先在你的Tomcat服务器上部署`comet4j-tomcat6.jar`或`comet4j-tomcat7.jar`,然后将`comet4j.js`添加到你的前端项目中。接着,你可以参考`comet4j-tomcat6-demo.war`中的代码,学习如何在...
Comet技术是一种基于HTTP长连接的Web实时通信技术,它允许服务器向客户端主动推送数据,而无需客户端...在开发过程中,理解Comet的工作原理,熟悉相关库的使用,以及掌握服务器和浏览器的兼容性问题,都是非常重要的。
4. ** 流处理**:由于HTTP协议本身并不直接支持双向通信,Catalina-Comet.jar通过在HTTP响应中使用流来实现服务器向客户端的数据推送。这种方式需要开发者精确控制流的读写,以避免阻塞和数据丢失。 5. ** 性能优化...
在本"Comet框架例子项目"中,我们可以深入理解并学习如何利用Comet技术构建实时通信的应用。 Comet的核心理念是通过长时间保持一个HTTP连接来实现服务器到客户端的数据推送,而不是每次有新数据时都创建新的连接。...
为了解决这个问题,描述中建议在IE下使用IFrame来实现类似的功能。IFrame可以嵌入一个独立的HTML文档,这样可以在不同的浏览器环境中模拟长连接的效果。 ASP.NET AJAX库(通常包括在ASP.NET框架中)提供了支持Comet...
通过深入研究`comet4jDemo`中的代码和文档,开发者可以了解Comet4j的工作原理,学习如何在自己的项目中使用这项技术,实现高效的实时数据传输。这不仅有助于提升用户体验,也能为Web应用带来更丰富的交互性。
然而,由于HTTP Streaming的局限性,如浏览器兼容性问题和可能的连接超时,现代Web开发中更倾向于使用WebSocket,它提供了更稳定、更高效的双向通信。但了解HTTP Streaming可以帮助我们理解早期实时Web通信的机制,...
4. **跨域问题**:由于浏览器的安全限制,跨域请求可能需要CORS(跨源资源共享)配置,comet4j的使用可能涉及到这方面的问题。 5. **负载均衡和集群**:在大型系统中,考虑如何在多台服务器之间分发连接和数据推送是...
在Web应用中,这种技术常用于实现聊天、实时通知、股票更新等功能,它克服了传统HTTP协议的阻塞问题,提高了用户体验。 1. **Comet技术原理**: Comet技术基于HTTP长连接,通过让服务器保持与客户端的连接状态来...
这种技术解决了传统Web应用中实时性不足的问题,使得Web应用能够实现类似实时聊天、股票更新等实时功能。 **HTTP 长连接与短连接** 在HTTP协议中,通常每次请求和响应之间都会断开连接,即使用短连接。然而,Comet...
本文将深入探讨Comet_ml 2.0.12版本的功能、使用方法及其在实际开发中的应用。 首先,Comet_ml的核心价值在于其实验管理能力。在机器学习项目中,我们经常需要尝试不同的超参数、算法和数据预处理策略,而这些实验...