Asynchronous 在一个氛围中实施一个对客户做出响应的后台流程+;网络/码头应用

Asynchronous 在一个氛围中实施一个对客户做出响应的后台流程+;网络/码头应用,asynchronous,websocket,jetty,netty,atmosphere,Asynchronous,Websocket,Jetty,Netty,Atmosphere,我们需要支持10k+用户,每个用户都会发起请求并等待服务器的响应(响应可能需要20-30秒)。这只是来自客户端的一个请求,经过服务器的长时间处理后,将传输响应,然后断开连接。 在后台,服务器将执行一些数据库搜索,并等待其他后台进程在响应客户端之前完成通知 在做了一些研究之后,我发现我们需要使用类似于atmosphere的框架来支持WebSocket/sse事件/长轮询,以及类似于netty(=>nettosphere)或jetty的异步服务器。 至于我的经验——主要是JavaEE世界和Tomca

我们需要支持10k+用户,每个用户都会发起请求并等待服务器的响应(响应可能需要20-30秒)。这只是来自客户端的一个请求,经过服务器的长时间处理后,将传输响应,然后断开连接。 在后台,服务器将执行一些数据库搜索,并等待其他后台进程在响应客户端之前完成通知

在做了一些研究之后,我发现我们需要使用类似于atmosphere的框架来支持WebSocket/sse事件/长轮询,以及类似于netty(=>nettosphere)或jetty的异步服务器。 至于我的经验——主要是JavaEE世界和Tomcat服务器

我的问题是:

  • 根据我的经验和我们的要求,什么更容易实施:大气+网络或大气+码头?哪一种可以更好地扩展,更容易学习,更容易实现其他java技术

  • 如何在大气中实现只发送给发起客户端而不广播给其余客户端的响应?(我找到的所有例子都是广播的)

  • 在使用大气框架时,如何在netty(或jetty)中实现我们的响应?i、 例如,客户端发送一个请求,在服务器中接收到该请求后,一些后台进程将运行,当它们完成时,我需要找到连接并传输响应。这是可以实现的吗

  • 一些想法:

  • 对于10k以上的用户,响应延迟为20-30秒,如果只使用一个网络接口,您可能会达到文件描述符的限制。考虑使用多个网络接口的解决方案。

  • 您对请求/响应的描述完全可以通过标准Servlet3.0、标准HTTP/1.1、异步请求处理和大超时来处理

  • 如果您的客户端是web浏览器,并且直到20-30秒的时间窗口才开始从服务器发送响应,那么您可能会遇到浏览器空闲超时

  • Atmosphere和Cometd做同样的事情,支持长时间连接、连接技术回退和逻辑通道API


  • 我相信AKKA框架将处理这种需求。我正在考虑使用它来处理扩展问题,可能是通过RabbitMQ来帮助将工作卸载到其他服务器,这些服务器可能会在以后根据需要添加以进行扩展。

    也要考虑一下。关于您的#3+#4评论,我想我们需要大气来处理连接。关于#2-我不需要生成大量线程来处理请求吗?或者我可以将asyncServlet保存在缓存中,并在后台进程访问服务器时访问它吗?您对线程的担忧是错误的,线程只处于活动状态,并根据实际的活动处理进行分配。换一种说法。。。线程数!=Servlet 3.0 Async处于混合状态时的连接计数。要知道,使用Atomosphere和Comed时,长持续时间请求/响应是通过其他连接类型(http流、http长轮询、websocket等)处理的。如果在web浏览器上,来自这些类型连接的响应将必须由您自己以javascript进行处理,然后在浏览器中显示您想要的方式。这可能会帮助您了解Bayeux协议、BOSH等。您将很快了解到,所有这些技术都将在请求/响应的生命周期中使用不止一个连接(使用各种javascript端管理),以实现它们的目标。