Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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
使用带有React和Apollo的graphql订阅创建实时应用程序_Graphql_Graphql Js_Apollo_React Apollo_Graphql Subscriptions - Fatal编程技术网

使用带有React和Apollo的graphql订阅创建实时应用程序

使用带有React和Apollo的graphql订阅创建实时应用程序,graphql,graphql-js,apollo,react-apollo,graphql-subscriptions,Graphql,Graphql Js,Apollo,React Apollo,Graphql Subscriptions,我正在使用React、Apollo和GraphQL构建一个实时应用程序。我的计划是,组件将发出一个查询,然后依靠订阅来实时保持客户端缓存与后端数据的一致性。但是,我认为这不会起作用,因为在卸载组件时,我必须取消订阅。当组件再次装载时,结果将从查询缓存中获取,因此它们实际上将过期,因为在订阅关闭后,将丢失其间发生的所有更改。此外,再次打开订阅将意味着结果将变得一团糟,因为在这两次更改之间错过了更改 例如,在组件A中,如果我有查询:- query { customers { id

我正在使用React、Apollo和GraphQL构建一个实时应用程序。我的计划是,组件将发出一个查询,然后依靠订阅来实时保持客户端缓存与后端数据的一致性。但是,我认为这不会起作用,因为在卸载组件时,我必须取消订阅。当组件再次装载时,结果将从查询缓存中获取,因此它们实际上将过期,因为在订阅关闭后,将丢失其间发生的所有更改。此外,再次打开订阅将意味着结果将变得一团糟,因为在这两次更改之间错过了更改

例如,在组件A中,如果我有查询:-

query {
  customers {
    id
    name
    phoneNo
  }
}
及订阅:-

subscription customersUpdated {
  customersUpdated {
    id
    name
    phoneNo
  }
}
客户查询在第一次装入时运行。结果被缓存。在subscription CustomerUpdate的帮助下记录对客户数据的所有更改。请注意,订阅不会返回所有客户,只返回需要合并到查询缓存中的更改。卸载时,我将取消订阅。假设另一个用户对客户数据进行了5次更改,而当前用户的A保持卸载状态。再次装载时,这5个更改已丢失,查询只从缓存中获取结果。订阅再次启动,但现在数据处于错误状态,因为我们错过了这5项更改,永远无法获得它们


在这里使用订阅的正确模式是什么?我试图避免使用查询进行基于时间的重新蚀刻,因为我希望应用程序能够实时工作。同样是实时的,我只想拉取更改,而不是不必要地拉取所有数据。

您可以做以下几件事:

只需在GraphQL查询上使用“仅网络”或“缓存和网络获取”策略,即可在装载组件时获取最新数据。像往常一样初始化订阅。 不要在组件卸载时停止订阅,并在组件之外处理订阅生命周期。这可能需要更多的工作,但是你可以控制它何时开始和停止。
然而,我鼓励你更多地思考你的应用程序的哪些部分需要实时性。在大多数应用程序中,只有一小部分体验需要低延迟的数据更新,因此只有在小情况下使用订阅可能是更好的策略。归根结底,对无状态体系结构的扩展进行推理通常更容易。

我想做一些类似firebase的事情,其中所有内容都是实时的,所有数据都通过套接字发送。我必须弄清楚我现在应该采取什么方法。谢谢你的选择!订阅的另一个问题是,似乎每个订阅都会打开与服务器的新连接,这意味着服务器可能必须处理太多的负载。难道不能只通过一个套接字连接完成所有的订阅吗?所有的订阅都通过一个连接运行,是不是有什么东西使每个连接看起来都有一个新的连接?是的,如果你想要像Firebase一样工作的东西,那么Firebase是最好的选择——GraphQL没有相同的功能集。如果你想要一个一切都是实时的开源解决方案,你也可以试试Meteor。使用gun js和graphql构建一个实时离线的第一个应用程序怎么样?我将再次检查连接问题。我得到一个错误,似乎表明有多个连接。你可以试试阿波罗链接火基。它支持使用apollo link和firebase客户端js sdk进行实时订阅。