source到channel是put事务,channel到sink是take事务 flume基于事务传输event(批量传输),使用两个独立的事务分别处理source到channel和channel到sink,失败时会将所有数据都回滚到source或channel进行重试。
该事务机制遵循'最少一次'语义,因此数据绝不会丢失,但有可能重复。
source-channel之间的重复可以靠TailDirSource自带的断点续传功能解决; channel-sink之间的重复,可以延长等待时间,或者设置UUID拦截器,然后在redis里维护一个布隆表来使下游实时应用去重。