今日抽时间,对Kafka-connector-elasticsearch的源码进行了简单研究,主要梳理其设计思路和关键设计点, 其主要时序图如下:
主要设计点总结如下:
(1)ElasticsearchSinkConnectorConfig类,容易可扩展配置参数,并可对参数的正确性进行效验。
(2)高吞吐线程池设计,conenctor数据输入为kafka, 通过扩kafka partition可以提供吞吐量,可一味地扩patition,吞吐量提高有限,并且对整体topic的维护变得复杂。作者采用的队列和线程池的设计方案,拉取kafka数据存取队列,farmer线程负责将队列中的数据提交给线程池,线程池负责将数据写入ES ,这样通过增大partition和线程池线程数可以获取较高的吞吐量,满足数据量大的数据写入。
(3)多线程协调设计,通过原生wait和notifyAll实现。队列采用了ArrayDeque,非线程安全,往队列中添加数据和取数采用了同一个类对象锁,避免线程安全问题,farmer线程获取对象锁,获取从队列中获取数据并判断是否提交批次任务条件(队列不为空,且达到batchsize),未达到要求时,farmer线程wait,释放对象锁。 往队列add 操作时首先获取锁,add成功之后进行notifyAll,释放锁, 唤醒farmer线程再获取索引,去判断是否符合条件提交批次写入任务。
wait和nofify 原理参照:https://www.liaoxuefeng.com/wiki/1252599548343744/1306580911915042
源码代码片段:https://snippets.cacher.io/snippet/68e62aab71324c9d77dc
(4)线程异常的处理,定义ThreadFactory,定义线程UncaughtExceptionHandler。