数据库负责文件元信息的增删改查, minio 负责存储.
最好有现成的案例或者框架, 我想吃个现成的.
真诚感谢!
1
yangtianming 109 天前
对文件唯一路径加锁,修改期间不允许其他线程修改
|
2
AEnjoyable 109 天前
我们是把整个函数视为事务,先更新数据库 如果 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) } |
3
timethinker 109 天前
理论上无法保证强一致性。不过最终一致性本身就是靠异步重试+幂等补偿来实现的,这意味着每个业务都可能不一样,通用的方案也只是为你做了一些比较底层的事情。
|
4
ampedee 109 天前 via iPhone
看看 juicefs?
|
5
afeiche 108 天前
分布式事务,应该是有现成方案的
|
6
wxf666 108 天前
@AEnjoyable #2 如果执行完 minio.uploadfile(xxx,yyy),就突然崩了,数据是不是就不一致了
|
7
chaleaochexist OP @timethinker 异步重试+幂等补偿
rabitmq+死信队列+saga? |
8
securityCoding 108 天前 via Android
保证不了,正常写就好
|
9
AEnjoyable 108 天前 via Android
@wxf666 如果你后面没有步骤了,执行完这一步就相当于事务提交更改了。 如果是 minio 返回成功后蹦的,那没话可说,但这种情况应该非常少,没法保证
|
10
noparking188 107 天前
|
11
knives 107 天前
不了解具体的业务场景。只谈最终一致的话,可以考虑反过来,只操作 Minio ,用 Minio 的事件通知机制调用 webhook 、消息队列、whatever ,最终写入 MySQL 。
|
12
julyclyde 107 天前
分布式事务协调
|