
场景如下:Web 服务会发布一些工单任务。工单分为一些子步骤,每一个子步骤需要通过调用一些外部 API 来完成。所有 API 调用都是从工作机向 Web 服务发起
+-----------------------------+ | 高可用的 Web 服务和数据库 | (工单有状态) # Initial -> S1 -> S2 -> ... -> Finish/Error +-----------------------------+ ^ ^ | | HTTP (短连接) # 获取 /更新工单状态 | | +--------+ +----------------+ | 工作机 1 | | 工作机 2 (热备) | -------> 外部 API +--------+ +----------------+ 正常情况下,所有的工单都被工作机 1 处理。工作机 2 热备,不处理任何任务,但是可以有心跳。如果工作机 1 宕机,工作机 2 需要能够处理剩下的工单,也可能是一个工单剩余的步骤。
工作机不能直接连接数据库并加锁,但是可以通过 HTTP 请求间接执行类似的操作
请问这种场景下,最简单的实现方式是什么?(使用 SpringBoot)
Paxos, Raft 之类的框架套用在这里是不是太重了?
1 xyjincan 2022 年 6 月 30 日 via Android 无状态的服务一般也不会固执,Nginx 端口负载均衡? |
2 GoodRui 2022 年 6 月 30 日 互换硬盘 /头像 |
3 realpg PRO haproxy,keepalived,heatbeart,nginx 啥不行 一个无状态的 |
4 feng32 OP |
5 feng32 OP 本质上这是一个简化版的分布式任务调度 |
7 killva4624 2022 年 6 月 30 日 解耦,任务发布到 MQ 里,让工作机 1 和 2 自己去消费。控制每次只发一个任务。 |
8 rrfeng 2022 年 6 月 30 日 工作机启动的时候往数据库里抢占加锁,带个 TTL ,抢到的每次 TTL 到期前去更新。 如果 TTL 过期,就允许重新抢占。 |
9 sujin190 2022 年 6 月 30 日 MQ 加工作机 1 工作机 2 两个消费者是最简单可靠的了,这不需要想了吧 |
10 ltkun 2022 年 6 月 30 日 via Android 最简单就是公有云最佳架构部署 自带自带扩展 |