实现无状态服务双机热备的最简单方式是什么

2022-06-30 10:58:35 +08:00
 feng32

场景如下:Web 服务会发布一些工单任务。工单分为一些子步骤,每一个子步骤需要通过调用一些外部 API 来完成。所有 API 调用都是从工作机向 Web 服务发起

+-----------------------------+
| 高可用的 Web 服务和数据库 | (工单有状态) # Initial -> S1 -> S2 -> ... -> Finish/Error
+-----------------------------+
   ^                       ^
    |                        | HTTP (短连接) # 获取 /更新工单状态
    |                        |
+--------+      +----------------+
| 工作机 1 |      | 工作机 2 (热备) | -------> 外部 API
+--------+      +----------------+

正常情况下,所有的工单都被工作机 1 处理。工作机 2 热备,不处理任何任务,但是可以有心跳。如果工作机 1 宕机,工作机 2 需要能够处理剩下的工单,也可能是一个工单剩余的步骤。

工作机不能直接连接数据库并加锁,但是可以通过 HTTP 请求间接执行类似的操作

请问这种场景下,最简单的实现方式是什么?(使用 SpringBoot)

Paxos, Raft 之类的框架套用在这里是不是太重了?

1765 次点击
所在节点    程序员
10 条回复
xyjincan
2022-06-30 12:47:52 +08:00
无状态的服务一般也不会固执,Nginx 端口负载均衡?
GoodRui
2022-06-30 12:51:25 +08:00
互换硬盘 /头像
realpg
2022-06-30 13:38:07 +08:00
haproxy,keepalived,heatbeart,nginx 啥不行 一个无状态的
feng32
2022-06-30 14:10:50 +08:00
@realpg 并不是前面顶一个 nginx ,后面挂两个无状态服务器,状态在数据库里

工作机 1 和 2 是分别主动发起连接,但是限定只有一个能领到任务、执行任务、更新任务结果
feng32
2022-06-30 14:11:32 +08:00
本质上这是一个简化版的分布式任务调度
realpg
2022-06-30 14:41:34 +08:00
@feng32 #4
你把高可用啥的改成 MQ
工作机 1 工作机 2 改成消费者
就明确了
killva4624
2022-06-30 16:41:19 +08:00
解耦,任务发布到 MQ 里,让工作机 1 和 2 自己去消费。控制每次只发一个任务。
rrfeng
2022-06-30 17:15:42 +08:00
工作机启动的时候往数据库里抢占加锁,带个 TTL ,抢到的每次 TTL 到期前去更新。

如果 TTL 过期,就允许重新抢占。
sujin190
2022-06-30 17:20:42 +08:00
MQ 加工作机 1 工作机 2 两个消费者是最简单可靠的了,这不需要想了吧
ltkun
2022-06-30 17:28:35 +08:00
最简单就是公有云最佳架构部署 自带自带扩展

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/863137

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX