我有两个应该相互通信的API。第一个发送第二个文件,必须对其进行处理。但是,处理时间未知,可能需要一段时间。
我想到的解决方案如下-处理就绪后,第二个API向第一个API发送请求,并返回结果。 问题在于,在所有时间内,第一个API的请求一直在等待响应,因为我还没有返回控件,这导致了死锁。
我的问题是如何尽快将结果返回到第一个API(类似于接收到的结果:true / false),继续进行处理并在单独的请求中发送结果(来自处理过程)。
我正在使用Laravel 5.2和Guzzle进行请求。
答案 0 :(得分:0)
首先,这是概念证明,不是有效的代码,可能需要重做。
您应该从第一个api调用第二个api,以告诉它处理某些事情。
第二个api一旦接收到数据(而不是一次处理),就应该响应。
use GuzzleHttp\Client;
public function callApiTwo(Request $request)
{
$client = new Client()
$data = [];
$res = $client->post('http://apitwoexample.com', [
'body' => json_encode($data)
]);
if ($res->getStatus() !== 203) {
// error in processing
}
$resData = json_decode($res->getBody()->getContents());
$token = $resData['token'];
return response()->json([
'success' => 'Data is being processed',
'token' => $token
], 202);
}
第二个api然后应该接收数据(文件链接,图像,数据等)并调度作业(如@jonathon所述)。
然后,您需要某种process
/ job
/ record
的标识符。某种id
或token
。这会在响应中发送回第一个api。
public function executeProcess(Request $request)
{
// Perform logic
$token = str_rand(10);
Job::dispatch('/job/which/needs/time/to/run', [
'data' => $data,
'token' => $token
]);
return response()->json([
'success' => 'Data is being processed',
'token' => $token
], 202);
}
public function progressStatus(Request $request)
{
$model = Model::whereToken($request->token)->first();
return response()->json([
'status' => $model->status
], 200);
}
您会注意到progressStatus
方法,以我为例,它通过一些标识符检查process
/ job
/ record
的进度。
可以从第一个api触发artisan
命令或job
,然后根据第二个api是否已确认第二个api重新排队以重新触发(在延迟之后)处理完成。
让我知道是否需要进一步说明。