【问题标题】:Real-time communication between two user-clients via REST API with PHP backend, WebSocket and Node JS通过带有 PHP 后端、WebSocket 和 Node JS 的 REST API 在两个用户客户端之间进行实时通信
【发布时间】:2020-10-09 18:45:04
【问题描述】:

就如何使用公共 API 设计系统以供用户客户端通信寻求架构建议。

我正在开展一个项目,其中两个客户必须能够以尽可能最简单的方式相互实时(或接近实时)通信。让我们介绍必须由两个单独的客户端访问的资源。工作流程如下:

  1. 客户端 #1 连接到服务器并创建资源
  2. 客户端 #2 连接到服务器并访问资源
  3. 客户端 #1 更改资源
  4. 客户端 #2 更改资源
  5. 重复步骤 34 直到完成。

在对方客户未采取行动之前,客户无法采取行动 - 必须保留请求顺序。


客户端应该能够通过 REST API(GETPOSTPUTDELETE)访问资源。每个客户端必须等到对方客户端执行操作。客户端响应和执行操作的时间约为 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


    【解决方案1】:

    一些注意事项:

    1. 不惜一切代价避免睡眠。
    2. 您的用例往往适合发布/订阅微服务模式。
    3. 由于您需要保留消息处理顺序,您需要有一个公共队列。您的每个 REST API 节点都充当分布式消息队列系统(RabbitMQ、Kafka 等技术类型)上的发布/订阅发布者。因此,对于高吞吐量,您现在有一个处理队列的机器农场。它们立即返回 201 Accepted,但需要一种方法来使用某种客户端标识符标记消息,以便您可以通过 Web 套接字将更新消息路由回(如果您不打算通过资源 id 轮询状态更新)。
    4. 您需要此队列的订阅者才能进行实际处理。同样的,将它们作为单独的应用程序,现在您可以扩展出队和处理。但是,您为 pub/sub 总线选择的技术需要能够使该资源的后续消息无效,并且对于每条无效消息都向您的应用程序提供反馈,以便它可以通过 Web 套接字发送所需的消息。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-11
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 2018-01-29
      相关资源
      最近更新 更多