在flume的内部实现中事务是一个重要的概念,事务保证了数据的可用性(有别于数据库中的事务)。
下图的数据流是spooling directory source-> memory channel-> kafka sink,其中memory channel维护了两个事务,分别是put事务和take事务。
下面简要介绍一下事务的代码实现:
1. doPut(放入event),该操作由source触发。
1.1 一般的source会在process方法中,将event提交到channel。但是spoolingdirectorysource比较特殊,它针对一个本地目录创建了ReliableSpoolingFileEventReader对象, 并起一个定时线程去读取其中的文件。在线程中,取到一批event后(文件中一行即为一个event),直接调用ChannelProcessor的processEventBatch方法,将这批数据提交到channel中。
1.2 在ChannelProcessor对象中,调用栈为:reqChannel.put(event) -> BasicChannelSemantics.put -> BasicTransactionSemantics.put -> BasicTransactionSemantics.doPut。其中doPut是一个抽象方法,其具体实现放在各个channel的Transaction中。这里