Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.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
Javascript 来自事件流的实时UI同步_Javascript_Real Time_Single Page Application_Event Stream - Fatal编程技术网

Javascript 来自事件流的实时UI同步

Javascript 来自事件流的实时UI同步,javascript,real-time,single-page-application,event-stream,Javascript,Real Time,Single Page Application,Event Stream,我正在构建一个单页web应用程序,并计划利用服务器端事件流使客户端保持最新的更改 考虑到这一点,我想到了一个并发场景,我不确定我计划实施的解决方案是否是最好的: UI订阅事件流并从时间X接收所有新事件 UI在时间X从各个端点加载数据。例如,活动用户的总数 用户在时间X时被停用,并且一个UserDeactivated事件被添加到流中 用户界面在时间X+1时收到一个用户停用事件 在这一点上,UI不能盲目地将活动用户总数减少1,因为它已经加载的总用户数可能反映了已经停用的用户数 我计划用于解决此问题的

我正在构建一个单页web应用程序,并计划利用服务器端事件流使客户端保持最新的更改

考虑到这一点,我想到了一个并发场景,我不确定我计划实施的解决方案是否是最好的:

  • UI订阅事件流并从时间X接收所有新事件
  • UI在时间
    X
    从各个端点加载数据。例如,活动用户的总数
  • 用户在时间
    X
    时被停用,并且一个UserDeactivated事件被添加到流中
  • 用户界面在时间
    X+1
    时收到一个用户停用事件
  • 在这一点上,UI不能盲目地将活动用户总数减少1,因为它已经加载的总用户数可能反映了已经停用的用户数

    我计划用于解决此问题的方法是跟踪加载每一位数据的日期和时间,并在
    application\u loaded\u时间订阅事件流-一些偏移量
    ,以确保我没有遗漏任何事件

    然后,当收到一个事件时,每个订阅者都会检查他们负责维护的数据被提取的日期和时间,如果事件发生在
    data\u fetching\u datetime
    之后,他们会应用该事件;如果事件发生在
    data\u fetching\u datetime
    之前,则忽略该事件

    这是一个好的同步策略吗?我的方法有什么遗漏吗?有更好的办法吗

    我必须确保的一件事是,客户端时间不会与服务器不同步。我可能需要添加一个自定义HTTP头,指定何时开始处理请求

    对于单个聚合,我只能依赖已加载AR的版本和事件的版本,但对于聚合查询(如计数),没有这样的版本可供利用


    注:我不做活动采购或CQR,也没有预测。对于投影,每个视图都有一个序列号(上次处理的事件),我可以返回结果,但这里不是这样。我想我可以通过计算查询时特定类型的事件数来计算每个查询的版本号,但我不确定这是否会很好地执行。

    如果用“sequenceNumber”替换“time”,我想你会更接近实际.@VoiceOfUnreason序列号似乎可以用于单个聚合,但如何将序列号用于计数或求和等聚合操作?我可以计算一个包含在计数中的所有版本的散列,但我不确定以后如何使用该散列。每个流的序列号不够吗?然后,您可以建立视图,确切地知道您在处理每个视图时所处的位置stream@tomliversidge我在问题中添加了一条关于您评论的注释。事件最初是如何加载的?难道你不知道它们在流中的位置吗?我很困惑,为什么在收到一个新的停用事件时,你不能只是递减。我认为如果你用“sequenceNumber”代替“time”,你会更接近实际情况。@VoiceOfUnreason一个序列号对于单个聚合似乎很好,但我如何使用序列号进行聚合操作,如计数或求和?我可以计算一个包含在计数中的所有版本的散列,但我不确定以后如何使用该散列。每个流的序列号不够吗?然后,您可以建立视图,确切地知道您在处理每个视图时所处的位置stream@tomliversidge我在问题中添加了一条关于您评论的注释。事件最初是如何加载的?难道你不知道它们在流中的位置吗?我很困惑,为什么在收到一个新的停用事件时,你不能只是递减