9

将同步 http 请求/响应模型与基于异步队列的模型连接起来的好方法是什么?

当用户的 HTTP 请求到来时,它会生成一个进入队列的工作请求(在本例中为beanstalkd)。其中一名工作人员接听请求,完成工作并准备响应。

队列模型不是请求/响应——只有请求,没有响应。所以问题是,我们如何最好地将响应返回到 HTTP 世界并返回给用户?

想法:

  1. Beanstalkd 支持轻量级主题或队列(他们称之为管)。我们可以为每个请求创建一个管道,让工作人员在该管道上创建一条消息,并让 http 进程在管道上等待响应。不要特别喜欢这个,因为它有 apache 进程坐在那里占用内存。

  2. 让 http 客户端轮询响应。用户的初始 HTTP 请求启动队列中的作业并立即返回。客户端(用户的浏览器)定期轮询响应。在后端,worker 将其响应放入 memcached,我们将 nginx 连接到 memcached,因此轮询是轻量级的。

  3. 使用彗星。类似于第二个选项,但使用更高级的 http 通信来避免轮询。

我倾向于 2,因为它很容易而且众所周知(我还没有使用过彗星)。我猜可能还有一个我没有想到的更好的明显模型。你怎么看?

4

3 回答 3

1

以下是如何在 JMS 上有效地实现请求-响应,这可能会有所帮助(尽管以 Java/JMS 为中心)。总体思路是为每个客户端/线程创建一个临时队列,然后使用相关 ID 将请求与回复等相关联。

于 2009-01-14T21:20:41.543 回答
1

轮询是简单的解决方案;彗星是更有效的解决方案。你已经搞定了:)

我个人喜欢彗星(虽然我有偏见,因为我帮助编写了WebSync),它很好地让您的客户订阅频道并在您的服务器进程准备好时收到消息。像冠军一样工作。

于 2010-01-11T20:37:57.463 回答
0

我正在寻找实现一个 Beanstalkd 和 memcached 系统以在请求之后运行多个进程 - 在这种情况下,在用户登录时查找信息(例如用户等待的消息数)。信息存储在 Memcached 中,然后在下一页加载时读回。

但是,如果不了解您正在执行的任务,就很难说出需要做什么或如何做。然而,选项 #2 是最简单的,这可能就是您所需要的 - 取决于您向工人推回的内容。

于 2009-01-15T19:22:15.497 回答