将http请求/响应模型与异步队列连接

时间:2009-01-14 19:10:04

标签: http queue comet beanstalkd

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

当用户的HTTP请求到来时,它会生成一个进入队列的工作请求(在这种情况下为beanstalkd)。其中一名工人接受了请求,完成了工作并准备了回复。

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

思路:

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

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

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

  4. 我倾向于2,因为它很容易且很清楚(我还没有用过彗星)。我猜我可能还有一个更好的模型,我没有想过。你觉得怎么样?

3 个答案:

答案 0 :(得分:1)

这里的how to implement request-response efficiently on JMS可能会有所帮助(尽管以Java / JMS为中心)。一般的想法是为每个客户端/线程创建一个临时队列,然后使用correlationID将请求与回复相关联等。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

虽然不知道你正在做什么任务,但要说明需要做什么或如何做是不容易的。然而,选项#2是最简单的,可能就是你所需要的 - 取决于你推回工人的内容。