延迟任务场景,该如何提高吞吐量和时效性!

Ray - 面向增强学习场景的分布式计算框架 如果关注这个领域的同学可能知道,Ray其实在去年就已经在开源社区正式发布了,只不过后来就一直没有什么太大动静,前段时间也是因为机缘巧合,我又回头学习了解了一下,顺便总结如下: Ray是什么? Ray 是RISELab实验室(前身也就是开发Spark/Mesos等的AMPLab实验室)针对机器学习领域开发的一种新的分布式计算框架。按照官方的定义:“Ray is a flexible, high-... 阅读详情

一、前言

不卷了,能用就行!

哈哈哈,说好的不卷了,能凑活用就行了。但每次接到新需求时都手痒,想结合着上一次的架构设计和落地经验,在这一次需求上在迭代更新,或者找到完全颠覆之前的更优方案。卷完代码的那一刻总是神清气爽

其实大部分喜欢写代码的一类纯粹码农,都是比较卷的,就比如一个需求在实现上是能用大概是P5、如果这个做出来的功能不只是能用还非常好用是P6、除了好用还凝练共性需求开发成通用的组件服务是P7。每一个成长过来的码农,都是在造轮子的路上一次次验证自己的想法和加以实践,绝对不是一篇篇的八股文就能累出来一个高级的技术大牛。

二、延迟任务场景

什么是延迟任务?

当我们的实际业务需求场景中,有一些活动开始前的状态变更、订单结算后的 T+1 对账、贷款单息费的产生,都是需要使用到延迟任务来进行触达。实际的操作一般会有 Quartz、Schedule 来对你的库表数据进行定时扫描和处理,当条件满足后做数据状态的变更或者产生新的数据插入到表中。

这样一个简单的需求就是延迟任务最初需求,如果需求前期内容较少、使用方不多,可能在实际开发中就只是一个单台机器直接对着表一顿轮训就完事了。但随着业务需求的发展和功能的复杂度提升,往往反馈到研发设计和实现,就不那么简单了,比如:你需要保障尽可能低延迟完成较大规模的数据量扫描处理,否则就像贷款单息费的产生,已经到了第二天用户还没看到自己的息费信息或者是还款后的重新对账,可能就这个时候就要产生客诉了。

那么,类似这样的场景该如何设计呢?

三、延迟任务设计

通常的任务中心处理流程主要,主要是由定时任务扫描任务库表,把即将达到超时时间的任务信息扫描到处理队列(内存/MQ消息),再由业务系统进行处理任务,处理完成后更新库表中的任务状态。

问题:

  1. 海量数据规模较大的任务列表数据,在分库分表下该需要快速扫描。

  2. 任务扫描服务与业务逻辑处理,耦合在一起,不具有通用性和复用性。

  3. 细分任务体系有些是需要低延迟处理的,不能等待过长时间。

1. 任务表方式

除了一些较小的状态变更场景,例如在各自业务的库表中,就包含了一个状态字段,这个字段一方面有程序逻辑处理变更的状态,也有到达指定到期时间后由任务服务自动变更处理的操作,一般这类功能,直接设计到自己的库表中即可。

那么还有一些较大也较为频繁使用的场景,如果都是在每个系统的各自所需的 N 多个表中,都添加这样的字段进行维护,就显得非常冗余了,也不那么易于维护。所以针对这样的场景就很适合做一个通用的任务延时系统,各业务系统把需要被延时执行的动作提交到延时系统中,再有延时系统在指定时间下进行回调,回调的动作可以是接口或者 MQ 消息进行触达。例如可以设计这样一个任务调度表:

  1. 抽取的任务调度表,主要是拿到什么任务,在什么时间发起动作,具体的动作处理仍交给业务工程处理。

  2. 大批量的各自业务的任务进行集中处理,则需要设计一个分库分表,满足于后续业务体量的增长。

  3. 门牌号设计,针对一张表的扫描,如果数据量较大,又不希望只是一个任务扫描一个表,可以多个任务扫描一个表,加到扫描的体量。这个时候就需要一个门牌号来隔离不同任务扫描的范围,避免扫描出重复的任务数据。

2. 低延迟方式

低延迟处理方案,是在任务表方式的基础上,新增加的时间把控处理。它可以把即将到期的前一段时间的任务,放置到 Redis 集群队里中,在消费的时候再从队列中 pop 出来,这样可以更快的接近任务的处理时效,避免因为扫库间隔较大延迟任务执行。

  • 在接收业务系统提交进来的延迟任务时,按照执行时间的长短放置到任务库或者也同步到 Redis 集群中,一些执行时间较晚的任务则可以先放到任务库,再通过扫描的方式添加到超时任务执行队列中。

  • 那么关于这块的设计核心在于 Redis 队列的使用,以及为了保证消费的可靠性需要引入二阶段消费、注册 ZK 注册中心至少保证一次消费的处理。本文重点主要放在 Redis 队列的设计,其他更多的逻辑处理,可以按照业务需求进行扩展和完善

Redis 消费队列

  • 按照消息体计算对应数据所属的槽位 index = CRC32 & 7

  • StoreQueue 采用 Slot 按照 SlotKey = #{topic}_#{index} 和 Sorted Set 的数据结构按执行任务分数排序,存放任务执行信息。定时消息将时间戳作为分数,消费时每次弹出分数小于当前时间戳的一个消息

  • 为了保障每条消息至少可消费一次,消费者不是直接 pop 有序集合中的元素,而是将元素从 StoreQueue 移动到 PrepareQueue 并返回消息给消费者。消费成功后再从 PrepareQueue 从删除,如果消费失败则从 PreapreQueue 重新移动到 StoreQueue,这样二阶段消费的方式进行处理。

  • 参考文档:2021 阿里技术人的百宝黑皮书 PDF 文,低延迟的超时中心实现方式

简单案例

@Test
public void test_delay_queue() throws InterruptedException {
    RBlockingQueue<Object> blockingQueue = redissonClient.getBlockingQueue("TASK");
    RDelayedQueue<Object> delayedQueue = redissonClient.getDelayedQueue(blockingQueue);
    new Thread(() -> {
        try {
            while (true){
                Object take = blockingQueue.take();
                System.out.println(take);
                Thread.sleep(10);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }).start();
    int i = 0;
    while (true){
        delayedQueue.offerAsync("测试" + ++i, 100L, TimeUnit.MILLISECONDS);
        Thread.sleep(1000L);
    }
}

测试数据

2022-02-13  WARN 204760 --- [      Finalizer] i.l.c.resource.DefaultClientResources    : io.lettuce.core.resource.DefaultClientResources was not shut down properly, shutdown() was not called before it's garbage-collected. Call shutdown() or shutdown(long,long,TimeUnit) 测试1测试2测试3测试4测试5Process finished with exit code -1

四、总结

  • 调度任务的使用在实际的场景中非常频繁,例如我们经常使用 xxl-job,也有一些大厂自研的分布式任务调度组件,这些可能原本都是很小很简单的功能,但经过抽象、整合、提炼,变成了一个个核心通用的中间件服务。

  • 当我们在考虑使用任务调度的时候,无论哪种方式的设计和实现,都需要考虑这个功能使用时候的以为迭代和维护性,如果仅仅是一个非常小的场景,又没多少人使用的话,那么在自己机器上折腾就可以。过渡的设计和使用有时候也会把研发资源代入泥潭

  • 其实各项技术的知识点,都像是一个个工具,刀枪棍棒斧钺钩,那能怎么结合各自的特点,把这些兵器用起来,才是一个程序员不断成长的过程。如果你希望了解更多此类有深度的技术内容,可以加入 Lottery 分布式抽奖秒杀系统 学习更有价值的更抗用的实战手段。

LSF0108 level shift设计使用及debug流程 目录 初版设计 测试出现的问题1 解决问题(尝试1) 测试出现的问题2 解决问题2-1 解决问题2-2 单Port测试结果 所有Port均连接测试结果 初版设计 此电路的应用场景在于将LCD屏幕连接到FPGA上,进而通过FPGA中设计的硬件电路来驱动LCD屏幕,验证数字硬件电路设计的正确性。因此需要一个转接板位于FPGA和LCD屏幕之间,将二者连接起来。 转接板的硬件电路设计主要存在以下需求: 实现3.3V和1.8V之间的同时双向逻辑转换(LCD屏幕电平为3.3V,FPGA电平为1. 阅读详情

相关推荐

从Arduino IDE到Atmel Studio:ATmega328P开发的进阶之路

本文探讨了从Arduino IDE转向Atmel Studio进行ATmega328P开发的进阶路径。通过对比两者差异,详细介绍了Atmel Studio的环境配置、寄存器操作思维、烧录方法及高级调试功能,帮助开发者突破Arduino的封装限制,实现对单片机底层硬件的精细控制与性能优化,提升嵌入式开发的专业能力。

weixin_29193259的博客 122

提高吞吐率的方法

提高吞吐率的方法

weixin_44910619的博客 2488

Unity3D 集成 SQLite 数据库实战:从零搭建到数据可视化

本文详细介绍了在Unity3D项目中集成SQLite数据库的完整实战流程。从SQLite的轻量、稳定、易用特性讲起,逐步指导开发者完成环境配置、驱动集成、C#脚本编写(涵盖连接、建表、增删改查),并进阶演示了数据模型封装与在Unity UI中实现数据可视化的方法。最后提供了多线程访问、路径差异、性能优化等关键避坑指南,帮助开发者构建可靠高效的本地数据管理方案。

weixin_29291069的博客 91

C#队列学习笔记:RabbitMQ使用多线程提高消费吞吐率

一、引言 使用工作队列的一个好处就是它能够并行的处理队列。如果堆积了很多任务,我们只需要添加更多的工作者(workers)就可以了,扩展很简单。本例使用多线程来创建多信道并绑定队列,达到多workers的目的。 二、示例 2.1、环境准备 在NuGet上安装RabbitMQ.Client。 2.2、工厂类 添加一个工厂类RabbitMQFactory: /// <summary> /// 多路复用技术(Multiple...

gman344的博客 674

centos7部署mysql8.0.35,主从复制,主主集群

centos7 linux部署mysql,主从复制,主主模式

zaixiaqin的博客 1990

N5105核显直通PVE:从黑屏到HDMI输出的完整指南

PCI直通能让虚拟机独占物理设备,但核显直通远没有独显那么轻松。Intel核显与CPU、显示输出链路的强耦合使UEFI引导、GOP驱动、驱动签名等环节都成了黑屏陷阱。在PVE虚拟化环境中,通过IOMMU开启、vfio-pci绑定、OVMF固件和Q35机型配合,可以绕过KVM检测,让Windows虚拟机正确驱动核显,从HDMI口输出画面,并解锁Intel Quick Sync硬解能力。这种方案尤其适合N5105等低功耗迷你主机,可作为客厅HTPC、本地视频硬解或依赖硬件加速的轻量工作台。本文基于N5105平台

weixin_31082403的博客 374

QPS、TPS、RT、吞吐量是什么意思?

QPS全称为Queries Per Second,即每秒钟处理的请求数量。对于一个高并发应用来说,QPS是非常重要的性能指标,它反映了应用处理请求的能力。在实际应用中,QPS的大小取决于应用的负载和应用本身的性能。举个例子,假设有一个电商网站,这个网站每天需要处理100万个订单请求,那么每秒钟需要处理的订单数量就是1000000 / 86400 ≈ 11.57。因此,这个网站的QPS应该至少达到11.57。

q12ERTYU的博客 1413

项目介绍 MATLAB实现基于LSTM-XGBoost长短期记忆网络(LSTM)结合极端梯度提升(XGBoost)进行多变量时序预测的详细项目实例(含模型描述及部分示例代码)

本项目基于MATLAB平台,实现LSTM-XGBoost混合模型进行多变量时序预测。通过LSTM网络自动提取时序特征,结合XGBoost强大的回归能力,有效解决多变量时序数据的高维复杂性、长短期依赖捕捉等难题。项目包含完整的数据预处理流程、模型构建与训练方法,以及性能评估指标。提供的GUI界面支持参数调整、训练监控和结果可视化,适用于能源、金融、气象等多领域预测任务。配套代码详细注释,便于理解模型实现细节,为时序预测研究提供实用参考框架。

优质创作者: 人工智能技术领域 对于有一定基础的 MATLAB和Python带具体需求都可以详谈 MATLAB和Python可以提供代码调试服务加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加油 谢谢 101

优化优先级任务以提高系统吞吐量

在当前的技术环境中,如何有效地调度大语言模型(LLM)的任务,已成为提升系统性能的关键因素。高效的任务调度不仅能够降低用户的延迟体验,还能显著提升系统的总吞吐量。

XianxinMao的博客 551

鸿宇多用户商城user.php RCE漏洞复现

鸿宇多用户商城 user.php 存在任意命令执行漏洞,攻击者可通过该漏洞在服务器端任意执行代码,写入后门,获取服务器权限,进而控制整个web服务器。

0xSec 1621

手把手教你学Simulink——整流器场景:基于PWM控制的单相全桥整流器设计

摘要:本文详细介绍了使用Simulink搭建基于PWM控制的单相全桥整流器的完整设计流程。主要内容包括:系统结构设计(含交流电源、全桥整流器、滤波电路等模块)、分步骤建模过程(从创建项目到添加各功能模块)、双闭环控制系统设计(电压外环和电流内环PI控制)、参数设置建议及仿真分析。通过仿真验证,该整流器可实现单位功率因数运行和稳定输出电压,并提供了数字锁相环等优化方向。文章为电力电子系统设计提供了实用的Simulink建模指导。(149字)

MHD0815的博客 324

QPS、TPS、并发用户数、吞吐量详解

QPS、TPS、并发用户数、吞吐量详解

闲余知道 2727

多思计组实验实验六 微程序控制器实验

实验六 微程序控制器实验

qq_53089329的博客 3781

延迟任务场景,该如何提高吞吐量和时效性

摘要:随着业务需求的发展和功能的复杂度提升,往往反馈到研发设计和实现,就不那么简单了,怎么办呢?

华为云官方博客 1410

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

给面试加点硬菜:延迟任务场景,该如何提高吞吐量和时效性

面试不只有八股文,你还需要用有深度的硬核技术场景和方案设计,填补你那脆弱扛不住面试打击的项目。

bugstack虫洞栈 1815

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

还在埋头背八股文吗?不如先给自己的面试加点硬菜:怎样在延迟任务场景,提高吞吐量和时效性?

前言 之前分享了非常多大厂的面经汇总,也接到了很多同学的私信。 但面试其实不只有八股文,我们还需要用有深度的硬核技术和方案设计,去填补自己。 其实大部分喜欢写代码的一类纯粹码农,都是比较喜欢卷的,就比如一个需求在实现上是能用大概是P5、如果这个做出来的功能不只是能用还非常好用是P6、除了好用还凝练共性需求开发成通用的组件服务是P7。每一个成长过来的码农,都是在造轮子的路上一次次验证自己的想法和加以实践,绝对不是一篇篇的八股文就能累出来一个高级的技术大牛。 二、延迟任务场景 什么是延迟任务?

wdjnb的博客 228

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

实时计算性能优化秘籍:提升Flink任务吞吐量的8项配置调优

提升Flink任务吞吐量的8项配置调优,解决实时计算性能瓶颈。适用于Java Flink实战场景,涵盖并行度、缓冲区、检查点等核心优化策略,显著降低延迟、提高稳定性。方法实用高效,值得收藏。

SimProceed的博客 419

OneAPI效果实测报告:24个大模型API平均延迟、吞吐量、stream成功率横向评测

本文介绍了如何在星图GPU平台上自动化部署“通过标准的 OpenAI API 格式访问所有的大模型,开箱即用”镜像,实现统一API网关功能。该镜像可集中管理24个主流大模型,提供标准化的OpenAI格式接口,显著简化多模型调用流程,适用于需要统一接入多个大模型的AI应用开发场景。

weixin_42348783的博客 173

使用MRS CDL实现实时数据同步的极致性能

摘要:MRS CDL旨在实现最大的数据复制吞吐量和低复制延迟。

华为云官方博客 1万+

离线数仓和实时数仓区别

离线数仓通常采用传统的大数据架构,以Hadoop为核心,使用HDFS作为存储层,使用MapReduce、Hive、Spark等作为计算层,使用ODS、DWD、DWS、DM等作为数据层,使用OLAP、RDS、KV等作为服务层。实时数仓通常采用Kappa架构或Lambda架构,以Kafka为核心,使用Kafka作为存储层和消息层,使用Flink、Storm、Spark Streaming等作为计算层,使用ODS、DWD、DWS等作为数据层,使用MQ、OLAP、RDS、KV等作为服务层。

互联网小白兔专业CRUD 选手 1623

构建低延迟实时推荐系统的设计思路

构建一个实时推荐系统不仅要求系统架构设计合理、模块划分清晰,更需要在实际业务中不断优化流处理、缓存、分布式架构及模型轻量化等策略,以确保系统在高并发场景下依旧能保持低延迟响应。通过数据采集、存储、模型训练与在线服务的有机结合,我们可以实现一个既高效又具备良好用户体验的推荐系统。希望本文的分享能够为大家提供一些设计思路和实践经验,欢迎在评论区交流你的见解与问题。

gs80140的专栏 1304

CodeLlama与StarCoder在vLLM上的部署:代码补全场景的延迟与准确性优化实践

在软件开发领域,代码补全技术已成为提升开发效率的关键工具。随着大型语言模型(LLM)技术的进步,基于Transformer架构的代码生成模型如CodeLlama和StarCoder展现出强大的上下文理解能力。本文将探讨这两种模型在vLLM推理框架上的部署方案,重点分析代码补全场景下的延迟控制与准确性优化策略,为开发者提供可复用的技术路径。

617

消息队列面试题(五)

1. 对于一个实时性要求很高的场景,你会选择哪种消息队列技术,为什么? 2. 消息队列在大数据处理中的应用场景有哪些?举例说明。 3. 消息队列的消息过期策略是怎样的?有什么作用? 4. 什么是消息队列的消息过滤功能,如何使用它来提高处理效率? 5. 如何设计一个支持高吞吐量的消息队列系统,有哪些关键点和优化措施? 6. 在使用消息队列时,如何平衡系统的吞吐量和消息的延迟? 7. 当消息队列出现故障或性能瓶颈时,你通常如何进行排查和解决问题? 8. 结合你的项目经验,分享一些在使用消息队列时的最佳实践和经验

闲依农圃邻,偶似山林客。 1078

流式计算和产业智能化学习

一、流式计算的背景 在日常生活中,我们通常会先把数据存储在一张表中,然后再进行加工、分析,这里就涉及到一个时效性的问题。如果我们处理以年、月为单位的级别的数据,那么多数据的实时性要求并不高;但如果我们处理的是以天、小时,甚至分钟为单位的数据,那么对数据的时效性要求就比较高。在第二种场景下,如果我们仍旧采用传统的数据处理方式,统一收集数据,存储到数据库中,之后在进行分析,就可能无法满足时效性的要求。 二、流式计算与批量计算 大数据的计算模式主要分为批量计算(batch computing)、流式计算(stre

qq_15821487的博客 364

vLLM-v0.11.0自动驾驶场景:指令生成系统案例

本文介绍了如何在星图GPU平台上自动化部署Vllm-v0.11.0镜像,以构建高性能的自动驾驶指令生成系统。该平台简化了部署流程,用户可快速搭建基于vLLM推理框架的服务,实现毫秒级响应,将复杂的路况描述实时转化为准确、安全的驾驶控制指令。

weixin_42613017的博客 745
上一篇: 低延迟的超时中心实现方式
下一篇: ClickHouse 核心引擎 MergeTree 解读
wrr-cat
博客等级 码龄9年 128粉丝 302原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值