场景如下: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-06-30 12:47:52 +08:00 via Android
无状态的服务一般也不会固执,Nginx 端口负载均衡?
|
2
GoodRui 2022-06-30 12:51:25 +08:00 1
互换硬盘 /头像
|
3
realpg 2022-06-30 13:38:07 +08:00
haproxy,keepalived,heatbeart,nginx 啥不行 一个无状态的
|
4
feng32 OP |
5
feng32 OP 本质上这是一个简化版的分布式任务调度
|
7
killva4624 2022-06-30 16:41:19 +08:00
解耦,任务发布到 MQ 里,让工作机 1 和 2 自己去消费。控制每次只发一个任务。
|
8
rrfeng 2022-06-30 17:15:42 +08:00
工作机启动的时候往数据库里抢占加锁,带个 TTL ,抢到的每次 TTL 到期前去更新。
如果 TTL 过期,就允许重新抢占。 |
9
sujin190 2022-06-30 17:20:42 +08:00
MQ 加工作机 1 工作机 2 两个消费者是最简单可靠的了,这不需要想了吧
|
10
ltkun 2022-06-30 17:28:35 +08:00 via Android
最简单就是公有云最佳架构部署 自带自带扩展
|