| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> PHP知识库 -> 记录一种新的流式数据计算架构的设计想法 -> 正文阅读 |
|
[PHP知识库]记录一种新的流式数据计算架构的设计想法 |
基于微服务实现流式数据处理思路: 2. 上游算子如何感知到下游算子? 个人有两种思路: (1)基于微服务服务注册中心的思路,下游算子主动向上游算子进行http请求注册,然后上游的每一个算子内部维护一个队列,内部记录下游算子的ip地址和端口号,用来请求发送数据。这种方式有一个缺点,就是在下游算子项目启动前配置好上游算子的所有机器ip地址和端口号。 (2)同样得,像eurake、nacos做集中的服务注册中心,然后每个上游算子定时主动和服务注册中心拉取最新的下游算子访问地址列表,这样的话不用在启动配置里写死了,方便动态扩展。 注意,每一类算子向服务注册中心注册的时候要带有一个共同的名字,代表着当前同一类算子任务的分组,这样上游算子才能依据下游算子任务组的名称获得正确的地址列表。(其实就和微服务注册道理一样) 第一种方式很不方便算子并行度动态扩展,所以pass掉,推荐第二种方式。 3. 上游算子如何将数据路由到同一个下游算子机器上? 有两种方式 (1)每条数据都制定一个字符串key值,通过这个key来进行hash分区,从缓存的下游算子队列中获取指定的下游算子机器。所以,这个缓存下游算子访问地址的队列中元素初始顺序(下标)一定不能发生改变,哪怕下游某个机器挂掉、或者与上游算子服务器直接出现网络分区,最多我们会给这个地址打上不可用的标识,但一定不能删除队列元素,避免打乱队列中的初始顺序。 (2)参考redis集群模式下的数据分区方式,我们固定16384个数据槽位,初始启动后,将这16384个数据槽位均分在每个算子任务集群机器上,这样就不在乎队列中的顺序改变了,我们将通过map结构来存储槽位对应的机器访问地址。 而数据的key分区操作,也将通过这16384个槽位进行分区,而且,同样得,我们也可以模仿redis集群解决数据倾斜的办法,如果真的有大量的数据倾斜到同一台机器,那么我们就针对这台机器上的槽位再次手动划分,划分到上线的新算子机器上,这样就可以迅速解决数据倾斜问题,而且这样的分区操作,实际上影响到的只有一台机器上的key,其他机器没有影响。(至于重分区的过程中上游算子的数据传输处理需要仔细考虑) 所以基本还是采用第二种方法比较靠谱。
数据在上下游算子之间的传递依靠http协议,每个算子内部维护一个同步阻塞定长队列用来缓存上游传来的数据内容,当这个队列满容量的时候,通过http阻塞上游算子的数据传输行为执行,这样就会阻塞住上游算子,进而向整个上游传递阻塞,进而做到反压(http相对简单一些,而且还可以做到超时阻塞,如果不设置超时时间,则可以永久阻塞)。
这里是最难解决的地方,目前来说没有特别好的思路。 首先就是算子运行状态恢复问题:我们在算子内部维护了一份队列用来缓存上游下发的数据,同时也可以阻塞上游处理流程,但是一旦机器宕机,这部分缓存的尚未处理计算的数据就会丢失,那么
其次就是数据的重新hash问题,算子缓存队列中的数据需要重新分区,分发的重新分区后的机器上,同时还要保证必须是在算子队列中的数据重新分区完成后,才能继续正常接收上游发送的数据,至于算子内部的中间键控状态数据,如果集中在redis中存储的话,倒容易解决,如果是存在本地机器,那么就还得对这部分键控状态数据进行重新分发。 7. 这个想法还是在和阿里的一位面试官的面试中得到的启发,当我讲述完我构思的这套数据实时处理架构的思路的时候,阿里面试官问了我一句,既然能够做到算子并行度的动态扩展调整,那么能不能做到算子任务的动态插拔,也就是说当整个计算流程正在执行中的时候,能够添加一类新的算子任务(添加一个新的数据计算维度)到某个运行中的算子任务下(这个提问真的瞬间感觉不愧是阿里大佬,真的绝了) 个人实现思路比较简单,既然要实现算子的动态插拔,那么就要有一个映射关系,也就是当前算子的下游算子,个人想法是可以通过zookeeper来实现,当前算子名称注册挂载zookeeper上作为一个节点,然后下游算子任务分组名称就挂载这个节点下面作为子节点,而且是有序子节点,这样的话,当前算子节点只需要取到下游算子任务分组名,然后遍历进行数据分发即可 8. 分布式环境下所带来的 数据乱序处理问题,因为是分布式环境,下游算子会收到来自多个上游算子发送的数据,对于下游算子来说,接收到来自上游算子的数据时序很有可能都是乱序的,那么此时我们就需要考虑,如何保证数据的有序处理。也就是flink中的时间乱序问题。(怎么说呢,乱序问题flink实际上也没有更好的解决方法,通过watermark机制来尽量控制乱序带来的问题,但并不能完全解决) 首先,我们也需要向flink中一样,制定好每一条数据的时间语义,如果是处理时间语义,那就很好解决了,如果要依据接收数据请求的时间排序的话,我们加上一个公平锁就行了,但如果是事件时间语义,就比较麻烦,这种情况下暂时没有好的解决方法,只能参考flink,等收集到一定时间范围内的数据之后再做处理计算,这一块比较复杂,还没有好的实现思路。 9. 待补充。。。
|
|
PHP知识库 最新文章 |
Laravel 下实现 Google 2fa 验证 |
UUCTF WP |
DASCTF10月 web |
XAMPP任意命令执行提升权限漏洞(CVE-2020- |
[GYCTF2020]Easyphp |
iwebsec靶场 代码执行关卡通关笔记 |
多个线程同步执行,多个线程依次执行,多个 |
php 没事记录下常用方法 (TP5.1) |
php之jwt |
2021-09-18 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 7:05:23- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |