Tunnel Client为通道服务的自动化数据消费框架。使用通道服务前,需要了解Tunnel Client的自动化数据处理流程、自动化的负载均衡和良好的水平扩展性以及自动化的资源清理和容错处理。
背景信息
Tunnel Client可以解决全量和增量数据处理时的常见问题,例如负载均衡、故障恢复、Checkpoint、分区信息同步确保分区信息消费顺序等。使用Tunnel Client后,您只需要关心每条记录的处理逻辑。
Tunnel Client的代码详情请参见Github。
自动化数据处理流程
Tunnel Client通过每一轮的定时心跳探测(Heartbeat)进行活跃Channel的探测,Channel和ChannelConnect状态的更新,和数据处理任务的初始化、运行和结束等。
Tunnel Client资源的初始化
将Tunnel Client状态由Ready置为Started。
根据TunnelWorkerConfig中的HeartbeatTimeout和ClientTag(客户端标识)等配置进行ConnectTunnel操作,并和Tunnel服务端进行联通,以获取当前Tunnel Client对应的ClientId。
初始化ChannelDialer,用于新建ChannelConnect。
每一个ChannelConnect都会和一个Channel一一对应,ChannelConnect上会记录有数据消费的位点。
根据用户传入的处理数据的Callback和TunnelWorkerConfig中CheckpointInterval(向服务端记数据位点的间隔)包装出一个带自动记Checkpoint功能的数据处理器。
初始化TunnelStateMachine,用于进行Channel状态机的自动化处理。
固定间隔进行Heartbeat
心跳的间隔由TunnelWorkerConfig中的heartbeatIntervalInSec参数决定。
进行Heartbeat请求,从Tunnel服务端获取最新可用的Channel列表,Channel中会包含有ChannelId、Channel的版本和Channel的状态信息。
将服务端获取到的Channel列表和本地内存中的Channel列表进行Merge,然后进行ChannelConnect的新建和update,规则如下:
Merge:基于本轮从服务端获取的最新Channel列表,对于相同ChannelId,认定版本号更大的为最新状态,直接进行覆盖,对于未出现的Channel,则直接插入。
新建ChannelConnect:如果此Channel未新建其对应的ChannelConnect,则会新建一个WAIT状态的ChannelConnect,如果对应的Channel状态为OPEN状态,则同时会启动该ChannelConnect上处理数据的循环流水线任务(ReadRecords&&ProcessRecords),处理详情请参见代码中的ProcessDataPipeline类。
Update已有ChannelConnect:Merge完成后,如果Channel对应的ChannelConnect存在,则根据相同ChannelId的Channel状态来更新ChannelConnect的状态,例如Channel为CLOSE状态也需要将ChannelConnect的状态置为Closed,进而终止处理任务的流水线任务,详情请参见代码中的ChannelConnect.notifyStatus方法。
Channel状态自动机说明
在心跳模式下,Tunnel服务端会根据保持心跳的Tunnel Client数量,调度可以消费的分区到不同Tunnel Client上,以达到负载均衡的目的。
Tunnel服务端通过Channel状态机来驱动每个Channel的消费以及进行负载均衡,如下图所示。
Tunnel服务端和Tunnel Client通过一个心跳和Channel版本号更新机制进行状态变换通信。
每个Channel最初均处于WAIT状态。
增量类型Channel需要等待父分区上Channel消费完毕转为TERMINATED后才可以转为可消费状态OPEN。
OPEN状态的分区会调度到各个Tunnel Client上。
在需要负载均衡时,Tunnel服务端和Tunnel Client有一个Channel状态OPEN->CLOSING->CLOSED的调度协议,Tunnel Client在消费完一个全量Channel split或者发生了分裂的增量Channel后,会将Channel汇报为TERMINATED。
自动化的负载均衡和良好的水平扩展性
运行多个Tunnel Client对同一个Tunnel(TunnelId相同)进行消费时,在Tunnel Client执行Heartbeat时,Tunnel服务端会自动对Channel资源进行重分配,让活跃的Channel尽可能的均摊到每一个Tunnel Client上,达到对资源进行负载均衡的目的。
在水平扩展性方面,可以通过增加Tunnel Client的数量来完成,Tunnel Client可以在同一个机器或者不同机器上。
自动化的资源清理和容错处理
资源清理:当Tunnel Client没有被正常shutdown时(例如异常退出或者手动结束),会自动进行资源回收,包括释放线程池、自动调用在Channel上注册的shutdown方法、关闭Tunnel连接等。
容错处理:当Tunnel Client出现Heartbeat超时等非参数类错误时,表格存储会自动Renew Connect,以保证数据消费可以稳定的进行持续同步。