在客户端完成链中的一些 Web 服务调用后持久化相关数据
Persisting related data after client has completed some web service calls in a chain
考虑到我们的应用程序有一些用户设置的配置,我们需要备份这些数据以便以后恢复它们。
配置是不同对象的列表,我为每个对象列表创建了一些 Web 服务,应用程序在链中调用它们,这意味着从一个服务获得成功响应后,它们将调用下一个服务。
现在是什么问题...
我需要将每个服务数据存储在某个地方,在前端完成最后一个服务调用后,我将使用从客户端接收到的数据创建最终对象并将其保存在数据库中(此处 MongoDB)。
实施此策略的最佳方法是什么?考虑到我不想为每个服务保留每个对象列表,我需要将整个对象保留一次。
有没有办法在调用其他服务之前将请求的主体存储在某个地方?
什么是最好的?
我将不胜感激任何对我有帮助的线索或解决方案!
最佳方法:
在客户端存储所有对象,只向服务器发送一个请求。
它减少了服务器端的资源使用。
备选方案:
如果您真的想通过多个请求来处理它(我不推荐这样做),那么一种策略是:通过与该会话相关的标识符(最佳候选者是 JSESSIONID)将每个请求的对象存储到 temporary_objects_table 并在最终请求后将其存储在主表中。
并且在该会话的任何服务失败时,从 temporary_objects_table 中删除具有该 sessionid 的记录。
与第一种方法相比,它的复杂性要高得多。
经过一番研究,我找到了答案:
和
您不能使用事务,因为通过 REST,客户端维护客户端状态,服务器维护资源状态。因此,如果您希望客户端维护资源状态,那么它就不是 REST,因为它会违反无状态约束。违反无状态约束通常会导致糟糕的可伸缩性。在这种情况下,它会导致糟糕的水平可伸缩性,因为您必须在实例之间同步正在进行的事务。所以请不要尝试在 REST 服务之上构建多阶段提交。
可能的解决方案:
- 你可以坚持即时一致性,只使用一个
webservice 而不是两个。通过数据库、文件系统等资源,
等等,多阶段提交是必要的。当你分手一个
更大的 REST 服务并将这些资源的使用转移到
多个较小的 REST 服务,那么如果您这样做可能会出现问题
这种分裂是错误的。这是因为其中一个 REST 服务将
需要一个它无权访问的资源,因此它必须
使用另一个 REST 服务来访问该资源。这将迫使
多阶段提交代码移动到更高的抽象级别,到
REST 服务的级别。您可以通过合并这两个 REST 来解决这个问题
服务并将代码移动到它所在的较低抽象级别
属于。
- 使用具有最终一致性的 REST 的另一种解决方法,这样您就可以
立即接受 202 响应,您可以处理
稍后接受请求。如果您选择此解决方案,那么您必须
通过开发您的应用程序意识到 REST 服务不是
始终同步。 Ofc。这种方法仅适用于内部 REST 服务
如果 REST 服务不可用,您可以确定客户端会重试
可用,因此如果您编写 运行 客户端代码。
考虑到我们的应用程序有一些用户设置的配置,我们需要备份这些数据以便以后恢复它们。
配置是不同对象的列表,我为每个对象列表创建了一些 Web 服务,应用程序在链中调用它们,这意味着从一个服务获得成功响应后,它们将调用下一个服务。
现在是什么问题...
我需要将每个服务数据存储在某个地方,在前端完成最后一个服务调用后,我将使用从客户端接收到的数据创建最终对象并将其保存在数据库中(此处 MongoDB)。
实施此策略的最佳方法是什么?考虑到我不想为每个服务保留每个对象列表,我需要将整个对象保留一次。
有没有办法在调用其他服务之前将请求的主体存储在某个地方?
什么是最好的?
我将不胜感激任何对我有帮助的线索或解决方案!
最佳方法:
在客户端存储所有对象,只向服务器发送一个请求。 它减少了服务器端的资源使用。
备选方案:
如果您真的想通过多个请求来处理它(我不推荐这样做),那么一种策略是:通过与该会话相关的标识符(最佳候选者是 JSESSIONID)将每个请求的对象存储到 temporary_objects_table 并在最终请求后将其存储在主表中。 并且在该会话的任何服务失败时,从 temporary_objects_table 中删除具有该 sessionid 的记录。 与第一种方法相比,它的复杂性要高得多。
经过一番研究,我找到了答案:
和
您不能使用事务,因为通过 REST,客户端维护客户端状态,服务器维护资源状态。因此,如果您希望客户端维护资源状态,那么它就不是 REST,因为它会违反无状态约束。违反无状态约束通常会导致糟糕的可伸缩性。在这种情况下,它会导致糟糕的水平可伸缩性,因为您必须在实例之间同步正在进行的事务。所以请不要尝试在 REST 服务之上构建多阶段提交。
可能的解决方案:
- 你可以坚持即时一致性,只使用一个 webservice 而不是两个。通过数据库、文件系统等资源, 等等,多阶段提交是必要的。当你分手一个 更大的 REST 服务并将这些资源的使用转移到 多个较小的 REST 服务,那么如果您这样做可能会出现问题 这种分裂是错误的。这是因为其中一个 REST 服务将 需要一个它无权访问的资源,因此它必须 使用另一个 REST 服务来访问该资源。这将迫使 多阶段提交代码移动到更高的抽象级别,到 REST 服务的级别。您可以通过合并这两个 REST 来解决这个问题 服务并将代码移动到它所在的较低抽象级别 属于。
- 使用具有最终一致性的 REST 的另一种解决方法,这样您就可以 立即接受 202 响应,您可以处理 稍后接受请求。如果您选择此解决方案,那么您必须 通过开发您的应用程序意识到 REST 服务不是 始终同步。 Ofc。这种方法仅适用于内部 REST 服务 如果 REST 服务不可用,您可以确定客户端会重试 可用,因此如果您编写 运行 客户端代码。