浅议Flink中的通讯工具: Akka

在Flink中,各个组件之间需要频繁交换数据和控制信息。Flink选择了基于Actor模型的Akka框架作为通信基础。

Akka是什么

Actor模型

Actor模型是用于单个进程中并发的场景。

在Actor模型中:

ActorSystem负责管理actor生命周期

将每个实体视为独立的 Actor,拥有自己的状态。

每个Actor一次只处理一条消息,不需要担心线程

Actor之间通过消息传递进行异步通信,而不是直接调用[1]

即:每个Actor都有一个类似信箱的消息队列(mailbox),用于接收其他Actor发来的消息以备后续处理。

(在不使用Actor模型时,假设actor2和actor3在各自线程中都要让actor1修改某个数据,那么actor1就不得不加锁来避免线程之间的竞争。

而在Actor模型中,actor2和actor3只是通过发送邮件来让actor1修改某个数据。actor1逐一从邮箱中拿出邮件执行改名行为,这就不会产生竞争。)

这种设计既保证了并发安全,又提供了良好的扩展性。

Akka:分布式Actor框架

Akka是一个将消息代理和Actor模型进行整合的分布式框架[2],actor被用来进行节点内和节点间的消息传递。在Akka中:

每个Actor都有唯一的路径标识

通过ActorRef(Actor的引用)进行通信

支持两种通信模式:

  • tell:发送消息后无需等待响应

  • ask:发送消息后通过异步回调函数处理响应

  • Flink中的Akka应用

    Flink中的JobManager,TaskManager,Dispatcher等之间会相互通信(即Remote Procedure Call ,RPC),以进行fink作业的提交,资源分配和作业调度等。

    RPC框架中涉及了JobManager,TaskManager,Dispatcher等类。

    从运行日志中可知,JobManager/TaskManager/Dispatcher等组件在启动时都会被封装为RpcEndpoint,从而具备通信能力。


    RPC框架就是基于Akka实现的,并对Akka中的ActorSystem、Actor进行了封装[3]。

    RPC(本地/远程)调用,底层是通过 Akka 提供的 tell/ask 方法进行通信。

    通过这种设计,Flink既利用了Akka成熟的通信机制,又能根据自身需求进行定制化扩展。

    参考

    1. 尚硅谷Flink内核源码解析课程(从入门到精通)

    https://www.bilibili.com/video/BV1rh411C77P?spm_id_from=333.788.videopod.episodes&vd_source=23ce4decfcb0fd94528070beadbbc9e2&p=39

    2.《数据密集型应用系统设计》 Martin Kleppmann 著 P132-P134

    3. 深入理解 Flink(三)Flink 内核基础设施源码级原理详解 https://juejin.cn/post/7321979919674736694#heading-8

    最后编辑于
    ©著作权归作者所有,转载或内容合作请联系作者
    【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
    平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

    相关阅读更多精彩内容

    友情链接更多精彩内容