Wookie Common Lisp服务器并行处理请求吗?

时间:2015-01-21 07:06:23

标签: common-lisp sbcl

我有一个基于Wookie的应用程序接受nginx背后的请求。该应用程序一般工作,但我遇到了并行请求的一些问题。例如,当应用程序接受长时间运行的请求(R1)以从数据库中的数据集(mongodb,通过cl-mongo)生成报告时,它似乎对之前进入的任何后续请求(R2)没有响应。对R1的响应开始通过网络发送。

客户端报告与R2服务器通信时出错,但在服务器完成R1并最终发送响应后,它会尝试处理R2(从调试输出中可以看出) - 执行正确的路由等(仅限于迟)。

在请求处理程序周围放置黑鸟承诺没有帮助(并且可能因为Wookie被设计为异步而过度)。

那么处理这个问题的正确方法是什么?我可能对等待很长时间的客户(通过非常长的超时)感到满意,但是并行处理短请求会好得多。

1 个答案:

答案 0 :(得分:3)

cl-async的底层库(libevent2,libuv)的想法是使用一个任务(请求)的IO等待时间来处理另一个任务(请求)的CPU时间。所以这只是一种不浪费IO等待时间的机制。并行发生的唯一事情是IO,最多只有一个任务一次使用CPU(每个线程/进程取决于实现)。

如果您的请求需要平均x毫秒的CPU时间,那么只要您并行n个请求,n是核心数,{{1无论您是使用线程服务器还是基于事件的服务器,st请求都必须等待至少n+1 ms。

您当然可以生成更多服务器进程并使用负载平衡来使用所有可用内核。