经典的RPC事务均无法达到完全事务一致性。
Flume是apache官方提供的一套分布式日志收集工具。在 https://flume.apache.org/FlumeDeveloperGuide.html 这里讲述了如何 实现从一个agnet往另一个agent发消息数据,达到事务一致性。
例如 agent1 调用 agent2,在agent1和agent2那边均开启了事务来保证双方共同事务的一致性。
在这种过程中,会出生几种问题:
对于第1种情况,agent1表现为连接断开,此时双方自行回溯数据即可。
对于第2种情况,agent1表现为连接超时,此时只要保证agent2的超时时间小于agent1的超时时间 即可以保证数据一致性。
对于第3种情况(当然这种情况发生的机率很小,可以通过safe close方式来避免此问题),agent2成功了,但是agent1失败了。此时没有有效的办法,让agent2去回滚。在这种情况下,经典的RPC事务无法达成一致性。
一种常用的解决办法就是用补偿机制,agent1有持久化策略,在agent1再次启动时,将失败的消息再次发送给agent2,此时agent2会得到两条一样的数据。这时需要一些业务情况来保证。