【问题标题】:Connecting http request/response model with asynchronous queue使用异步队列连接 http 请求/响应模型
【发布时间】:2023-03-07 08:15:01
【问题描述】:

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

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

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

想法:

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

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

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

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

【问题讨论】:

  • 我遇到了同样的问题,并且正在评估相同的选项。您能否分享您选择的内容、执行情况以及您实施的解决方案的优缺点?谢谢

标签: http queue comet beanstalkd


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 任务多样且复杂——分析传入的数据,根据数据形成特征向量,执行算法匹配,最后从分类器中吐出各种匹配。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 2018-10-07
      • 2016-02-02
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多