【发布时间】:2023-03-07 08:15:01
【问题描述】:
将同步 http 请求/响应模型与基于异步队列的模型连接起来的好方法是什么?
当用户的 HTTP 请求到来时,它会生成一个进入队列的工作请求(在本例中为beanstalkd)。其中一名工作人员接听请求,执行工作并准备响应。
队列模型不是请求/响应 - 只有请求,没有响应。所以问题是,我们如何才能最好地将响应返回到 HTTP 世界并返回给用户?
想法:
Beanstalkd 支持轻量级主题或队列(他们称之为管)。我们可以为每个请求创建一个管道,让工作人员在该管道上创建一条消息,并让 http 进程在管道上等待响应。不是特别喜欢这个,因为它有 apache 进程占用内存。
让 http 客户端轮询响应。用户的初始 HTTP 请求启动队列中的作业并立即返回。客户端(用户的浏览器)定期轮询响应。在后端,worker 将其响应放入 memcached,我们将 nginx 连接到 memcached,因此轮询是轻量级的。
使用Comet。类似于第二个选项,但使用更高级的 http 通信来避免轮询。
我倾向于 2,因为它既简单又众所周知(我还没有使用过彗星)。我猜可能还有一个我没有想到的更好的明显模型。你怎么看?
【问题讨论】:
-
我遇到了同样的问题,并且正在评估相同的选项。您能否分享您选择的内容、执行情况以及您实施的解决方案的优缺点?谢谢
标签: http queue comet beanstalkd