找回密码
 立即注册
首页 业界区 安全 Flink源码阅读:Mailbox线程模型

Flink源码阅读:Mailbox线程模型

强怀梅 昨天 21:40
本文我们来梳理 Flink 的线程模型——Mailbox。
写在前面

在以前的线程模型中,Flink 通过 checkpointLock 来隔离保证不同线程在修改内部状态时的正确性。通过 checkpointLock 控制并发会在代码中出现大量的 synchronize(lock) 这样非常不利于阅读和调试。Flink 也提供了一些 API 将锁对象暴露给用户,如果没有正确使用锁,很容易导致线程安全问题。
为了解决这些问题,Flink 社区提出了基于 Mailbox 的线程模型。它是通过单线程加阻塞队列来实现。这样内部状态的修改就由单线程来完成了。
旧的线程模型中,checkpointLock 主要用在三个地方:

  • Event Process:包括 event、watermark、barrier 的处理和发送
  • Checkpoint:包括 Checkpoint 的触发和完成通知
  • ProcessTime Timer:ProcessTime 的回调通常涉及对状态的修改
在 Mailbox 模型中,将所有需要处理的事件都封装成 Mail 投递到 Mailbox 中,然后由单线程按照顺序处理。
相关定义

下面我们来看 Mailbox 的具体实现,具体涉及到以下这些类。
1.png

我们来逐个看一下这些类的定义和作用。
Mail

在 Mailbox 线程模型中,Mail 是最基础的一个类,它用来封装需要处理的消息和执行的动作。Checkpoint Trigger 和 ProcessTime Trigger 都是通过 Mail 来触发的。Mail 中包含以下属性:
[code]// 选项,包括两个选项:isUrgent 和 deferrableprivate final MailOptionsImpl mailOptions;// 要执行的动作private final ThrowingRunnable

相关推荐

您需要登录后才可以回帖 登录 | 立即注册