如果我不这样做,服务器有什么好的技巧来处理更多的请求吗;不必发回任何数据

Is there any good trick for server to handle more requests if I don't have to sent any data back?

本文关键字:请求 不必 数据 任何 处理 这样做 服务器 如果 什么      更新时间:2023-09-26

我想用某种服务服务器处理来自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机制可以帮助您的服务器更快地响应。