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