V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
feng32
V2EX  ›  程序员

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

  •  
  •   feng32 · 2022-06-30 10:58:35 +08:00 · 1915 次点击
    这是一个创建于 887 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    10 条回复    2022-06-30 17:28:35 +08:00
    xyjincan
        1
    xyjincan  
       2022-06-30 12:47:52 +08:00 via Android
    无状态的服务一般也不会固执,Nginx 端口负载均衡?
    GoodRui
        2
    GoodRui  
       2022-06-30 12:51:25 +08:00   ❤️ 1
    互换硬盘 /头像
    realpg
        3
    realpg  
       2022-06-30 13:38:07 +08:00
    haproxy,keepalived,heatbeart,nginx 啥不行 一个无状态的
    feng32
        4
    feng32  
    OP
       2022-06-30 14:10:50 +08:00
    @realpg 并不是前面顶一个 nginx ,后面挂两个无状态服务器,状态在数据库里

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

    如果 TTL 过期,就允许重新抢占。
    sujin190
        9
    sujin190  
       2022-06-30 17:20:42 +08:00
    MQ 加工作机 1 工作机 2 两个消费者是最简单可靠的了,这不需要想了吧
    ltkun
        10
    ltkun  
       2022-06-30 17:28:35 +08:00 via Android
    最简单就是公有云最佳架构部署 自带自带扩展
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1013 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:27 · PVG 05:27 · LAX 13:27 · JFK 16:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.