如何解决用于从多个数据库中的单个有效负载提交多个大记录的系统架构
我是一项休息服务,我收到了包含多部分mime消息的大型请求。我需要将这些部分拆开,将第一个部分(标头)存储在一个数据库中,并将其他部分作为单独的记录存储在另一个数据库中。
一旦所有部分都在数据库中,那么标题部分就可以供客户端查询了。
尽管我们主要是.net商店,但我们尚未决定数据库技术,因此sql server是我们的首选,但不一定是我们的唯一选择。
由于有效载荷很大,并且我们正在谈论多个数据库,所以我不确定是否可以选择事务处理。
是适当的代理选项,还是我应该以某种方式使用队列。我正在寻找一些建筑建议。
解决方法
大多数数据库都有提交/回滚的概念。应该有可能在应用程序中处理概念性事务。例如:
- 接收请求并分成N个DB操作来执行。
- 执行所有操作(出于性能考虑,可能并行执行)。
- 如果一切成功,请提交并以2XX响应。
- 如果有任何失败,请回滚并以5XX响应。
或者,可以将请求放置在队列中,并将操作结果存储在DB中。例如:
API
- 在API处接收请求,并将其放入队列中进行处理。
- 在可以找到结果的地方回复(https://restfulapi.net/http-status-202-accepted/)
后端
- 选择下一条消息进行处理。
- 执行所有操作。
- 如果全部成功,则全部提交,并将“标题”段设置为成功。
- 如果有任何失败,请回滚并仅将“ header”段提交为失败。
编辑:
假设消息的大小范围为50KB-50MB,则可能需要调整设计。通常有增加队列最大消息大小的方法,但是不建议这样做,因为:
- 使用较大的消息来维持吞吐量在队列服务器上无法很好地扩展。
- 过程可能要花费很长时间,因此很难扩展。
解决此问题的一种方法是在应用程序级别管理事务。例如:
API
- 通过API接收请求,并生成交易ID。
- 将大消息拆分为N个操作来执行。
- 使用事务ID和一些元数据更新数据库,以了解所有操作何时完成(例如:跟踪总计/成功/失败)。
- 将N条消息写到包括事务ID在内的相关队列中。
- 答复可以找到结果的地方。
- 仅当总数=成功时,才允许客户端看到标头。
后端:
- 选择下一条消息进行处理并执行操作。
- 成功后,增加“成功”并提交。
- 发生故障时,回滚并增加“故障”。
如果同一笔交易中的先前消息的“失败”> 0,则可能还会进行优化以跳过处理。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。