异步API请求相关消息队列的体系结构决策

时间:2019-05-18 08:39:06

标签: php soap architecture mq

我需要实现一些脚本,以将数据从一项服务导出到另一项服务。 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请求(无论延迟和主请求之间的“获取消息结果”额外请求的数量如何)以及处理该请求的实际结果)?

也许您可以提出一些解决类似问题的示例,文章或书籍?

0 个答案:

没有答案