HTTP回调URL与WebSocket的异步响应



我有两个服务器:Golang和Python(2.7)。Python (Bottle)服务器有一个计算密集型的任务要执行,并公开一个RESTful URI来启动该进程的执行。即Go服务器发送:

HTTP GET to myserver.com/data

python服务器执行计算,并需要通知Go服务器处理完成。我认为有两种设计方法:

  1. Go向Python发送一个回调URL/data, Python通过点击该URL进行响应。例句:

    HTTP GET | myserver.com/data | Data{callbackURI:goserver.com/process/results, Type: POST, response:"processComplete"}

  2. 让一个基于WebSocket的响应从Python返回到Go.

什么是更合适的设计?做其中一个比另一个有利/弊吗?除了错误情况(服务器崩溃等),Python服务器真正需要"通知"客户端的唯一事情是完成计算。这是唯一的回应。

在Go服务器上工作的团队不是很精通基于websockets/ajax的Go客户端(我也没有。但我从来没有写过一行Go:) #1似乎更容易,但我不知道它是否是一种可接受的设计方法,或者它只是一个黑客?中方建议如何开展这方面的工作?

如果你想做RESTful,那么当客户端请求HTTP GET myserver.com/data时,服务器应该返回一个202 Accepted状态码:

202年接受

请求已被接受进行处理,但处理尚未完成。请求最终可能被执行,也可能不被执行,因为在实际进行处理时可能不允许。没有像这样的异步操作重新发送状态码的工具。

202响应故意不明确。它的目的是允许服务器接受对其他进程(可能是每天只运行一次的面向批处理的进程)的请求,而不要求用户代理与服务器的连接持续到该进程完成。伴随此响应返回的实体应该包含请求当前状态的指示,或者是指向状态监视器的指针,或者是用户期望请求何时被满足的一些估计。

Python服务器可以返回一个ETA和一个URL到一个临时资源来请求操作的当前状态(例如:myserver.com/temp_data?processing_status)。然后由Go客户端通过请求该资源并读取ETA来等待任务完成。一旦处理完成,Python服务器可以返回一个410 Gone状态,其中包含新资源的最终URL。

这取决于这些信号发送的频率。如果是每秒多次,保持websocket打开可能更有意义。否则,请使用选项#1,因为它的开销更少,耦合也更松。

相关内容

  • 没有找到相关文章