两个用户客户端之间通过 REST API 与 PHP 后端、WebSocket 和 Node JS 进行实时通信



就如何使用公共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()成功实现?

建议的系统架构

  • 节点 WebSocket 服务器(socket.io 接收/返回事件(
  • 具有 REST API 的 PHP 后端(访问/更改资源,将事件触发到 WebSocket(
  • 具有最终用户客户端的公共 API 的 Node JS 应用程序(响应延迟功能,直到收到事件(

请注意,PHP后端在此架构中无法替代,但是,WebSocket和Node JS应用程序是实现的灵活单元。

这种架构是否可以在没有严重服务器性能问题的情况下实现?有没有更好、更可行的方法来设计这种系统?Node JS应用程序是否能够处理多个具有响应延迟的并发请求,或者任何其他类型的Web应用程序(Python/Ruby/...(会更好?套接字是该系统的必备功能,以实现某种实时行为吗?

请分享任何想法/见解/建议/...什么可以帮助以复杂和性能良好的方式设计这个系统。

提前谢谢你!

一些注意事项:

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

希望这有帮助。

最新更新