2009-01-14 150 views
7

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

当用户的HTTP请求到达时,它会生成一个进入队列的工作请求(在这种情况下为beanstalkd)。其中一名工作人员提出要求,完成工作并准备回应。

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

思路:

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

  2. 让http客户端轮询响应。用户的初始HTTP请求会启动队列中的作业并立即返回。客户端(用户的浏览器)定期轮询响应。在后端,工作人员将其响应放入memcached,我们将nginx连接到memcached,因此轮询重量轻。使用Comet。与第二个选项类似,但用更加奇特的http通信来避免轮询。

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

+0

我有同样的问题,并在评估相同的选项的过程中。您能分享您选择的内容,执行方式以及实施解决方案的优缺点?谢谢 – tropikalista 2013-01-04 15:53:05

回答

0

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

虽然不知道你正在做什么任务,但要说明需要做什么或怎么做并不那么容易。然而,选项#2是最简单的,而且这可能是您所需要的全部 - 取决于您将什么推回给工人。

+0

这些任务是多种多样和复杂的 - 分析输入数据,根据数据形成特征向量,执行算法匹配,最后从分类器中吐出各种匹配。 – Parand 2009-01-16 21:22:04

1

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

我个人喜欢彗星(尽管我有点偏颇,因为我帮忙写了WebSync),但它很好地让你的客户订阅一个频道,并在你的服务器进程准备就绪时得到消息。像冠军一样工作。