目录
1. exporter的实现分析
exporters的顶层接口为:io.camunda.zeebe.exporter.api.Exporter#export
代码中的实现由3个:
- io.camunda.zeebe.exporter.ElasticsearchExporter
- io.camunda.zeebe.broker.exporter.metrics.MetricsExporter
- io.camunda.zeebe.broker.exporter.debug.DebugLogExporter
其中 DebugLogExporter 是用于debug 的一个实现,仅仅打印log,重点比对 ElasticsearchExporter 和 MetricsExporter
1.1 MetricsExporter
io.camunda.zeebe.broker.exporter.metrics.MetricsExporter#export
调用方法 io.camunda.zeebe.exporter.api.context.Controller#updateLastExportedRecordPosition(long) 更新position
1.2 ElasticsearchExporter
调用方法 io.camunda.zeebe.exporter.api.context.Controller#updateLastExportedRecordPosition(long) 更新position
2. 导出流程控制器 io.camunda.zeebe.exporter.api.context.Controller
Controller的唯一实现为 io.camunda.zeebe.broker.exporter.stream.ExporterContainer
2.1 ExporterContainer的创建
io.camunda.zeebe.broker.exporter.stream.ExporterDirector#ExporterDirector
根据配置创建对应的context 和 exporter ;配置多个exporters,则创建多个ExporterContainer
2.2 position的初始化
(前置调用为:
io.camunda.zeebe.broker.exporter.stream.ExporterDirector#onActorStarted
io.camunda.zeebe.broker.exporter.stream.ExporterDirector#startActiveExportingMode)
io.camunda.zeebe.broker.exporter.stream.ExporterContainer#initPosition
该方法是获取对应的exportedId对应的position信息,最终实际是从rocksDB进行获取对应的数据(io.camunda.zeebe.broker.exporter.stream.ExportersState#findExporterStateEntry)
若从rocksDB中未获取到对应的position信息(系统第一次执行时),则通过 ExportersState 将rocksDB中的positon设置为-1 :
2.3 position的更新
基于第1节的分析,调用更新方法有:
io.camunda.zeebe.exporter.api.context.Controller#updateLastExportedRecordPosition
此处更新position都是异步执行的,最终执行的方法是:io.camunda.zeebe.broker.exporter.stream.ExporterContainer#updateExporterState(long, byte[])