用于跨多个数据库从单个有效负载提交多个大型记录的系统体系结构



我是一个rest服务,我收到了一个多部分mime消息中的大型请求。我需要将这些部分分开,将第一部分(标题(存储在一个数据库中,并将其他部分作为单独的记录存储在另一个数据库。

一旦所有部分都在数据库中,那么头部分就可以供客户端查询。

我们还没有决定数据库技术,尽管我们主要是一家.net商店,所以sql server是我们的首选,但不一定是我们唯一的选择。

因为有效负载很大,而且我们谈论的是多个数据库,所以我不确定事务是否是一种选择。

代理选项合适吗?或者我应该以某种方式使用队列。我正在寻求一些建筑方面的建议。

大多数数据库都有提交/回滚的概念。应该可以在应用程序中处理概念事务。例如:

  1. 接收请求并拆分为N个要执行的DB操作
  2. 执行所有操作(出于性能原因,可能并行执行(
  3. 如果全部成功,提交并用2XX进行响应
  4. 如果任何失败,请回滚并用5XX进行响应

或者,可以将请求放入队列中,并将操作结果存储在DB中。例如:

API

  1. 在API接收请求,并放入队列进行处理
  2. 用可以找到结果的地方进行响应(https://restfulapi.net/http-status-202-accepted/)

后端

  1. 选择下一条消息进行处理
  2. 执行所有操作
  3. 如果全部成功,则提交全部并将"header"段设置为成功
  4. 如果任何一个失败,则回滚并仅将"header"段提交为失败

编辑:

假设消息的大小可能在50KB-50MB之间,那么调整设计可能是值得的。通常有一些方法可以增加队列的最大消息大小,但不建议这样做,因为:

  1. 在队列服务器上,用较大的消息维持吞吐量并不能很好地扩展
  2. 可能需要任意长时间的过程会使缩放变得困难

解决此问题的一个选项是在应用程序级别管理事务。例如:

API

  1. 在API接收请求,并生成事务ID
  2. 将大消息拆分为N个操作来执行
  3. 使用事务ID和一些元数据更新DB,以了解所有操作何时完成(例如:跟踪总数/成功/失败(
  4. 将N条消息写入相关队列,包括事务ID
  5. 用可以找到结果的地方回应
  6. 仅当total=successs时才允许客户端查看标头

后端:

  1. 选择下一条消息进行处理并执行操作
  2. 成功后,增加"成功"并提交
  3. 失败时,回滚和增量"failures">

如果"失败",也可能进行优化以跳过处理>0表示同一事务中的前一条消息。

最新更新