服务器推送或客户端推送更好?

时间:2010-03-22 06:34:12

标签: java servlets

我正在使用jsp / servlet开发一个聊天网站。我将在gooogle appengine上托管我的网站。现在我对是否使用服务器推送或客户端拉技术有一些疑问

1)如果我使用服务器推送,如果我不关闭servlet的响应会导致服务器变慢吗?如果我为整个聊天会话保持套接字打开,那么tyicall tomcat服务器可以处理多少同步连接两个clinets之间??

2)服务器推送或clinet推送会更好吗?

5 个答案:

答案 0 :(得分:1)

我不知道你是怎么想在这里实现服务器推送的。据我所知,服务器需要通过HTTP响应的请求。因此,当有请求时,服务器将对此作出响应。

答案 1 :(得分:1)

如果你使用的是servlet(在3.0之前),那么我猜你必须使用 pull ,因为servlet的编程模型。但是,使用 push 模型有一些优势。主要是服务器上的浪费负载和延迟限制。这就是comet等技术的原因。 Servlet 3.0 also supports push model。这些通常用于基于Ajax的应用程序。

事实上,我认为推模型更适合聊天应用。因为它可以提供快速的响应时间(=更好的用户体验)。

如果您对推模型使用基于nio的实现,则可以支持数千甚至超过10k的并发连接(显然,您的millage会有所不同)。

如果你使用传统的基于IO的实现,它可能会在数百个并发连接的范围内(尽管不要过于认真地对待这个估计。我只是给这些数字给出非常非常粗糙的感觉)。

至于tomcat,我上次检查时,人们说它在版本7.0之前不会有很好的推送模型支持。但我没有遵循现状,所以我不确定(对不起,也许其他人可以帮助你)。如果是这种情况,您可能需要查看jetty的彗星支持。

grizzlynetty也是基于NIO的良好网络框架,但是如果你想使用JSP,并发现tomcat还不够,我猜jetty将是最好的选择。

编辑:(一些额外的信息) 在这个“推模型”中,它不像服务器打开与客户端的连接。连接将保持活动状态,服务器将按其认为合适的方式推送消息。

此外,它不像只有“推”和“拉”模型。你可以拥有一个混合体,比如长轮询。

答案 2 :(得分:0)

  

如果我使用服务器推送,如果我不关闭servlet的响应会导致服务器变慢?

App Engine不允许您这样做。你必须在30秒内完成你的回复,否则它将被杀死。三十秒也是一个边缘情况,他们做的大多数计算(对于配额等)是基于75毫秒的响应时间。

  

tyicall tomcat服务器有多少同步连接

Tomcat的?我以为你打算使用App Engine?

答案 3 :(得分:-1)

拉​​。总是拉。

我知道这是一本以制造业为导向的书,但精益思维(Womack& Jones)的建议在任何情况下都是非常宝贵的(大致来自记忆):

  

首先定义,   排列在 value-stream 中创造价值的活动,   在价值流中创建,   让客户从价值流中提取价值,   与完美竞争而非其他组织

如果我错误引用他们,我道歉。无论如何,所有这些原则都可以很容易地应用于任何软件产品的开发,就像生产任何实体产品一样,但对你来说重要的是 pull

让服务的消费者拉动而不是推动它们不仅使您的编程模型更容易,而且使活动与需求保持一致。如果必须,您仍然可以使用排队来加载级别,只需按照推送方式进行加载,但这样,您就可以完全了解在任何给定事务中发生的事情。

我不是第一个问题,但答案仍然是 pull

答案 4 :(得分:-1)

您的查询的答案取决于您希望使用的基础协议。 由于您提到了JSP / servlet,因此您的应用程序将通过HTTP协议实现。

HTTP是TCP上的协议。 TCP是面向连接的并且保持活动状态,直到连接结束。但是,HTTP连接是持久的,仅在单个请求 - 响应周期的持续时间内。每次请求 - 响应周期后,TCP连接都会中断。因此,对于典型的TOMCAT服务器能够处理多少套接字连接,应该回答您的疑问。根本不会持久连接。它们只会持续HTTP请求 - 响应周期。

鉴于这个基本想法,我建议您使用客户拉动策略来实施您的应用。 即使使用服务器推送,通过HTTP,即使名称显示“服务器推送”,也始终是定期轮询服务器的Web客户端,这只会产生“服务器推送”的错觉。 HTTP规范要求客户端发出服务器响应的请求。

我在开发聊天应用程序(移动和网络)方面拥有丰富的经验。 如果您需要任何帮助,请告诉我。我会更愿意提供帮助。