目录
1.背景
zeebe的代码都是异步化处理的,整个项目中都是个中任务的封装,并提交到线程池中处理,任务队列在其中是很重要的一部分,zeebe也有不同维度的多个任务队列,在此梳理下。
2.broker的任务队列(WorkStealingGroup任务队列)
2.1 自定义的线程池
ActorThread
、ActorThreadGroup
和 ActorExecutor
本质上是自己实现了一套线程池,按照自定义线程池的思路,ActorThread
中存在着循环执行:
io.camunda.zeebe.scheduler.ActorThread#run
io.camunda.zeebe.scheduler.ActorThread#doWork
2.2 WorkStealingGroup任务队列:
WorkStealingGroup
中维护着每个线程的任务队列(一个线程一个队列)
io.camunda.zeebe.scheduler.WorkStealingGroup
在ActorThread#doWork
中通过 WorkStealingGroup#getNextTask
一直在消费其中的任务,其任务的新增则是通过WorkStealingGroup#submit
方法
往队列中插入任务:
ActorScheduler
对象继承 ActorSchedulingService
接口,该接口提供的submit方法都是提交actor对象
而这些方法的实现最终还是向actorTaskExecutoractorTaskExecutor
提交 ActorTask
而该方法就是ActorExecutor的submit方法的底层方法:
io.camunda.zeebe.scheduler.ActorExecutor#submitTask
——> io.camunda.zeebe.scheduler.ActorThreadGroup#submit
——> io.camunda.zeebe.scheduler.WorkStealingGroup#submit
3.ActorTask中的任务队列
io.camunda.zeebe.scheduler.ActorTask 中有一个任务队列 Deque<ActorJob> fastLaneJobs
在gateway处理请求转发的过程中,很多处理动作都是由 actor.run() 方法异步执行 ( ActorControl#run
)
例如:io.camunda.zeebe.gateway.impl.broker.BrokerRequestManager#sendRequestInternal(io.camunda.zeebe.gateway.impl.broker.request.BrokerRequest, io.camunda.zeebe.gateway.impl.broker.BrokerRequestManager.TransportRequestSender, java.time.Duration)
该方法调用的是 ActorControl#scheduleRunnable
每个runnable任务都提交到 ActorTask
的实例中,这里的 insertJob() 和 submit() 都是操作队列 Deque<ActorJob> fastLaneJobs
ActorTask
中会循环poll队列中的任务执行
io.camunda.zeebe.scheduler.ActorTask#execute
最终任务的执行是提交线程池 ActorExecutor
中,其调用链路为:
io.camunda.zeebe.scheduler.ActorScheduler#start
io.camunda.zeebe.scheduler.ActorThread#run
4.ActorThread中的任务队列
ActorThread
对象中有一个有界队列,默认长度2048
io.camunda.zeebe.scheduler.ActorThread#jobs
其中方法 io.camunda.zeebe.scheduler.ActorThread#recycleJob 往队列中添加任务:
该方法的调用是在 io.camunda.zeebe.scheduler.ActorTask#execute
若job不是正常终止,则 回收到ActorThread
的job队列中