Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为长期任务创建RESTAPI的最佳方法?_Rest_Callback_Api Design - Fatal编程技术网

为长期任务创建RESTAPI的最佳方法?

为长期任务创建RESTAPI的最佳方法?,rest,callback,api-design,Rest,Callback,Api Design,假设我有两台服务器 第一种是提供一些计算的服务,可以持续很长时间(几分钟到几小时) 第二台服务器将使用此服务计算一些数据 我正在尝试为第一台服务器设计一个RESTAPI,到目前为止还不错。但我想听听关于如何在长期任务完成后对通知建模的一些意见 到目前为止,我考虑了两种方法: 轮询-第二台服务器将不时询问结果 回调-第二个服务器将为第一个服务器设置uri,以便在完成后调用。但在RESTAPI中这有点异味 你觉得怎么样?如果你使用Python,你可以利用RabbitMQ和芹菜来完成这项工作。芹菜允许

假设我有两台服务器

第一种是提供一些计算的服务,可以持续很长时间(几分钟到几小时)

第二台服务器将使用此服务计算一些数据

我正在尝试为第一台服务器设计一个RESTAPI,到目前为止还不错。但我想听听关于如何在长期任务完成后对通知建模的一些意见

到目前为止,我考虑了两种方法:

  • 轮询-第二台服务器将不时询问结果
  • 回调-第二个服务器将为第一个服务器设置uri,以便在完成后调用。但在RESTAPI中这有点异味
    你觉得怎么样?

    如果你使用Python,你可以利用RabbitMQ和芹菜来完成这项工作。芹菜允许您在队列中创建一个项目,然后暂停执行您正在运行的任何内容(即:Django),这样您就可以在队列处理器的输出可用时使用它。不需要轮询或回调。

    除了我所做的之外,我建议使用Atom发布协议进行通知(您可以发布到第二台服务器)。

    对于您的情况,我会选择轮询。当第二台服务器发出在第一台服务器上创建作业的初始请求时,它应该得到一个包含最终状态页面url的响应。然后,第二台服务器每隔5-15分钟轮询一次该url,以检查作业的状态。如果第一台服务器将该url设置为RSS或Atom提要,那么用户还可以将其RSS阅读器指向同一url,并自行确定任务是否完成。当人和机器都可以从单一来源获取信息时,这是一个真正的胜利。

    除非你了解芹菜(即你是作者),否则我只会直接使用Rabbit MQ+pika,为自己省去一大堆痛苦(异常消失、链接根本不起作用、与gevent的奇怪兼容性问题等)。您可能会让它工作,但如果您正在做任何远程复杂的事情,芹菜会将您隐藏在您可能需要的大量实际工作实现细节之外。使用回调方法是否天生就是错误的?我有一个非常类似的问题(除了我的服务可能需要2到500秒的响应时间),使用回调似乎比轮询简单得多一个简短的解释和一个指向Atom发布协议解释的链接将大大改进这个答案。