如果我不这样做,服务器有什么好的技巧来处理更多的请求吗;不必发回任何数据
Is there any good trick for server to handle more requests if I don't have to sent any data back?
我想用某种服务服务器处理来自javascript客户端的大量(>10k/sec)POST请求。这些数据不会被存储,但我必须处理所有这些数据,这样我就不能把我的全部服务器能力只用于服务请求。所有的处理都需要在同一个服务器实例中完成,否则我需要使用数据库在服务器之间进行同步,这将慢几个数量级。
然而,我不需要将任何数据发送回客户,他们甚至不希望收到这些数据。到目前为止,我的计划是创建一些代理服务器实例,这些实例将能够缓冲请求,并将它们以更大的包发送到主服务器。
例如,假设我需要每秒处理20万个请求,每个服务器可以处理40万个请求。我可以在他们5个人之间分配负载。然后,每一个都将缓冲请求,并将它们以100包的形式发送回主服务器。这将导致主服务器上每秒2k个请求(然而,每条消息将大100倍,这可能意味着大约100-200kB)。我甚至可以使用UDP将它们发送回服务器,以减少所需的资源量(然后我只需要主服务器上的一个套接字,对吧?)。
我只是在想,如果没有其他方法可以加快速度的话。尤其是当我说我不需要寄任何东西的时候。我也可以完全控制javascript客户端,但不幸的是,javascript无法使用UDP发送数据,这可能是我的解决方案(我甚至不在乎0.1%的数据是否会丢失)。
有什么想法吗?
编辑以回应到目前为止给我的答案。
问题不在于服务器处理队列中事件的速度慢,也不在于将事件放入队列本身。事实上,我计划使用中断器模式(http://code.google.com/p/disruptor/)它被证明每秒可处理多达600万个请求。
我可能遇到的唯一问题是需要同时打开100、200或300k个套接字,这是任何主流服务器都无法处理的。我知道一些自定义解决方案是可能的(http://www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-3)但我想知道是否并没有办法更好地利用我不必向客户重播的事实。
(例如,在初始TCP数据包中嵌入部分数据并将TCP数据包作为UDP处理的方法。或者其他某种魔术;)
创建一个独特而快速的(可能在C中)函数,从非常快速的服务器(如nginx)获取所有请求。这个函数的唯一工作是将请求存储在一个非常快的队列中(如果你有足够的ram,就像redis一样)。
在另一个进程(或服务器)中,取消队列并执行实际工作,逐个处理请求。
如果您可以控制客户端,那么您的代理服务器甚至不需要是HTTP服务器,因为您可以假设所有请求都是有效的。
您可以将其实现为一个非HTTP服务器,它只需发回一个200,读取客户端请求直到断开连接,然后将请求排队进行处理。
我认为您所描述的是消息队列的实现。您还需要一些东西来将这些请求传递给您使用的任何队列(RabbitMQ非常好,有很多替代方案)。
您还需要运行其他程序,这些程序可以对请求执行您实际想要的任何处理。你还没有说得很清楚,所以我不太确定什么对你来说是正确的。从本质上讲,这个想法是由您的web服务器尽可能快地将传入请求转储到队列中,然后web服务器可以自由地返回到服务更多请求的位置。当系统有一些资源时,它会使用这些资源来处理队列,但当系统繁忙时,队列会不断增长。
不确定你在哪个平台上,但可能想看看像Lighttpd这样的东西来为海报服务。你可能会(如果相同的域限制不会让你失望的话)让Lighttpd在你的应用程序的子域上运行(所以post.myapp.com)。否则,你可以在你的网络服务器前面放一个合适的负载均衡器(所以所有请求都会转到www.myapp.com,负载均衡器决定是转发到网络服务器还是队列处理器)。
希望对有所帮助
考虑使用MongoDB来持久化您的请求,它的fire-and-forget机制可以帮助您的服务器更快地响应。
- ajax请求的顺序总是不同的
- Meteor如何接收HTTP请求
- 有没有一种方法可以防止img get请求使用css或js发生
- 从ajax请求中获取javascript对象
- JSONP请求返回结果,但也触发error_callback
- 在localhost Dev Box上测试JSONP请求的最佳方式
- Ajax请求文档就绪会导致jquery加载缓慢
- MockJax没有在JavaScript应用程序中发送对我AJAX请求的响应
- 正在传递JSONP标头's数据参数到另一个文件中的AJAX请求
- 在openshift node js应用程序中获取请求
- 反应路由器弄乱了请求网址
- 在我的情况下,如何进行http请求
- 使用密码对话框Javascript请求帮助
- servlet中的请求对象,而不是从jsp接收参数值
- 否'访问控制允许来源'标头存在于IISNOde中请求的资源(AngularJS+NodeJs)上
- JavaScript代码未正确检查ajax请求
- node.js请求数据事件未在CORS ajax调用中触发
- 如何检测第三方广告服务器请求
- 如果我不这样做,服务器有什么好的技巧来处理更多的请求吗;不必发回任何数据
- 如何拆分AJAX响应,从而不必发出多个请求?