老师你好,之前项目中一直用的本地事务保证数据一致性。
关于你介绍的基于内存日志的方案来解决最终一致性,我觉得这是存在一些问题的。
最大的问题是当处理业务数据之后,还未来得及将消息存储到内存日志,这时候服务挂掉了,那么就会造成了数据的不一致:业务数据处理完了,但是消息没有发送到消息队列(因为没有保存到内存日志中服务就挂掉了),导致其他服务无法收到消息。
感觉这种问题的补救方式就是在业务处理时做文章,比如在数据库中记录业务处理的状态,当消息日志发送成功,再更改这个状态(其实还是会遇到在此时宕机导致状态未能及时更新状态,这时候可能又要用别的补偿措施了。。)。 那么进一步增加了复杂性。个人感觉还不如本地事务的方式更方便呢。
期待您的解答,谢谢!
这是一个好问题,感谢你的提出
首先,我们要确定的一点的是系统没有100%的可靠性,我们只能尽量去弥补发生问题的可能性,比如把稳定性提升到到3个9或者4个9等。
基于以上的条件我们再来选择一个我们能接受的方案,使用内存日志的方式是信任了内存日志的处理效率和稳定性(内存还是我们能利用的效率最高的工具)。这样来减少出现故障的可能性。如果使用内存日志还达不到系统要求的稳定性的话,就需要进一步优化,比如使用业务数据来进一步提供补偿措施,
本地事务是一种比较方便的方式,但是对框架代码有一定的侵入性,相比于内存日志的话效率会有一定损耗,算是怎样去平衡的问题吧。