Remix 的并发提交从根本上存在缺陷(没有因果排序)

主要观点

  • 作者尝试 ChatGPT 新 UI 时发现 Remix 提交和重新验证的权衡存在缺陷,不能可靠地为大多数应用提供并发性页面中概述的属性。
  • 剖析了 Remix 的提交和重新验证模式,指出其在并发请求下存在数据不准确和用户体验不佳的问题,如先完成重新验证的可能包含较早版本数据等。
  • 探讨了单获取/往返突变方式,虽可避免双请求但仍无法保证提交读取到最新数据,且潜在显示陈旧数据的可能性更大。
  • 提出了解决方案,包括因果排序(需保持每个 Node.js 进程中的历史记录且依赖粘性会话)和全程持久化(如 Phoenix LiveView 使用 WebSockets 保证事件处理顺序),同时提到要考虑取消提交的问题及可能导致的用户看到陈旧数据等情况。

关键信息

  • Remix 提交和重新验证模式的具体流程及存在问题,如两次往返服务器、数据顺序不确定等。
  • 单获取/往返突变方式的示例及可能出现的陈旧数据问题。
  • 因果排序和全程持久化两种解决方案的思路及各自的优缺点,如因果排序需保持历史记录和依赖粘性会话,全程持久化使用 WebSockets 保证顺序但需考虑基础设施等。
  • 取消提交可能带来的问题及对用户体验的影响。

重要细节

  • ChatGPT UI 采用 Remix 且存在两次往返服务器导致的延迟问题及常见原因。
  • 以删除表格中三行数据为例说明提交和重新验证模式下可能出现的 UI 显示错误。
  • 解释单获取/往返突变方式中提交顺序可能导致的数据不一致问题及原因。
  • 详细阐述因果排序中利用粘性会话和事件系统保证提交顺序的方式及好处,以及可能的替代方案(利用数据库事务和锁)。
  • 说明 Phoenix LiveView 使用 WebSockets 实现全程持久化的过程及相关代码位置。
  • 强调取消提交可能导致服务器接收已取消的请求并在后续提交后处理,可能给用户带来错误数据等问题。
阅读 12
0 条评论