我想通过某种服务服务器处理来自
javascript客户端的大量(> 100k / sec)POST请求.这些数据不会被存储,但我必须处理所有这些数据,因此我无法将整个服务器功耗仅用于处理请求.所有处理都需要在同一个服务器实例中完成,否则我需要使用数据库进行服务器之间的同步,这将在数量级上变慢.
但是,我不需要将任何数据发送回客户端,他们甚至不期望它们.
到目前为止,我的计划是创建一些代理服务器实例,这些实例将能够缓冲请求并将它们发送到更大包中的主服务器.
例如,假设我需要处理200k请求/秒,每个服务器可以处理40k.我可以在5个之间分配负载.然后每个人将缓冲请求并以100个包的形式将它们发送回主服务器.这将导致主服务器上的2k请求/秒(但是,每条消息将大100倍 – 这可能意味着大约100-200kB) .我甚至可以使用UDP将它们发送回服务器以减少所需资源的数量(然后我只需要主服务器上的一个套接字,对吧?).
我只是在想,如果没有其他方法可以加快速度.特别是,正如我所说,我不需要发回任何东西.我也完全控制了javascript客户端,但是不幸的javascript无法使用UDP发送数据,这可能是我的解决方案(我甚至不关心0.1%的数据是否会丢失).
有任何想法吗?
编辑以回应我迄今给出的答案.
问题不在于服务器在处理队列中的事件或将事件放入队列本身时变慢.实际上我计划使用disruptor模式(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.或者其他一些魔法;))
最佳答案 从一个非常快的服务器(如nginx)创建一个独特而快速(可能是C语言)的函数来获取所有请求.这个函数唯一的工作就是将请求存储在一个非常快速的队列中(如果你有ram那么就像redis一样).
在另一个进程(或服务器)中,删除队列并执行实际工作,逐个处理请求.