将同步 http 请求/响应模型与基于异步队列的模型连接起来的好方法是什么?
当用户的 HTTP 请求到来时,它会生成一个进入队列的工作请求(在本例中为beanstalkd)。其中一名工作人员接听请求,完成工作并准备响应。
队列模型不是请求/响应——只有请求,没有响应。所以问题是,我们如何最好地将响应返回到 HTTP 世界并返回给用户?
想法:
Beanstalkd 支持轻量级主题或队列(他们称之为管)。我们可以为每个请求创建一个管道,让工作人员在该管道上创建一条消息,并让 http 进程在管道上等待响应。不要特别喜欢这个,因为它有 apache 进程坐在那里占用内存。
让 http 客户端轮询响应。用户的初始 HTTP 请求启动队列中的作业并立即返回。客户端(用户的浏览器)定期轮询响应。在后端,worker 将其响应放入 memcached,我们将 nginx 连接到 memcached,因此轮询是轻量级的。
使用彗星。类似于第二个选项,但使用更高级的 http 通信来避免轮询。
我倾向于 2,因为它很容易而且众所周知(我还没有使用过彗星)。我猜可能还有一个我没有想到的更好的明显模型。你怎么看?