如何强制apache在预定的时间之后删除请求?

我正在build立一个对响应时间有严格要求的系统。 如果强制Apache2在200毫秒后强制删除队列中的请求(如果没有提供服务),我该如何强制?

背景

我们的一个内部服务需要与另一个服务进行交互。 其他服务要求我们在很短的时间内做出所有的回应。 对于less量的查询,我们能够在期望的时间内提供请求。 但是,一旦系统装载了很多请求,响应时间确实受到影响。

由于负载将会持续很长时间,所以我们会遇到堵塞的情况,在这种情况下,旧的查询正在排队,然后进行服务,但是到那时请求已经过期。 我如何确保我们能够在限定的时间内分配请求,或者只是简单地删除请求?

Apache httpd有一个超时旋钮, TimeOut可以处理TCP发送和接收操作,如果客户端没有及时发送数据到服务器(和其他一些事情)。 这是以第二个粒度提供的,默认为300秒。 这不会做的是超时一个请求,比如说5秒来处理本地请求。

httpd唯一的队列是ListenBacklog用于请求位于套接字监听缓冲区等待由当前繁忙的httpd工作线程/subprocess拾取的请求。 根据Apache的说法,他们的“时间”只有在工作人员接受后才能启动。 您可以使用一个小的ListenBacklog设置,以便在服务器启动缓慢时拒绝新的请求。 实际上,如果你的客户在200ms之后结束连接,这可能并不重要,因为积压请求永远不会像HTTP请求那样正常启动。

当您有MaxClientsServerLimit / ThreadLimit / TheadsPerChild连接当前正在使用连接只有进入积压。 你可以把它们调整到一个能使你的服务更好地生存下去的水平。

否则,请求正在由一个httpd工作人员子/线程处理,并且不会在<200ms内产生一个http响应,我怀疑是你正在运行什么。 如果响应在httpd中“处理中”处理httpd ,除了解决触发问题的问题外,没有什么可以做的了。 如果你有一个运行在httpd之上的应用程序产生响应,如果httpd切断连接,它会如何反应? 数据库(如果有的话)如何处理中断连接? 通常他们会不知不觉地完成请求,直到他们试图将数据写回到最后一个套接字。 处理超时是需要在每个级别的堆栈中处理的,因此它的工作就是结束。

在你说的层面上,我认为你需要完全不同于httpd东西来达到你的要求。 也许Mongrel2是基于队列的工作分配可以更容易地处理前端超时 ? 也许基于自定义事件的HTTP服务器可以处理超时? 正如David所言,即使TCP可能也难以按照你所要求的水平来交付。 请求的TCP组件甚至不会计入您实现的服务器端应用程序级超时,除非您有一些内置的智能来计算往返时间(http没有)。

对不起,这只是不明智的。 TCP根本不是提供低延迟服务。 像延迟的ACK和Nagle的algorithm相互作用,使其不适用于延迟必须低的应用程序。