Flume的事务有两部分
source到channel中有着put事务,作用是当缓冲区发生异常,数据不会直接丢失,而是回滚事务,当然回滚到source的数据,虽然会在一定时间之后再次推送到缓冲区,但是如果一直推不进去,那我们就要去考虑为什么了
channel到sink之间有着take事物,它的作用是让sink主动的去获取数据,如果发生了异常,就会将数据还给channel
下面给大家用我的理解说一说,不一定完全对,但是也大差不差了,首先大家看一眼下面的图,方便后期理解我在说什么
首先如开头说的那样,source不会直接将数据发送给channel,两者间有“put事务”存在,两者间处理事务的组件叫channelprocessor,source会将数据先封装成一个个的event,之后交给事务组件,由事务组件经过拦截器进行过滤,拦截器有默认的,就比如监控路径的时候指定的各种忽略参数,当然不设置拦截器就是为一路绿灯,event从拦截器出来之后,到达负责event分发的组件channelselector
这里要先说一下source和channel的关系,一个source可以有多个channel,这也是我们书写agent文件关联流程的时候用的是a1.sources.r1.channel“s”,同理我们使用a1.sinks.k1.channel没有“s”意味着一个sink只能有一个channel
言归正传分发组件有两种可选分发机制,一是默认的会发给所有对应的channel叫做replicating,另一种Multiplexing可以设置发送方式,我们一般如有需要会使用multiplexing,无论哪种类型,如果发送成功则事务成功提交,如果失败,回滚事务
channel到sink有着take事务,事务组件是sinkprossor,它的流程流简单多了,它的目的就只是让sink读取channel的数据,如果读取失败则回滚事务,成功则提交事务,但是它有三个类型有着不同的功能
默认的DefaultSinkProcessor,对应的是单个的Sink的读取进行事务的运行
其他两种是LoadBalancingSinkProcessor和FailoverSinkProcessor,对应的是Sink Group,也就是多个sink,LoadBalancingSinkProcessor可以实现负载均衡的功能,FailoverSinkProcessor有错误恢复的功能
最后告诉大家两个事情,一是sink拿数据在设计的时候,是针对channel中都是有用数据设计的,因此sink其实只做用数据,而不涉及其他的过滤等其他操作,而是一个source可以有多个channel,一个channel可以有多个sink,但是反过来,一个sink只能有一个channel,而一个channel是不是只能有一个source大家可以自己去实验一下