我需要实现一些脚本,以将数据从一项服务导出到另一项服务。 Origin服务已使用PHP语言编写。目标服务在后台具有一个带有MQ的SOAP API,因此对该API的每个请求都将转换为消息,该消息进入队列并等待处理。 API服务器仅使用消息ID响应此请求,因此我需要以该消息ID为参数执行一个或多个额外请求,以获取状态和处理初始请求的结果。
主要问题是我要处理大量数据,下一个请求取决于上一个请求的结果。我将在客户端使用某种MQ服务,以使客户端“等待”成功处理上一个请求的结果。当前,在我们的项目堆栈中有2种此类服务:Kafka和Gearman。无需使用一些额外的服务就可以解决这些问题。
导出数据主要由带有文件夹和复杂复合元素的层次结构组成。例如,设想一些结构:
[
'title' => 'Cars',
'folders' => [
[
'title' => 'Chevrolet',
'folders' => [],
'files' => [
['file' => '/path/to/images/dir/camaro.jpg'],
['file' => '/path/to/images/dir/tahoe.jpg']
]
],
]
]
我必须通过API在目标服务上重现确切的结构。因此,根据API的功能,我必须执行多个请求:
// Ask API to create folder
>>> ['action' => 'create-folder', 'name' => 'Cars', 'parent' => 'null']
// Get ID of the message in queue
<<< ['status' => 'received', 'message-id' => 123]
// Request message status
>>> ['action' => 'get-message-result', 'message-id' => 123]
// Get ID of the created folder
<<< ['status' => 'created', 'folder-id' => 1]
// Perform next request using ID of created folder as parent ID
>>> ['action' => 'create-folder', 'name' => 'Chevrolet', 'parent' => 1]
<<< ['status' => 'received', 'message-id' => 124]
>>> ['action' => 'get-message-result', 'message-id' => 124]
<<< ['status' => 'pending']
// ... Maybe rerun request multiple times because of server delays
>>> ['action' => 'get-message-result', 'message-id' => 124]
<<< ['status' => 'created', 'folder-id' => 2]
// Upload physical file
>>> ['action' => 'upload-file', 'path' => '/path/to/images/dir/camaro.jpg']
<<< ['status' => 'received', 'message-id' => 125],
>>> ['action' => 'get-message-result', 'message-id' => 125]
// Get path to the uploaded file, generated by server
<<< ['status' => 'created', 'file-name' => '/tmp/_190402934.jpg'],
// Create DB record linked to that physical file
>>> ['action' => 'create-file', 'path' => '/tmp/_190402934.jpg'],
<<< ['status' => 'received', 'message-id' => 126],
>>> ['action' => 'get-message-result', 'message-id' => 126]
<<< ['status' => 'created', 'file-id' => 100],
// ... and so on
我想展示的主要内容是一个请求依赖于另一个请求。请求的结果不包含有关成功的数据,仅包含队列中消息的ID,因此要获取结果数据,需要在main之后执行未知数量的额外请求。而且只有在接收到所需数据(例如创建的文件夹的ID)之后,客户的队列才可以进入下一步。
您能否以有效的方式帮助我提出建议?是否可以使用Gearman或/和Kafka实施?
是否可以对客户端的MQ设置一些约束,从而仅在接收到上一个请求的所需结果后才限制服务启动下一个API请求(无论延迟和主请求之间的“获取消息结果”额外请求的数量如何)以及处理该请求的实际结果)?
也许您可以提出一些解决类似问题的示例,文章或书籍?