javascript - 如果我不必发回任何数据,服务器是否有任何好的技巧来处理更多请求?

标签 javascript tcp network-programming connection udp

我想使用某种服务服务器处理来自 javascript 客户端的大量(> 100k/秒)POST 请求。这些数据不会被存储很多,但我必须处理所有这些数据,所以我不能将我的整个服务器能力只用于处理请求。所有处理都需要在同一个服务器实例中完成,否则我将需要使用数据库在服务器之间进行同步,这会慢几个数量级。

然而,我不需要将任何数据发回给客户,他们甚至都不希望收到这些数据。 到目前为止,我的计划是创建几个代理服务器实例,这些实例将能够缓冲请求并将它们以更大的包发送到主服务器。

例如,假设我需要每秒处理 200k 个请求,而每个服务器可以处理 40k。我可以在其中 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 数据包中并像处理 UDP 一样处理 TCP 数据包的某种方式。或者其他一些魔法;))

最佳答案

创建一个独特且快速(可能在 C 中)的函数,从一个非常快的服务器(如 nginx)获取所有请求。这个函数的唯一工作是将请求存储在一个非常快的队列中(如果你有足够的 ram,就像 redis)。

在另一个进程(或服务器)中,depop 队列并做真正的工作,一个一个地处理请求。

关于javascript - 如果我不必发回任何数据,服务器是否有任何好的技巧来处理更多请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8964551/

相关文章:

javascript - 使用传单添加和删除几何坐标图层

javascript - 如何使用 onkeyup 将输入类型 ="url"中的 URL 加载到 iframe src 中?

javascript - 使 Bootstrap 轮播导航仅在悬停时显示

javascript - Gulp.js : How to dynamically concatenate subdirectory files, 但不是主目录中的文件

sockets - 硬件断开后 TCP 恢复连接

spring - TCP 客户端 Spring 与 Java 配置的集成

c# - 如何保护 ZeroMQ 请求回复模式免受潜在的消息丢失?

C++ 如何通过套接字发送对象?

python asyncore 在客户端连接后使用 100% CPU

c++ - Boost-asio 在单个 (TCP) 接受器上监听多个 IP 地址