Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 创建live collaborative React.js应用程序时,如何在用户之间同步Redux操作?_Reactjs_Redux_Amazon Dynamodb_Serverless - Fatal编程技术网

Reactjs 创建live collaborative React.js应用程序时,如何在用户之间同步Redux操作?

Reactjs 创建live collaborative React.js应用程序时,如何在用户之间同步Redux操作?,reactjs,redux,amazon-dynamodb,serverless,Reactjs,Redux,Amazon Dynamodb,Serverless,我正在开发一个“live”collaborative React.js应用程序。应用程序的状态由Redux管理,因此我有一个应用程序状态对象以及一个执行(调度)操作的列表,这些操作会导致状态的每个变化 不同的用户可以“访问”应用程序的同一实例(通过访问具有GUID的唯一url),即应用程序状态是共享的。当用户执行某个操作时,该操作将被发送到后端(AWS API Gateway>Lambda),后端将该操作存储在dynamoDB中,并将其分发给其他客户端 然后,所有连接的客户端运行自最新“快照”以

我正在开发一个“live”collaborative React.js应用程序。应用程序的状态由Redux管理,因此我有一个应用程序状态对象以及一个执行(调度)操作的列表,这些操作会导致状态的每个变化

不同的用户可以“访问”应用程序的同一实例(通过访问具有GUID的唯一url),即应用程序状态是共享的。当用户执行某个操作时,该操作将被发送到后端(AWS API Gateway>Lambda),后端将该操作存储在dynamoDB中,并将其分发给其他客户端

然后,所有连接的客户端运行自最新“快照”以来由其他用户执行的操作(从后端接收到这些操作后),以便最终所有用户的客户端都达到相同的状态。请注意,快照只是某个时间戳处应用程序状态的完整副本,因此不需要为每个实例执行所有生存期操作,而只需要执行自最新快照以来的操作

这个很好用。我唯一的挑战是正确同步不同操作发生的顺序。我的想法是在服务器端转换每个动作的
createdAt
(也可以被命名为
dispatchedAt
)时间戳,以获得一个时间戳,该时间戳可以与用户的时钟设置或时区进行比较:

serverCreatedAt = serverNow - (clientNow - clientCreatedAt)
其中,
clientNow
是客户端向服务器提交操作时的时间戳,
clientCreatedAt
是客户端发送(创建)操作时的时间戳,
serverNow
是服务器上的当前时间戳(即,它是可靠的),而
serverCreatedAt
是当前服务器时间戳减去动作被调度的时间

虽然这种方法在大多数情况下都是有效的,但它是有缺陷的,因为它不考虑等待时间:如果客户端A的请求需要2秒才能到达服务器,而客户端B的请求需要0.5秒才能到达服务器,转换后的
serverCreatedAt
时间戳可能表明客户端A的操作是在客户端B的操作之后执行的,即使不是这样


实时协作系统通常如何处理这样的问题:客户端的时钟不可信,网络延迟导致服务器端接收操作的时间不可靠?

我想您已经回答了自己的问题。仅依靠服务器时钟来确定创建操作的时间,接受一些差异(例如,一个用户在另一个用户之前单击按钮10毫秒并不意味着他的操作将首先被记录)。因此,没有更好的方法,例如,考虑延迟的一个?您可以在每个客户端上创建应用程序状态和特定用户操作的副本,并在本地记录操作。然后,在某个点上,在服务器上合并它们并传播更改,如下所述: