【发布时间】:2022-01-16 21:55:18
【问题描述】:
问题
- 我们有 ~50k 定期通过电子邮件发送给客户的预定财务报告
- 报告有自己的交付频率(日期和时间格式 - 由客户配置)
- 每周
- 每天
- 每小时
- 仅限工作日
- 等
当前架构
-
我们有一个名为
report_metadata的表,其中包含报告信息- report_id
- report_name
- report_type
- report_details
- next_run_time
- last_run_time
- 等等……
-
每周,我们的 调度程序 服务的所有 6 个实例都会轮询
report_metadata数据库,提取将在下一周交付的所有报告的元数据,并将它们放入 内存中的定时队列。 -
仅在 master/leader 实例(这是 6 个实例之一)中:
- 定时队列中的数据在适当的时间弹出
- 已处理
- 进行了几次 API 调用以获得完整的当前/最新报告
- 报告通过电子邮件发送给客户
-
其他 5 个实例什么都不做 - 它们只是为了冗余而存在
建议的架构
数字:
- db 最多可以处理 1000 个并发连接 - 这已经足够了
- 现有报告总数 (~50k) 在近期/远期不太可能变得更大
解决方案:
- 不是每周轮询
report_metadatadb 并将数据存储在内存中的定时队列中,所有 6 个实例将每 60 秒轮询一次report_metadatadb(10 秒每个实例的偏移量) - 平均而言,调度程序将尝试每 10 秒接一次工作
- 提取
next_run_time在过去 的任何单个报告的数据,锁定表格行,然后通过该报告处理/交付给客户具体实例 - 报表处理成功后,表行解锁,报表的next_run_time、 last_run_time等更新
一般来说,数据库作为master,进程的各个实例可以独立工作,并且数据库确保它们不重叠。
如果您能告诉我所提议的架构是否为:
- 一个好的/正确的解决方案
- 可以/应该索引哪些表列
- 任何其他注意事项
【问题讨论】:
-
好的,但是为什么你甚至提出了一个新的架构?您有哪些当前的需求没有解决,或者您对当前架构有什么问题?
标签: sql db2 distributed-system taskscheduler database-indexes