Apollo InMemoryCache大数据集的性能策略(React)

时间:2018-05-31 14:26:03

标签: caching graphql apollo

从我试图调整的应用程序的Apollo Client GraphqQL查询中收到的初始数据集目前非常大。在"大"我的意思是,似乎数据在"数据"下正常化为大约7,000个条目。密钥在缓存中。有效载荷约为1.6MB。如果我要保存缓存的数据条目,它将标准化为大约3MB。我不喜欢初始查询的工作原理,因为我正在重新设计他们的应用程序以使用游标和过滤,而不是客户端获取如此大量的数据并过滤自身。由于当该软件安装在其他位置时将返回较大的数据集,因此当前的实现无法扩展。但是,我正在寻找一个短期解决方案,以便在我进行非常大的重新设计任务时使这个缓存更快地构建。

*更新2018年7月25日**光标方法不起作用,因为在获取数据的每个页面/光标期间添加更多条目时,缓存写入性能会降低。

真正的问题是,由于该浏览器的行业(医疗保健)使用,我们必须支持的IE 11非常慢。它很难衡量,但它在Apollo缓存区域中比Chrome慢了8-10倍,并且反应集成代码。 Chrome可能需要1-2秒才能在这些较慢的虚拟桌面上构建缓存,而IE则需要10-20秒。

所以,我的问题是:是否有任何性能调整可以帮助缓存更快地构建?我附上了截图,以显示瓶颈在哪里。它在Chrome中与IE中的相同,它在IE中的速度只有一个数量级。我不确定它是否是IE的缺点,或者它是否是一个非常糟糕的polyfill问题。屏幕截图显示了性能结果中显示的热点。是的,这个截图是React的开发版本,但是我们没有看到生产中任何真正明显的性能提升。屏幕截图实际上只是对图形的调用,最简单的HTML表格呈现大约260行。渲染阶段可以忽略不计。似乎有很多排队的事件或“工作”。在这个阶段。也许有办法暂停这个? Chrome的分析器显示相同的热点,它不会那么慢。

无论如何,非常感谢任何建议。

屏幕截图列是:function |调用次数|时间(秒)

IE11 performance screenshot

3 个答案:

答案 0 :(得分:0)

我们的团队面临着类似的问题。我们当前的方法是将服务器架构的一部分“非规范化”为String类型,该类型包含JSON字符串。在客户端,我们将解析Apollo客户端返回的JSON字符串。

答案 1 :(得分:0)

Apollo 3.0将提供一个选项来禁用类型的缓存规范化: https://www.apollographql.com/docs/react/v3.0-beta/caching/cache-configuration/#disabling-normalization

答案 2 :(得分:0)

我遇到了类似的问题(在 Apollo 客户端 3.3.6 上)。最终,很明显,这么大的集合不适合 Apollo 客户端缓存。我强烈建议您在缓存之外自行管理更大的数据集,而不是让自己承受几秒钟的处理时间(可能就在您加载应用程序时) - 原生 js map/filter/etc 快得多,而且可能是一个更适合取决于您为什么需要数据。只需传递选项 fetchPolicy: 'no-cache',即可看到您的应用程序显着加速。任何大型提取(数以千计的类型结果)都可能通过这种处理方式获得更好的结果。