如何使用 GraphQL 发送持久数据结构及其随时间的变化?
How to send a persistent data structure and its changes over time using GraphQL?
我有一个反复出现的问题,我必须随着时间的推移跟踪数据结构并通过 GraphQL 传递它,例如,这可能是列表及其更改的时间轴:
[]
[1]
[1 2]
[-1 1 2]
[-1 2]
[2]
[]
我正在寻找一个允许我描述此数据结构及其更改并自动找到正确的 graphql 表示以仅发布差异的库?
例如将上面的结构分解为:
start empty
add 1
add 2
insert -1 in the beginning
etc.
在 GraphQL 术语中。
有人解决过这个问题吗?
理想情况下是 ReasonML(前端)和 Python(后端),但正在寻找任何示例。
您可以使用 graphql 订阅(有关详细信息,请参阅 apollo 文档)。
在开始查询当前状态。双方(服务器和客户端)将拥有相同的数据。两者都可以使用相同的库 f.e。 immutable.js
客户端调用订阅,开始监听'onListChange'消息。
在服务器上 insertElement
、removeElement
、updateElement
解析器正在做同样的事情:
- 处理后端状态的变化;
- 将
insert
(或remove
或update
)编码为actionType
,并将所需数据(变异参数、新创建的id、版本号)编码为payload
;
- 使用发布向订阅者发送此 ('onListChange') 消息。
客户:
- 收到消息;
- 解码消息并updates/mutates自己的状态(处理与服务器上相同的突变);
- 更新本地版本号。
作为结果,客户端应该具有相同的状态。
客户端可以检测丢失的消息(有效负载中传递的版本号与本地版本指示器相比)并强制[重新]查询当前(整个)状态。
更新
如果服务器端改变:
- 不受突变驱动(f.e。其他应用在同一个数据库上运行);
- 不是变化流,而只是新状态(新状态只是 arrives/is 从外部源读取);
... - 你没有机会将你的逻辑注入到应用变更的过程中 - 你应该有一个 运行 监控过程 来:
- 检测状态变化;
- 将状态差异转换为 'patches' 的集合(f.e。使用 jiff);
- 将补丁作为消息发布给订阅者。
客户端解码(消息是一个流)补丁到本地状态的突变(与服务器状态同步)作为更早。如上所述 - 如果版本匹配或重新查询整个状态,则应用更改。
Graphql 只是一个通信通道(查询、消息)——它没有处理此任务所需的任何东西(和双方的数据)。
我有一个反复出现的问题,我必须随着时间的推移跟踪数据结构并通过 GraphQL 传递它,例如,这可能是列表及其更改的时间轴:
[]
[1]
[1 2]
[-1 1 2]
[-1 2]
[2]
[]
我正在寻找一个允许我描述此数据结构及其更改并自动找到正确的 graphql 表示以仅发布差异的库?
例如将上面的结构分解为:
start empty
add 1
add 2
insert -1 in the beginning
etc.
在 GraphQL 术语中。
有人解决过这个问题吗?
理想情况下是 ReasonML(前端)和 Python(后端),但正在寻找任何示例。
您可以使用 graphql 订阅(有关详细信息,请参阅 apollo 文档)。
在开始查询当前状态。双方(服务器和客户端)将拥有相同的数据。两者都可以使用相同的库 f.e。 immutable.js
客户端调用订阅,开始监听'onListChange'消息。
在服务器上 insertElement
、removeElement
、updateElement
解析器正在做同样的事情:
- 处理后端状态的变化;
- 将
insert
(或remove
或update
)编码为actionType
,并将所需数据(变异参数、新创建的id、版本号)编码为payload
; - 使用发布向订阅者发送此 ('onListChange') 消息。
客户:
- 收到消息;
- 解码消息并updates/mutates自己的状态(处理与服务器上相同的突变);
- 更新本地版本号。
作为结果,客户端应该具有相同的状态。
客户端可以检测丢失的消息(有效负载中传递的版本号与本地版本指示器相比)并强制[重新]查询当前(整个)状态。
更新
如果服务器端改变:
- 不受突变驱动(f.e。其他应用在同一个数据库上运行);
- 不是变化流,而只是新状态(新状态只是 arrives/is 从外部源读取);
... - 你没有机会将你的逻辑注入到应用变更的过程中 - 你应该有一个 运行 监控过程 来:
- 检测状态变化;
- 将状态差异转换为 'patches' 的集合(f.e。使用 jiff);
- 将补丁作为消息发布给订阅者。
客户端解码(消息是一个流)补丁到本地状态的突变(与服务器状态同步)作为更早。如上所述 - 如果版本匹配或重新查询整个状态,则应用更改。
Graphql 只是一个通信通道(查询、消息)——它没有处理此任务所需的任何东西(和双方的数据)。