异步任务使用场景与实践

news2025/4/6 12:52:57

异步任务使用场景

根据同步/异步方式划分场景,各场景下常用的技术方案如下:

方式实现特点缺点
同步HTTP RPC Cache etc.指标:RT、QPS、TPS、缓存命中率 等;

关注(准)实时数据,用户可交互
1. 处理数据量小:对应的业务妥协有必选筛选项、分页、滑动分页、异步渲染,首屏接口;
2. 并发请求压力不宜过大:利用缓存、CDN、异构存储等方式缓解压力;
3. 调用失败率较高:如调用超时,对应的处理方式有重试、降级、熔断;
异步MQ Job Hive etc.指标:吞吐量 等;

最终一致性,处理数据量大,耗时长,定时,削峰,解耦
1. 异步用户需等待;
2. 系统复杂度提升;

Job 业务场景:

  • 批量场景:物流发货、订单超时关闭
  • 周期性场景:财务结算,业务指标统计

Job 技术场景:

  • 定时向其他服务/第三方系统推送数据:如本地消息表补偿发送消息,外部系统数据变更无法和当前系统业务动作不处于一个事务中无法保证业务动作的原子性,故利用本地表存储交互内容,后续通过定时任务查询该表执行外部交互动作,确保该行为一定发生。
  • 定时拉取第三方系统数据:一般第三方系统不提供MQ这种数据变更的主动Push方式,而是当前系统主动Pull数据,一般第三方提供HTTP接口。

这里选取Job技术场景进行说明:

本地消息表

微服务之间通常使用 Event Driven 的方式异步处其他领域事件,达到解耦服务的目的。实现上利用MQ,MQ的发布-订阅模式具有高扩展性。
本地业务动作提交成功后,预期是MQ事件消息一定发送成功,但是存在两种异常Case:

在这里插入图片描述

常用的解决方式有两种:

  1. 事务消息
  2. 本地消息表

由于事务消息集成复杂度高,且事务消息失败后无法自动重试,故本地消息表才是最终解决方案,本地消息表的处理方式如下图:

在这里插入图片描述

如果是顺序消息,则 【Try Send Message】步骤不可添加,同时补偿任务发送需要以shardingKey维度串行发送。

如果分库,每个库都必须有单独的本地消息表,避免跨库事务

本地消息表组件可参考:开源中…

如果只是想在事务提交后执行逻辑而不用补偿,可注册TransactionSynchronization在事务提交后回调执行,代码如下:

import java.util.function.Consumer;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationAdapter;
import org.springframework.transaction.support.TransactionSynchronizationManager;

public class TransactionUtils {
    public static void executeAfterCommit(Runnable runnable , Consumer<Exception> exceptionConsumer) {
        // 有事务,注册Synchronization,事务提交后执行
        if (TransactionSynchronizationManager.isSynchronizationActive()) {
            TransactionSynchronization transactionSynchronization = new TransactionSynchronizationAdapter() {
                @Override
                public void afterCommit() {
                    try {
                        runnable.run();
                    } catch (Exception e) {
                        exceptionConsumer.accept(e);
                    }
                }
            };
            // 注册Synchronization
            TransactionSynchronizationManager.registerSynchronization(transactionSynchronization);
        }
        // 无事务直接执行
        runnable.run();
    }
}

定时拉取第三方系统数据

公司内部不同系统间通信一般通过 RPC 或 MQ的方式交互,但第三方系统出于通用性、安全性考虑,一般只提供HTTP接口,则与第三方系统的交互必须有服务自行发起调用。调用过程中由于不具备原子性,通常需要有对账机制去保证三方系统和内部系统数据的一致性。同时,三方接口调用需要考虑批量参数、调用频次、加密解密等问题。

异步任务实践

任务中断与自动恢复执行

任务执行一般耗时较长,中断可能性高,比如任务在执行过程中有上线行为,则该任务必须被强制打断(虽然有优雅下线的处理方式,但是任务执行时长是不可预知的,所以一般直接打断)。打断后重启执行需要保证上次执行没处理完的任务接续执行,不会因为任务打断导致任务数据不可重试。通常业务模型状态需要加一个“执行中”状态标识该数据正在被任务处理,比如,现在需要推送一单发货单到第三方系统,推送状态机如下:

在这里插入图片描述

可以看到加了一个"xx中"状态表示任务执行过程,任务执行过程如下:

在这里插入图片描述

如上图所示,即使任务被打断也能自动恢复推送,【推送中】状态表示该项数据已经开始处理,在用户侧可以感知该状态。在向第三方推送完成之后,如果提交失败,下次任务执行会再次推送,这里要求第三方接口幂等。 推送数据添加最大重试推送次数,超过最大次数应告警。

分布式调度与任务并行执行

在分布式环境下,任务调度的执行策略可分为:

  • 单机调度:只调度到单一Pod,如第一个、最后一个;
  • 分片调度:根据业务参数分片,不同业务参数的任务调度到不同的单机并行执行,类似于MQ的分区顺序;
  • 并行调度:完全并行调度,使用较少。

单机调度情况下不一定是串行执行的,任务执行时长可能大于调度间隔,仍然存在并发修改数据问题,这里任务组件可配置【丢弃执行】【排队等待】等阻塞策略,但在任务业务代码层面,如果需要保证严格串行处理,需要在任务执行前加分布式锁;同时加锁的粒度可按照业务维度进一步拆分,最好不要锁整个任务,这样结合分片执行策略可以提升任务处理效率。

第二类丢失更新

异步任务往往需要和其他状态变更动作协作。例如如下场景:

  • 现有统计记录表包含统计状态字段,包含两个状态 0:【待统计】 1:【已统计】 ;
  • 用户点击【开始统计】,插入/变更统计记录,状态置为【待统计】;
  • 有异步任务定时查询【待统计】 状态记录,统计完成后将状态置为【已统计】;
  • 【已统计】的记录可再次统计。

考虑如下Case:

在这里插入图片描述

用户更新了待统计数据,但是第二次点击【开始统计】后,统计结果仍然是更新前的结果。

解决方式: 统计状态字段不再使用二值表示,而是使用累加值表示待统计次数,类似可重入锁设计;
或者任务最后更新时加上 where update_time = #{selectedUpdateTime} 的乐观锁。

限制任务单次处理batchSize大小、只打印关键日志

任务处理通常需要批量查询/变更表数据,最好加batchSize限制单次任务执行的数量,减少单次任务耗时。同时任务涉及可重试的数据变更应设置最大变更次数,超过最大变更次数应跳过执行并告警。最后,批量任务应只打印关键日志,批量场景下日志过多打印有Pod磁盘占用率升高的风险。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1845662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务架构-线上治理、线下治理与架构演进

目录 一、线上治理 1.1 概述 1.2 线上预案体系 1.2.1 概述 1.2.2 变更引起的故障 1.2.3 流量和容量变化引起的故障 1.2.4 依赖故障 1.2.5 机房、网络等硬件和环境故障 1.2.6 其他 1.2.7 故障的场景化 1.3 基于Metric的预案自动触发 1.4 治理参数动态调整 1.4.1 举例…

dial tcp 10.96.0.1:443: connect: no route to host

1、创建Pod一直不成功&#xff0c;执行kubectl describe pod runtime-java-c8b465b98-47m82 查看报错 Warning FailedCreatePodSandBox 2m17s kubelet Failed to create pod sandbox: rpc error: code Unknown desc failed to setup network for…

算力之困,大模型何解?

互联网企业选择大模型合作伙伴之时&#xff0c;首要考虑的因素是算力。 大模型本身就是巨量参数“力大砖飞”的结晶&#xff0c;也就是说大模型与大算力密不可分。 发展到今天&#xff0c;国内的大模型在对话层面&#xff0c;已经与GPT-3.5接近&#xff0c;但在复杂指令层面与…

使用nvm安装node.js ,方便管理多个版本的node.js,且程序添加和卸载页面也不会出现多个版本的node.js软件(是一个都不会出现)

首先下载和安装nvm windows 安装 nvm&#xff1a; 需要先把本地安装的Node.js卸载&#xff0c;然后再下载nvm&#xff0c;地址&#xff1a; https://github.com/coreybutler/nvm-windows/releases 一般情况&#xff0c;找到最新版本&#xff0c;然后下载nvm-setup.exe文件就可以…

WACV2024论文3D相关速览48篇

WACV2024 3D相关论文阅读 Paper1 Self-Supervised Edge Detection Reconstruction for Topology-Informed 3D Axon Segmentation and Centerline Detection 摘要小结: 许多基于机器学习的轴突追踪方法依赖于带有分割标签的图像数据集。这需要领域专家的手动标注&#xff0c;既…

DP:完全背包+多重背包问题

完全背包和01背包的区别就是&#xff1a;可以多次选 一、完全背包&#xff08;模版&#xff09; 【模板】完全背包_牛客题霸_牛客网 #include <iostream> #include<string.h> using namespace std; const int N1001; int n,V,w[N],v[N],dp[N][N]; //dp[i][j]表示…

从社交网络到元宇宙:Facebook的战略转型

随着科技的迅猛发展和数字化时代的深入&#xff0c;社交网络已不再局限于简单的信息交流和社交互动&#xff0c;而是逐步向更广阔、更深远的虚拟现实空间——元宇宙&#xff08;Metaverse&#xff09;转变。作为全球最大的社交网络平台之一&#xff0c;Facebook正在积极推动这一…

从新手小白到红酒大咖:解锁红酒品鉴的终极秘籍,升级之路全攻略

在五彩斑斓的饮品世界中&#xff0c;红酒以其深邃的色泽、丰富的口感和悠久的历史&#xff0c;吸引了无数人的目光。对于红酒的初学者来说&#xff0c;从小白到品鉴师的道路或许充满了未知与挑战&#xff0c;但只要掌握了正确的知识和方法&#xff0c;就能够轻松踏入这个美妙的…

RAG实操教程langchain+Milvus向量数据库创建你的本地知识库 二

Miluvs 向量数据库 关于 Milvui 可以参考我的前两篇文章 • 一篇文章带你学会向量数据库Milvus&#xff08;一&#xff09;[1]• 一篇文章带你学会向量数据库Milvus&#xff08;二&#xff09;[2] 下面我们安装 pymilvus 库 pip install --upgrade --quiet pymilvus如果你…

SpringBoot整合justauth实现多种方式的第三方登陆

目录 0.准备工作 1.引入依赖 2.yml文件 3. Controller代码 4.效果 参考 0.准备工作 你需要获取三方登陆的client-id和client-secret 以github为例 申请地址&#xff1a;Sign in to GitHub GitHub 1.引入依赖 <?xml version"1.0" encoding"UTF-8&quo…

代码走查的一个实例

1996年6月23日至7月1日&#xff0c;我被点名到四川某单位协助排查某系统的技术问题。 我不懂该系统的原理&#xff0c;也不懂硬件&#xff0c;只能从软件角度分析问题。 那时&#xff0c;我所在单位已经为一家美国公司做了3年的软件第三方独立验证和测试&#xff0c;从中学到…

【51单片机基础教程】点亮led

文章目录 前言51单片机点亮LED的原理硬件部分软件部分51单片机的寄存器编程步骤proteus仿真点亮一个led 点亮多个ledproteus仿真代码 流水灯 总结 前言 单片机&#xff08;Microcontroller Unit, MCU&#xff09;是一种集成电路&#xff0c;广泛应用于各种电子产品中。作为嵌入…

1. zookeeper分布式协调者

zookeeper分布协调者 一、zookeeper介绍1、软件设计架构1.1 单体架构1.2 SOA架构/分布式1.3 微服务架构 二、zookeeper角色1、角色2、选举机制3、znode类型 三、zookeeper集群部署1、环境规划2、安装jdk3、安装配置zookeeper3.1 安装zookeeper3.2 编辑配置文件3.3 创建myid文件…

LCP 61. 气温变化趋势

题目 力扣城计划在两地设立「力扣嘉年华」的分会场&#xff0c;气象小组正在分析两地区的气温变化趋势&#xff0c;对于第 i ~ (i1) 天的气温变化趋势&#xff0c;将根据以下规则判断&#xff1a; 若第 i1 天的气温 高于 第 i 天&#xff0c;为 上升 趋势若第 i1 天的气温 等…

WPF 深入理解六、ControlTemplate控件模板

ControlTemplate 定义 控件模板用于来定义控件的外观、样式&#xff0c;还可通过控件模板的触发器(ControlTemplate.Triggers)修改控件的行为、响应动画等。 对与WPF当中,每个控件都是无外观的,这意味着我们可以完全自定义其可视元素的外观,但是不能修改其内部的行为&#xf…

springboot相关的一些知识

SpringBoot可以同时处理多少请求 SpringBoot默认的内嵌容器是Tomcat&#xff0c;所以SpringBoot可以同时处理多少请求取决于Tomcat。 SpringBoot中处理请求数量相关的参数有四个&#xff1a; server.tomcat.thread.min-spare&#xff1a;最少的工作线程数&#xff0c;默认大小…

AI简历:实习简历制作的智能解决方案是什么?

时间匆匆&#xff0c;我们又迎来了毕业季。大学生活丰富多彩&#xff0c;学业同样重要。毕业答辩对于每位大学生来说都是一道重要的门槛。回想起那些为了答辩准备而熬夜、焦虑的日子&#xff0c;那份努力至今难忘。 虽然答辩的准备工作可能相当繁琐&#xff0c;但幸运的是&…

【MySQL系列】MySQL 字符集的演变与选择

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【数据结构与算法】树的存储,森林 详解

树的几种存贮结构(双亲表示法、孩子表示法、孩子兄弟表示法)的优缺点&#xff0c;各自适应的运算。 双亲表示法&#xff1a; 优点&#xff1a;方便查找双亲及其祖先结点缺点&#xff1a; 查找孩子和兄弟结点比较费事未表示出结点之间的先后次序 适应的运算&#xff1a;查找节点…

基于国产飞腾2000制作的paddleocr hubserving服务docker镜像文件

paddleocr hubserving国产化飞腾、鲲鹏armv8 api服务镜像制作 一、编译paddle paddle官网说明在处理器飞腾2000和鲲鹏需要自行编译&#xff08;FT2000/Kunpeng 920 2426SK&#xff09; 如果自己编译可以参考官网飞腾/鲲鹏下从源码编译-使用文档-PaddlePaddle深度学习平台 二…