当前位置: 首页 > news >正文

浅议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逐一从邮箱中拿出邮件执行改名行为,这就不会产生竞争。)

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

070e2e47f4cecd67808c0586248f4722.jpeg

Akka:分布式Actor框架

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

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

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

  3. 支持两种通信模式:

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

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

Flink中的Akka应用

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

baee2f4702671587c83d642ced360624.jpeg

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

061b53e4b37e1e1575ae07ddd4a34279.jpeg

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

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

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

3dc5d6318186d7d9d0ed171cc3526346.jpeg

通过这种设计,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

http://www.lryc.cn/news/487966.html

相关文章:

  • 基于YOLOv8深度学习的独居老人情感状态监护系统(PyQt5界面+数据集+训练代码)
  • Qt添加外部库:静态库和动态库,批量添加头文件
  • Unity类银河战士恶魔城学习总结(P132 Merge skill tree with skill Manager 把技能树和冲刺技能相组合)
  • Docker入门之Windows安装Docker初体验
  • DNS实验作业
  • CSS回顾-CSS选择器详解
  • FFMPEG录像推流时遇到的问题
  • 【STM32+K210项目】基于K210智能人脸识别+车牌识别系统(完整工程资料源码)
  • Unity脚本基础规则
  • 基于AIRTEST和Jmeter、Postman的自动化测试框架
  • 使用 Azure OpenAI 服务对数据进行联合 SharePoint 搜索
  • JavaScript学习笔记 1】初识JS
  • Linux-Samba
  • 【Java Web】JSON 以及 JSON 转换
  • Qt 元对象系统
  • 鸿蒙实战:使用隐式Want启动Ability
  • go-zero(二) api语法和goctl应用
  • java 操作Mongodb
  • 以Java为例,实现一个简单的命令行图书管理系统,包括添加图书、删除图书、查找图书等功能。
  • [JavaWeb]微头条项目
  • Linux(CentOS)安装达梦数据库 dm8
  • 【专题】中国企业出海洞察报告暨解码全球制胜之道报告汇总PDF洞察(附原数据表)
  • [ 跨域问题 ] 前后端以及服务端 解决跨域的各种方法
  • 网络安全之信息收集-实战-2
  • 利用飞书多维表格自动发布版本
  • 深入内核讲明白Android Binder【一】
  • Photoshop(PS)——人像磨皮
  • 如何用Excel批量提取文件夹内所有文件名?两种简单方法推荐
  • YOLOv8改进,YOLOv8通过RFAConv卷积创新空间注意力和标准卷积,包括RFCAConv, RFCBAMConv,二次创新C2f结构,助力涨点
  • 【实验11】卷积神经网络(2)-基于LeNet实现手写体数字识别