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

2024-09-06 10:54:23 +08:00
 chaleaochexist

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

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

真诚感谢!

3051 次点击
所在节点    程序员
12 条回复
yangtianming
2024-09-06 10:57:37 +08:00
对文件唯一路径加锁,修改期间不允许其他线程修改
AEnjoyable
2024-09-06 12:38:30 +08:00
我们是把整个函数视为事务,先更新数据库 如果 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
2024-09-06 12:48:17 +08:00
理论上无法保证强一致性。不过最终一致性本身就是靠异步重试+幂等补偿来实现的,这意味着每个业务都可能不一样,通用的方案也只是为你做了一些比较底层的事情。
ampedee
2024-09-06 13:06:40 +08:00
看看 juicefs?
afeiche
2024-09-06 17:38:20 +08:00
分布式事务,应该是有现成方案的
wxf666
2024-09-06 20:15:46 +08:00
@AEnjoyable #2 如果执行完 minio.uploadfile(xxx,yyy),就突然崩了,数据是不是就不一致了
chaleaochexist
2024-09-06 22:36:07 +08:00
@timethinker 异步重试+幂等补偿
rabitmq+死信队列+saga?
securityCoding
2024-09-07 08:51:25 +08:00
保证不了,正常写就好
AEnjoyable
2024-09-07 09:55:44 +08:00
@wxf666 如果你后面没有步骤了,执行完这一步就相当于事务提交更改了。 如果是 minio 返回成功后蹦的,那没话可说,但这种情况应该非常少,没法保证
noparking188
2024-09-07 14:36:39 +08:00
knives
2024-09-07 17:59:16 +08:00
不了解具体的业务场景。只谈最终一致的话,可以考虑反过来,只操作 Minio ,用 Minio 的事件通知机制调用 webhook 、消息队列、whatever ,最终写入 MySQL 。
julyclyde
2024-09-07 19:09:20 +08:00
分布式事务协调

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

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

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

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

© 2021 V2EX