【问题标题】:why using messaging queue in web applications为什么在 Web 应用程序中使用消息队列
【发布时间】:2013-07-08 06:07:51
【问题描述】:

在使用 Django 开发我的 Web 应用程序时,我遇到了一个问题,当我在本地调用某些函数时它们可以正常工作,但是一旦我通过 HTTP 请求调用它们,它们就不会被执行。 我四处询问,并被告知使用 celery 和消息队列服务器在请求响应周期之外异步执行它们,它运行良好,但我仍然不明白为什么我必须异步执行某些任务,即使我没有竞争条件,并且只有一个客户端调用 Web 服务。 这对我来说是一个很大的黑点,因为我在不知道如何做的情况下让它工作。 谁能给我解释一下?

谢谢。

【问题讨论】:

  • 你能展示一些代码和你的问题吗?
  • def comp(request): p = subprocess.Popen(['javac',filepath],stdout=subprocess.PIPE,stderr=subprocess.PIPE, bufsize=100) res, err =p.当我通过 http 调用此应用程序时,communicate() 返回 HttpResponse (err) 直到我使用 celery 并定义了一个任务,我在请求/响应周期之外执行编译时它才起作用
  • 使用开发服务器时是否有效?

标签: django httprequest message-queue


【解决方案1】:

我所知道的基于队列的系统的两个主要好处是:

第一,无需等待工作完成即可向客户提供响应。这让页面加载速度更快,客户等待的时间更少。

其次,队列为您提供了多个工作人员可以从中提取的预定作业的中心位置。如果您的应用程序的某个组件无法跟上要做的工作量(或者如果它由于某种原因失败),您可以让该组件的其他实例来完成工作,并且有一个地方可以所有需要做的工作都可以找到。

【讨论】:

  • 谢谢你的回答,但我调用的函数是编译一个 .java 文件,其中写了一个简单的 hello world,我认为这不是一个很大的工作量,而且没有理由让它失败,但是当在本地调用它时它可以工作,当它处于请求/响应周期时它不会
  • @JPR 正在回答您提出的问题。如果您真正想要的答案是“为什么这个函数不能通过 HTTP 工作,但在从 celery 调用时可以工作”这个问题,那么你需要提出这个问题。
猜你喜欢
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2015-10-18
  • 2014-10-11
  • 1970-01-01
  • 2018-01-29
相关资源
最近更新 更多