本文我们来梳理 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 的具体实现,具体涉及到以下这些类。
我们来逐个看一下这些类的定义和作用。
Mail
在 Mailbox 线程模型中,Mail 是最基础的一个类,它用来封装需要处理的消息和执行的动作。Checkpoint Trigger 和 ProcessTime Trigger 都是通过 Mail 来触发的。Mail 中包含以下属性:
[code]// 选项,包括两个选项:isUrgent 和 deferrableprivate final MailOptionsImpl mailOptions;// 要执行的动作private final ThrowingRunnable |
|
|
|
|
|
相关推荐
|
|
|