首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >姜戈:芹菜与频道对战

姜戈:芹菜与频道对战
EN

Stack Overflow用户
提问于 2017-06-05 17:16:03
回答 1查看 1.1K关注 0票数 4

假设我的页面上有一个按钮,当单击该按钮时,会向我的api端点发出ajax请求,然后从第三方站点获取数据。假设这个任务大约需要2-5秒,超时时间为5秒。最理想的方法是什么?

  1. 在api端点中使用芹菜task.delay(),并返回一个url以每隔x段轮询结果。
  2. 在视野里做吧

我所见过的所有教程都提出了芹菜的方法,但对于处理最少的简单请求来说,这似乎是一种很大的机械/开销。是否存在一些普遍接受的阈值(秒直到完成,等等)哪一个人会选择一个而另一个?

然后是django频道,这似乎是理想的选择。但是,乍一看,区分渠道工人和芹菜任务的界限似乎模糊了。我是否可以用渠道工人来代替芹菜,用它来完成上述的任务?频道也会处理我运行时间较长的任务吗?渠道(芹菜或代替芹菜)的优点/缺点是什么?

最后,3种(芹菜/频道/观景)中的哪一种将是推荐的示例场景的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-05 20:50:06

我不是渠道方面的专家,但我们开始了。

通道是WSGI之上的抽象(新协议是ASGI),它允许您通过“抽象”通道进行通信。有时候你会做HTTP,有时是websockets,有时你可以做很多其他的事情--你几乎可以做任何一种通信模式。

芹菜是以类似的方式构造的,它使用消息总线(有时是一种更复杂的代理机制,取决于您如何运行它)将工作发送到可以返回可选结果的工作机器。

现在你选择哪一个?

在视野中

除非您有专门为此目的设计的视图,否则我将避免这种情况。您需要确保您的堆栈能够处理长时间的连接(例如,heroku的路由器会抱怨超过30秒),或者您希望实现一些长轮询接口。

芹菜

你需要做所有的设置才能让事情在线。

有一个任务,其结果需要一个结果后端,并在周围传递任务ID。

您将需要实现一个可以查询芹菜的视图,以确定任务在完成、成功等方面的位置。

例如:

代码语言:javascript
复制
# kick of the task somewhere

def create_task(request, *args, **kwargs):
    task_id = some_task.delay(param)
    return Response({'task_id': task_id})

urls.py

代码语言:javascript
复制
url(r'^/tasks/<task_id>/$', name='task-progress')

views.py

代码语言:javascript
复制
def task_progress_view(request, task_id):
    # get fancier here, this is just an example
    return Response(some_task.AsyncResult(task_id).state)

这是一个非常简单的例子,但这应该作为一个起点。

有通道

您将需要设置一个总线,以与芹菜相同的方式将所需的视图组合在一起,只是您仍然需要一段代码,它可以用重试、超时逻辑等来获取数据。

选择什么?

芹菜将负责工作部分,你将不得不负责更新和通知你的客户。渠道将是一个合理的方式来处理这回和第四,但你可能不需要它。

我会考虑你还需要做什么。大多数应用程序在某一时刻都需要异步工作,因为业务逻辑常常要求异步工作。如果您计划使用websockets之类的,但您不想将django应用程序分解为服务,我就会咬紧牙关,两者兼而有之。

如果您不需要一个以上的通信协议,只需使用芹菜和做视图。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44374212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档