Reactjs 如何/在何处将服务器通信注入Flux工作流?

Reactjs 如何/在何处将服务器通信注入Flux工作流?,reactjs,websocket,client-server,flux,Reactjs,Websocket,Client Server,Flux,上下文 我们正在构建一个基于Flux的web应用程序,其中客户端(Flux/React/TypeScript)通过WebSocket(而不是HTTP GET)与服务器(C#)通信 当执行客户端操作时,我们通过web套接字连接向服务器发送命令请求 服务器总是以第一次启动响应(指示是否可以执行请求的操作)快速响应,然后以一个或多个进度响应(可能是数百个响应,其中包含有关已执行操作的进度信息)进行后续响应。当服务器上的操作完成时,最后一个进度响应的进度分数将为100%,并显示“OK”错误状态 请注意,

上下文

我们正在构建一个基于Flux的web应用程序,其中客户端(Flux/React/TypeScript)通过WebSocket(而不是HTTP GET)与服务器(C#)通信

当执行客户端操作时,我们通过web套接字连接向服务器发送命令请求

服务器总是以第一次启动响应(指示是否可以执行请求的操作)快速响应,然后以一个或多个进度响应(可能是数百个响应,其中包含有关已执行操作的进度信息)进行后续响应。当服务器上的操作完成时,最后一个进度响应的进度分数将为100%,并显示“OK”错误状态

请注意,某些服务器操作可能只需要100毫秒,但其他操作可能需要10分钟(因此会有进度响应,因此客户端可以向用户显示有关该操作的信息)

在客户中,我们有:

  • sendCommandRequest函数,我们调用它通过websocket向服务器发送命令请求
  • 处理函数handleCommandResponse(在websocket onMessage回调中调用)
我们的问题是:将服务器通信注入基于流量的应用程序的最佳方式是什么?我们应该在哪里向websocket发送调用,如何从websocket的回调返回到通量链中

提案

假设我们在客户端GUI中更改了一个visual effects参数(浮点数,在文本字段框中设置),这将触发服务器上生成新图像的操作。在服务器上执行此操作需要1秒

现在,这样做的方式是,GUI处理程序将向dispatcher发送一个Flux操作,dispatcher调用向其注册的存储的回调,然后存储根据操作负载更新其数据,并通过更改事件回调触发各种组件,使用新存储数据的setState来触发重新渲染

我们可以让商店在更改数据(如新参数值)时通过websocket向服务器发送命令请求。此时,存储将具有新的参数值,而图像仍然是最后接收到的图像(来自上一个命令的结果)

从那一刻起,服务器开始向客户端发送进度响应,这些响应到达websocket onMessage回调,最终的进度响应将包含新映像(2秒后)

在websocket onMessage回调中,我们现在可以向dispatcher发送第二个Flux操作,将新接收的映像作为有效负载,这将导致存储使用新映像更新其数据,这将导致侦听组件重新呈现

这方面的问题是:

  • Flux存储可以有部分更新的数据:只要服务器没有发回最终结果,存储就会有新参数,但仍然是旧图像
  • 我们现在需要两个Flux操作:一个由GUI用来表示用户做了一些更改,另一个由web套接字回调用来表示结果已经到达
  • 如果服务器端出现问题,Flux存储中将已经设置了新参数,而我们将永远不会收到新映像,因此存储中的数据将损坏
在Flux工作流中是否有更好的方式适应服务器通信? 有什么建议/最佳实践吗

如果服务器端出现问题,Flux存储中将已经设置了新参数,而我们将永远不会收到新映像,因此存储中的数据将损坏

以下是一些故障保护:

  • 缓存
我们在每个API节点上都有一个缓存层。这种技术不仅提高了延迟(高达20%),而且在依赖关系服务停止时提高了可用性。此外,依赖系统上的负载显著降低(在我们的例子中,负载降低了70%)。为了获得最大的灵活性,我们将缓存放在依赖项调用附近,并在实现中使用Guava

  • 依赖保护
有时,我们会注意到依赖项服务降级的模式,导致API系统中的线程暂停。这会显著降低吞吐量,并可能由于线程耗尽而导致系统停机。为了避免这种情况,我们对依赖项实施了积极的超时,并实现了一种自动机制,以在依赖项服务关闭时消除对它们的调用。这种技术显著提高了可伸缩性,因为线程现在可以继续,而不必等待超时

  • 推测性重试
在我们的分析中,与p95延迟相比,某些依赖项的p99(又称第99百分位)延迟往往过大。更一般地说,我们可以看到延迟急剧增加的模式。在发生延迟跳跃时,我们引入了并行重试,并使用收到的第一个响应。折衷是增加依赖系统的流量,以换取更低的延迟和错误率。在我们的例子中,这种方法将延迟降低了22%,错误率降低了81%

  • 重联算法
XMPP服务器在运行时可能会意外脱机 为连接的客户端和远程服务器的TCP连接提供服务。 由于此类连接的数量可能相当大,因此 寻求重新连接的实体使用的重新连接算法 可以对软件性能和网络性能产生重大影响 拥塞如果实体选择重新连接,它将:

SHOULD set the number of seconds that expire before reconnecting
  to an unpredictable number between 0 and 60 (this helps to ensure
  that not all entities attempt to reconnect at exactly the same
  number of seconds after being disconnected).

SHOULD back off increasingly on the time between subsequent
  reconnection attempts (e.g., in accordance with "truncated binary
  exponential backoff" as described in [ETHERNET]) if the first
  reconnection attempt does not succeed.
  • 恢复TLS
本规范描述了分发加密文件的机制 以o的形式向客户端发送会话状态信息