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

同时操作数据库和 minio,如何保证最终一致性

  •  
  •   chaleaochexist · 10 天前 · 2088 次点击

    数据库负责文件元信息的增删改查, minio 负责存储.

    最好有现成的案例或者框架, 我想吃个现成的.

    真诚感谢!

    12 条回复    2024-09-07 19:09:20 +08:00
    yangtianming
        1
    yangtianming  
       10 天前
    对文件唯一路径加锁,修改期间不允许其他线程修改
    AEnjoyable
        2
    AEnjoyable  
       10 天前
    我们是把整个函数视为事务,先更新数据库 如果 minio 失败了就往 mysql txn 报错,这样就自动回滚事务了
    伪代码:
    txn=dbClient.Begin()
    defer HandleErrorCh(errorChan).
    ErrorWillDo(
    txn.Rollback()
    }).
    SuccessWillDo(
    _ = txn.Commit()
    }).Do()

    err=txn.update(xxxx)
    if err!=nil{
    txn.report(err)
    }
    err=minio.uploadfile(xxx,yyy)
    if err!=nil{
    txn.report(err)
    }
    timethinker
        3
    timethinker  
       10 天前
    理论上无法保证强一致性。不过最终一致性本身就是靠异步重试+幂等补偿来实现的,这意味着每个业务都可能不一样,通用的方案也只是为你做了一些比较底层的事情。
    ampedee
        4
    ampedee  
       10 天前 via iPhone
    看看 juicefs?
    afeiche
        5
    afeiche  
       10 天前
    分布式事务,应该是有现成方案的
    wxf666
        6
    wxf666  
       10 天前
    @AEnjoyable #2 如果执行完 minio.uploadfile(xxx,yyy),就突然崩了,数据是不是就不一致了
    chaleaochexist
        7
    chaleaochexist  
    OP
       10 天前
    @timethinker 异步重试+幂等补偿
    rabitmq+死信队列+saga?
    securityCoding
        8
    securityCoding  
       9 天前 via Android
    保证不了,正常写就好
    AEnjoyable
        9
    AEnjoyable  
       9 天前 via Android
    @wxf666 如果你后面没有步骤了,执行完这一步就相当于事务提交更改了。 如果是 minio 返回成功后蹦的,那没话可说,但这种情况应该非常少,没法保证
    knives
        11
    knives  
       9 天前
    不了解具体的业务场景。只谈最终一致的话,可以考虑反过来,只操作 Minio ,用 Minio 的事件通知机制调用 webhook 、消息队列、whatever ,最终写入 MySQL 。
    julyclyde
        12
    julyclyde  
       9 天前
    分布式事务协调
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   947 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:26 · PVG 03:26 · LAX 12:26 · JFK 15:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.