【发布时间】:2020-10-09 18:45:04
【问题描述】:
就如何使用公共 API 设计系统以供用户客户端通信寻求架构建议。
我正在开展一个项目,其中两个客户必须能够以尽可能最简单的方式相互实时(或接近实时)通信。让我们介绍必须由两个单独的客户端访问的资源。工作流程如下:
- 客户端 #1 连接到服务器并创建资源
- 客户端 #2 连接到服务器并访问资源
- 客户端 #1 更改资源
- 客户端 #2 更改资源
- 重复步骤 3 和 4 直到完成。
在对方客户未采取行动之前,客户无法采取行动 - 必须保留请求顺序。
客户端应该能够通过 REST API(GET、POST、PUT、DELETE)访问资源。每个客户端必须等到对方客户端执行操作。客户端响应和执行操作的时间约为 1-2 秒(可能略有不同)。
请注意,系统应该能够处理高负载的并发请求(多个客户端同时通信)。
该应用程序的全球目标是提供一个 API,使使用多种不同语言编程的客户端可以实时通信,而无需在用户客户端进行任何轮询实现。用户客户端必须尽可能简单。
伪用户-客户端示例
response = init();
while (response->pending) {
response = get();
}
while (response->action_required) {
response = act();
if (response->error || response->timeout) {
response = get();
}
}
function init() {
// POST resource.example.com
}
function act() {
// PUT resource.example.com
}
function get() {
// GET resource.example.com
}
问题陈述
由于每个客户端都必须等到对方客户端采取行动,因此需要在代码中引入 sleep() 函数,这将延迟响应,直到 资源 受到对方的影响/更改客户。
请求轮询必须从用户客户端省略,并在服务器端实现。
当前的想法和建议
最初的想法是只实现 PHP 后端并在 API 函数中执行响应延迟,但是,这种实现似乎会导致严重的性能问题,所以我正在考虑一个更复杂的解决方案。或者我错了,可以在 PHP 后端使用sleep() 成功实现响应延迟?
建议的系统架构
- Node WebSocket 服务器(socket.io 接收/返回事件)
- 带有 REST API 的 PHP 后端(访问/更改资源,向 WebSocket 触发事件)
- 带有公共 API 的 Node JS 应用程序,用于最终用户客户端(响应延迟功能,直到收到事件)
请注意,PHP 后端在此架构中无法替换,但 WebSocket 和 Node JS 应用程序是灵活的实现单元。
如果没有严重的服务器性能问题,这种架构是否可以实施?有没有更好、更可行的方法来设计这种系统? Node JS 应用程序是否能够处理具有响应延迟的多个并发请求,或者任何其他类型的 Web 应用程序(Python/Ruby/...)会更好地服务?为了实现某种程度的实时行为,该系统是否必须具备套接字?
请分享任何想法/见解/建议/...什么有助于以复杂且性能良好的方式设计此系统。
提前谢谢你!
【问题讨论】:
标签: php node.js api socket.io architecture