web - 客户端服务器数据交换持久性 - 气味
问题描述
假设我有一个客户端将一些带有输入的 RunLogicCommand 发送到服务器。服务器响应一些输出,这是供用户验证的报告。此时,服务器还没有持久化任何东西。然后客户端在一个单独的 SaveCommand 中发回整个报告,然后保存报告数据。
对我来说,这种交流的某些部分似乎是不必要的。也就是说,一旦用户验证了报告,他们似乎没有必要将整个报告发送回服务器以进行持久化。也许一些敏感数据也有可能在这里暴露?
在这种情况下,典型的方法是什么?
我可以看到两个选项:
- 用户只需再次发送带有 Input AGAIN 的 RunLogicCommand,并带有一些指定它应该被持久化的标志。我不太喜欢这个选项,因为逻辑可能很复杂并且需要一些时间来计算。
- 将报告缓存在服务器(或不同的服务甚至数据库)上,然后让客户端发回带有要保存的报告 ID 的 SaveCommand。
这些方法中的任何一种都有问题吗? 有没有更好、更典型的方法?
谢谢!
解决方案
这里没有单一的最佳解决方案:
您首先提到的方法的缺点是:
- 网络流量增加,可能会增加成本并导致响应时间变慢
- 您能否确定您发送的文件与收到的文件相同。你可以,但这需要额外的工作。
- 正如您所提到的,暴露敏感数据的风险增加了。但是,您将其发送给客户端。
您的两个选项中的第一个的缺点是:
- 运行报告两次会增加服务器的负载,由于需要更多的处理能力而产生额外的成本。
- 如果两个请求之间的基础数据发生了变化。那么经过用户验证的报告和存储在数据库中的报告可能不一样。
我会使用你的第二个选项的变体:
- 报表一生成就存入数据库,状态为“等待用户验证”
- 当用户验证报告时,将状态更新为已验证。
- 为避免数据库中有许多未经验证的报告,您可以有一个批处理作业来检查并删除所有早于 x 天的未经验证的报告。
推荐阅读
- reactjs - 尝试从 s3 删除图像时出现 403(禁止)
- mysql - 寻求正确的MySql“IF”方法指南
- javascript - 获取 URL 字符串的特定部分
- kdb - 并行执行:阻塞接收、延迟同步
- apache-flink - Flink (1.11.2) - 尽管设置了正确的插件,但找不到 S3 的实现。使用 JDK11 和 Scala 2.12.11
- python - 在中间件上下文中获取 starlette 请求正文
- python - 如何使用 python 停止 shell 命令?
- javafx - 在弹出模式中插入数据并在父项中刷新数据
- .net - 可以在不同的输出目录中复制文件
- javascript - AWS 识别面部 API:从面部裁剪牙齿部分(嘴巴)