我们需要支持10k+用户,每个用户都会发起请求并等待服务器的响应(响应可能需要20-30秒才能到达)。这只是来自客户端的一个请求,经过服务器的长时间处理,将发送一个响应,然后断开连接。在后台,服务器将进行一些数据库搜索,并等待其他后台进程通知完成后再响应客户端。
在做了一些研究后,我发现我们需要使用类似于atmosphere框架的东西来支持websockets/sse-event/long轮询,以及异步服务器,如netty(=>net sphere)或jetty 我的问题是: 根据我的经验和我们的要求,什么更容易实现:大气+网还是大气+码头?哪一种能够更好地扩展,具有更容易的学习曲线,并且更容易实现其他java技术? 如何在大气中实现只发送给始发客户端而不广播给其他客户端的响应?(我发现的所有例子都是广播的)。 当使用大气框架我们的响应时,我如何在netty(或jetty)中实现?即,客户端发送请求,在服务器中接收到请求后,运行一些后台进程,当它们完成时,我需要定位连接并发送响应。这是可以实现的吗?
一些想法:
-
当用户超过10k,响应延迟为20-30秒时,如果只使用1个网络接口,则可能会达到文件描述符限制。考虑使用多个网络接口的解决方案。
-
您对请求/响应的描述可以完全使用标准Servlet 3.0、标准HTTP/1.1、异步请求处理和大超时来处理。
-
如果你的客户端是网络浏览器,并且直到20-30秒的窗口才开始从服务器发送响应,那么你可能会遇到浏览器空闲超时。
-
Atmosphere和Comed做了同样的事情,支持长时间连接、连接技术回退和逻辑通道API。
我相信AKKA框架将处理这种需求。我正在考虑使用它来处理扩展问题,可能使用RabbitMQ来帮助将工作卸载到可能稍后添加以根据需要进行扩展的其他服务器。