首页 > 解决方案 > 客户端服务器数据交换持久性 - 气味

问题描述

假设我有一个客户端将一些带有输入的 RunLogicCommand 发送到服务器。服务器响应一些输出,这是供用户验证的报告。此时,服务器还没有持久化任何东西。然后客户端在一个单独的 SaveCommand 中发回整个报告,然后保存报告数据。

对我来说,这种交流的某些部分似乎是不必要的。也就是说,一旦用户验证了报告,他们似乎没有必要将整个报告发送回服务器以进行持久化。也许一些敏感数据也有可能在这里暴露?

在这种情况下,典型的方法是什么?

我可以看到两个选项:

  1. 用户只需再次发送带有 Input AGAIN 的 RunLogicCommand,并带有一些指定它应该被持久化的标志。我不太喜欢这个选项,因为逻辑可能很复杂并且需要一些时间来计算。
  2. 将报告缓存在服务器(或不同的服务甚至数据库)上,然后让客户端发回带有要保存的报告 ID 的 SaveCommand。

这些方法中的任何一种都有问题吗? 有没有更好、更典型的方法?

谢谢!

标签: webcachingarchitectureclient-servercqrs

解决方案


这里没有单一的最佳解决方案:

您首先提到的方法的缺点是:

  • 网络流量增加,可能会增加成本并导致响应时间变慢
  • 您能否确定您发送的文件与收到的文件相同。你可以,但这需要额外的工作。
  • 正如您所提到的,暴露敏感数据的风险增加了。但是,您将其发送给客户端。

您的两个选项中的第一个的缺点是:

  • 运行报告两次会增加服务器的负载,由于需要更多的处理能力而产生额外的成本。
  • 如果两个请求之间的基础数据发生了变化。那么经过用户验证的报告和存储在数据库中的报告可能不一样。

我会使用你的第二个选项的变体:

  • 报表一生成就存入数据库,状态为“等待用户验证”
  • 当用户验证报告时,将状态更新为已验证。
  • 为避免数据库中有许多未经验证的报告,您可以有一个批处理作业来检查并删除所有早于 x 天的未经验证的报告。

推荐阅读