Flink从入门到放弃(十二)-企业实战之事件循环驱动型场景(二)

2023-10-29

上文Flink从入门到放弃(十二)-企业实战之事件驱动型场景踩坑(一)为大家介绍了Flink基于事件驱动场景下的渠道流量分析实时需求以及遇到的坑。
本文继续讲解基于事件驱动场景来讲解下关于响应时效、服务质量类的需求方案设计以及遇到的坑 (关于Flink主题的所有文章已整理同步到在线腾讯文档,本文中涉及到其他知识点都可在文档中查看,后台回复【文档】获取链接)。

需求背景

对于响应时效、服务质量类的需求是适用于各种业务场景下的。这里举一个实际的例子:我们在一些外卖平台上选取商品支付下单,然后进入商家接单环节,这个时候想要分析下商家接单的效率以及结合顾客的评价数据来给这个商家排级,那么可以通过等待时长的计算来反应出接单效率,并可以应用一些规则结合预警机制来触达商家。

方案设计

这里的实时计算等待时长其实和上篇文章的实际案例是一样的思路,但仍有一些不同点,上篇文章中只需要定时触发一次就可以来恢复或初始化指标值。而本次需求因为从下单到接单的过程当中,该订单并不会有任何的事件产生,那么对于我们实时计算等待时长就会有一定的难度,而不是等到商家接单了触发计算才得到等待时长。

因此如何循环驱动事件产生是本需求最大的难点。这里小编采用了队列分流的思想来设计,如下图:图片流程细节如下:
 1、从数据来源Kafka中消费数据,然后进行分流;
 2、将待处理的订单推送到临时队列中,将所有最新状态的订单进行持久化
 3、从临时队列中拿出待处理的订单,然后再从持久化存储中查询该订单的最新状态,如果订单已经处理,则从临时队列中丢弃;如果订单仍未处理,则放到结果队列中,进行下一步的处理
 4、从结果队列中拿到仍处于待处理的订单,然后再从持久化存储系统中查询最新的状态,如果处于待处理中,则回流到临时队列中进行等待处理,如果订单已经处理则丢弃;
 5、从结果队列中拿到的最后需要计算的订单输出到下游,计算时长即可。

工程实践

根据上面的方案设计,涉及到队列和持久化存储。至于技术选型,可以结合企业实际情况抉择。实现方式既可以是Flink SQL 或者Jar。
小编这里选择通用的方案:即队列以Kafka为主,持久化存储以HBase作为维表关联。实现方式先以SQL的伪代码供大家参考;

 --输出队列
insert into real_dwd_order_info
select 
  t1.*
from 
 ( --临时队列
   select *,PROCTIME() as proctime
   from real_tmp_order_info_from_kafka
 )t1  
left join real_dim_order_info_to_hbase FOR SYSTEM_TIME AS OF t1.proctime t2 --维度关联最新订单状态
on t1.order_id = t2.order_id
where t2.order_id is null or t2.order_status='待处理'

--回流到临时队列
insert into real_tmp_order_info_from_kafka
select 
  t1.*
from 
 ( --输出队列
   select *,PROCTIME() as proctime
   from real_dwd_order_info
 )t1  
left join real_dim_order_info_to_hbase FOR SYSTEM_TIME AS OF t1.proctime t2 --维度关联最新订单状态
on t1.order_id = t2.order_id
where t2.order_id is null or t2.order_status='待处理'

如下图所示:上述的方案是可实现的。图片

踩坑填坑

尽管上述方案可实现,但存在以下几个弊端:
 1、频繁查询维度表,又因为要获取到最新的订单状态,所以缓存控制要有一定的权衡。
 2、临时队列和输出队列是处于一种循环的状态,不可避免就会有存储资源严重浪费的情况,并且会影响到下游的计算,有可能会出现反压情况,对于时效性有一定的影响。这里可以根据实际情况权衡是否可以定时循环驱动(只需要调整结构即可)
 3、由于循环驱动回流的特点,对下游的数据波动情况可能会比较明显(考虑到回撤问题,和问题2类似)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flink从入门到放弃(十二)-企业实战之事件循环驱动型场景(二) 的相关文章

  • 【mySQL】C++ 操作mySQL

    目录 通过mySQL 库 简介 安装和配置 linux环境 WIN32环境 C 调用mysql 通过Mysql connector c 库 前言 Connector C 使用 3 4 静态库和动态库 动态库 创建项目和配置 代码编写 使用中
  • C51定时器与计数器(学习笔记)

    1 什么是定时器与计数器 1 定时器与计数器都是soc当中的一个内部外设 计数器顾名思义是用来计数的 就和我们的秒表一样 假如定时20秒 当我们按下秒表开始计数时 数秒的过程就是计数 计时器 当秒表数到20时 定时器 就自动暂停 2 工作模

随机推荐

  • Redis系列--新数据类型详解

    一 Bitmaps 一 简介 计算机存储数据时 都是以二进制位表示 Redis提供了Bitmaps这个 数据类型 可以实现对位的操作 1 Bitmaps本身不是一种数据类型 实际上它就是字符串 key value 但是它可以对字符串的位进行
  • matlab 将深度图像转换为点云

    目录 一 功能概述 1 算法概述 2 主要函数 3 参考文献 二 代码实现 三 结果展示 1 深度图像 2 彩色图像 3 生成点云 四 参考链接 一 功能概述 1 算法概述 深度相机能够获取物体到相机的距离信息 可以根据距离信息 计算像素的
  • 递归调用之迷宫问题

    我们假设数字1表示墙 数字0表示可以走 那么就可以用一个二维数组来模拟一个迷宫 并可以用递归调用来求解路线 下面的代码是用Java模拟的一个迷宫 代码很简单 public class MiGong public static void ma
  • button标签的onclick事件

    1 普通的button标签定义onclick事件 1 无参
  • delphi 10.3 FastReport 多设备跨平台 打印之解决方法

    以下能WINDOWS10 DELPHI 10 3 FastReport6 0上顺利通过 基础知识点 需掌握 https blog csdn net qq 25439957 article details 87110559 FastRepor
  • Java天地 学习探讨Java Spring中使用classpath加载配置文件浅析

    Spring中使用classpath加载配置文件浅析 如果您感觉可以请提出您宝贵的意见 在应用Spring的工程中 使用class path的方式加载配置文件应该是最常用的做法 然而对大部分人来说 刚开始使用Spring时 几乎都碰到过加载
  • 免费搜索引擎登录入口

    百度免费登录入口 http www baidu com search url submit htm 新浪免费登录入口 http bizsite sina com cn newbizsite docc index 2jifu 09 htm 搜
  • Vue中@input用法以及v-model示例

  • 外部局域网直接访问WSL2

    1 开启hyper v 1 首先 进入控制面板 程序 启用或关闭windows功能 勾选hyper v 确认后重启电脑 2 打开 Windows PowerShell 输入 systeminfo 命令 能够看到出现了很多处理器的信息 最末尾
  • MongoDB - 安装

    一 Docker安装MongoDB 1 安装 安装版本 7 0 0 docker run itd name mongodb v C data mongodb data data db p 27017 27017 mongo 7 0 0 au
  • QT环境变量配置

    QT官网地址 https my qt io 一 windows系统 1 1 QT下载安装 1 2 进入Qt安装目录 1 3 拷贝gcc所在的路径 不同安装目录有所差异 C Qt Qt5 5 0 Tools mingw492 32 bin 1
  • 数学建模常用Matlab/Lingo/c代码总结系列——旅行商TSP问题

    Lingo代码 MODEL SETS CITY 1 6 U U I sequence no of city LINK CITY CITY DIST The distance matrix X X I J 1 if we use link I
  • vuex中拿不到state中值的问题(state是undefined)

    首先下载vuex然后看一下项目中main文件内有没有引入store文件并且挂载 import Vue from vue import App from App vue import Element from element ui impor
  • IDEA 打包MapReduce程序到集群运行的两种方式以及XShell和Xftp过期的解决

    参考博客 MapReduce打包成jar上传到集群运行 http t csdn cn 2gK1d Xshell7 Xftp7 解决强制更新问题 http t csdn cn rxiBG IDEA打包MapReduce程序 方式一 轻量级打包
  • forkJoin, zip, combineLatest区别

    前言 forkJoin zip combineLatest是rxjs中的合并操作符 用于对多个流进行合并 很多人第一次接触rxjs时往往分不清它们之间的区别 其实这很正常 因为当你准备用来合并的流是那种只会发射一次数据就关闭的流时 比如ht
  • [小技巧] git diff 里显示日文

    先在命令行执行下面的命令 export LANG ja JP UTF 8 然后执行 git diff
  • TensorRT对face_boxes的加速

    TensorRT对face boxes进行加速 难点 priorbox layer和mobileNet SSD中的priorbox layer实现不太一样了 所以要对这层自己进行实现 当前遇到的报错 问题1 nvinfer1 DimsCHW
  • mac word无法显示仿宋字体解决方案

    仿宋是论文写作重要的字体 今天发现好多朋友的macOS系统里的word显示不了仿宋 或者显示不了一些字体 而我的电脑则是时而显示正常 时而显示异常 于是搜了一些解决方案并且自己实测了一下 在应用程序中找到word 右键显示包内容 在Reso
  • CentOS上PHP源码安装和配置

    CentOS上PHP源码安装和配置 此文是在CentOS 7上已经部署了Nginx的基础上进行的 关于CentOS7上安装Nginx 可参考我之前的文章 CentOS上Nginx安装记录 我们现在在这个基础上安装PHP 7 PHP里面概念挺
  • Flink从入门到放弃(十二)-企业实战之事件循环驱动型场景(二)

    上文Flink从入门到放弃 十二 企业实战之事件驱动型场景踩坑 一 为大家介绍了Flink基于事件驱动场景下的渠道流量分析实时需求以及遇到的坑 本文继续讲解基于事件驱动场景来讲解下关于响应时效 服务质量类的需求方案设计以及遇到的坑 关于Fl