异步任务使用场景与实践

异步任务使用场景

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

方式实现特点缺点
同步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() {@Overridepublic void afterCommit() {try {runnable.run();} catch (Exception e) {exceptionConsumer.accept(e);}}};// 注册SynchronizationTransactionSynchronizationManager.registerSynchronization(transactionSynchronization);}// 无事务直接执行runnable.run();}
}

定时拉取第三方系统数据

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

异步任务实践

任务中断与自动恢复执行

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

在这里插入图片描述

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

在这里插入图片描述

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

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

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

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

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

第二类丢失更新

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

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

考虑如下Case:

在这里插入图片描述

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

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

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

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

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

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

相关文章

javascript--类型检测 type of 和 instanceof

类型判断 1、typeof2、instanceof**instanceof 的原理** 3、constructor 1、typeof typeof在检测null、object、array、data的结果中都是object&#xff0c;所以无法用来区分这几个类型的区别。 <script>let a ["123",123,false,true,Symbol(1),new Date(),n…

ubuntu18.04 安装HBA

HBA是一个激光点云层级式的全局优化的程序&#xff0c;他的论文题目是&#xff1a;HBA: A Globally Consistent and Efficient Large-Scale LiDAR Mapping Module&#xff0c;对应的github地址是&#xff1a;HKU-Mars-Lab GitHub 学习本博客&#xff0c;可以学到gtsam安装&am…

系统凭据钓鱼揭秘

背景 在进行内网横向移动时&#xff0c;通常会尝试抓取目标机器上的登录哈希和密码。但是&#xff0c;这种方法并不总是可行&#xff0c;因为有些目标机器可能没有这些信息&#xff0c;或者这些信息已经被清除或加密。因此&#xff0c;黑客们开始模拟Windows系统环境中的身份认…

智慧学习实践系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;企业管理&#xff0c;任务管理&#xff0c;公告管理&#xff0c;菜单管理&#xff0c;用户管理&#xff0c;基础数据管理 企业账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;任务…

视频融合共享平台LntonCVS视频监控安防系统运用多视频协议建设智慧园区方案

智慧园区&#xff0c;作为现代化城市发展的重要组成部分&#xff0c;不仅推动了产业的升级转型&#xff0c;也成为了智慧城市建设的核心力量。随着产业园区之间的竞争日益激烈&#xff0c;如何打造一个功能完善、智能化程度高的智慧园区&#xff0c;已经成为了业界广泛关注的焦…

多线程(Lock锁,死锁,等待唤醒机制,阻塞队列,线程池)

Lock锁 虽然我们可以理解同步代码块和同步方法的锁对象问题但是我们并没有直接看到在哪里加上了锁&#xff0c;在哪里释放了锁为了更清晰的表达如何加锁和释放锁&#xff0c;JDK5以后提供了一个新的锁对象Lock Lock实现提供比使用synchronized方法和语句可以获得更广泛的锁定操…

数据可视化作业二:中国城市地铁数据可视化

目录 作业要求 一、绘制每个城市站点数量柱状图&#xff08;降序排列&#xff09; 1.1 每个城市站点数量统计 1.1.1 代码展示 1.1.2 统计结果展示 1.2 柱状图绘制 1.2.1 代码实现 1.2.2 绘制结果 二、绘制上海市地铁线路站点数饼状图 2.1 数据处理 2.2 代码实现 2.3…

实际二分搜索(写出函数,再用二分搜索法找左右边界 画图理解

实际二分搜索&#xff08;写出函数&#xff0c;再用二分搜索法找左右边界 看到最大值的最小化&#xff0c;左边界&#xff0c;最小化的最大值&#xff0c;右边界 画图理解 爱吃香蕉的珂珂 class Solution {public int minEatingSpeed(int[] piles, int h) {int left1,right10…

Mysql 8.3.0 安装

Mysql 8.3.0 安装地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) 下载链接&#xff1a;https://downloads.mysql.com/archives/get/p/23/file/mysql-8.3.0-linux-glibc2.28-x86_64.tar.xz 解压&#xff1a; tar -xvf mysql-8.3.0-linux-glib…

sql资料库

1、distinct(关键词distinct用于返回唯一不同的值)&#xff1a;查询结果中去除重复行的关键字 select distinct(university) from user_profile select distinct university from user_profile distinct是紧跟在select后面的&#xff0c;不能在其他位置&#xff0c;不然就…

【Linux】I/O多路复用模型 select、poll、epoll

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;Linux系列专栏&#xff1a;Linux基础 &#x1f525; 给大家…

多模块存储器

随着计算机技术的发展&#xff0c;处理的信息量越来越多&#xff0c;对存储器的速度和容量要求也越来越高&#xff1b;而且随着CPU性能的不断提高、IO设备数量不断增加&#xff0c;导致主存的存取速度已经称为了整个计算机系统的性能瓶颈。这就要求我们必须提高主存的访问速度。…

令人震撼的人类智慧的科学领域-AI技术

AI&#xff0c;全称为人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;是一门致力于让机器模仿人类智慧的科学领域。其核心技术涵盖了机器学习、自然语言处理、计算机视觉及专家系统等多个方面。AI旨在开发能够感知环境、进行逻辑推理、自主学习并做出决策…

【VMware】VMware虚拟机安装_配置_使用教程

一、准备工作 1、下载VMware软件&#xff1a;访问VMware官方网站&#xff0c;下载适合你操作系统的VMware Workstation Pro安装包。 下载地址&#xff1a;VMware Desktop Hypervisors for Windows, Linux, and Mac 2、准备操作系统镜像文件&#xff1a;根据你想要在虚拟机中安…

红黑树(数据结构篇)

数据结构之红黑树 红黑树(RB-tree) 概念&#xff1a; 红黑树是AVL树的变种&#xff0c;它是每一个节点或者着成红色&#xff0c;或者着成黑色的一棵二叉查找树。对红黑树的操作在最坏情形下花费O(logN)时间&#xff0c;它的插入操作使用的是非递归形式实现红黑树的高度最多是…

thread model线程模型

Concurrency并发 vs. Parallelism执行 Many-to-One GNU Portable Threads 多对一即多个用户线程映射到单个内核线程 该模式用的少 一个线程阻塞会导致所有线程阻塞 多线程可能无法在多核系统上并行运行&#xff0c;因为同一时间内核中可能只有一个线程 Concurrent executio…

探索FlowUs息流:个人和团队知识管理解决方案|FlowUs稳定保障你的笔记安全无忧

FlowUs息流&#xff1a;稳定运营保障你的笔记安全无忧 在知识管理工具的选择上&#xff0c;稳定性是用户最关心的问题之一。FlowUs息流以其稳定的运营记录&#xff0c;为用户提供了一个可靠的工作环境。我们深知&#xff0c;一个知识管理平台的稳定性直接影响到团队的生产力和…

3ds MAX 2024版资源包下载分享 3ds Max三维建模软件资源包下载安装

3DSMAX凭借其强大的功能和广泛的应用领域&#xff0c;吸引了无数创作者的青睐。 在游戏制作领域&#xff0c;3DSMAX展现出了无可比拟的优势。从细腻的角色建模到宏大的场景搭建&#xff0c;再到逼真的动画效果和渲染&#xff0c;它都能轻松应对&#xff0c;为游戏世界注入了生动…

“开放”的大模型到底有多“开放”?!

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则…

java面向对象(上)

一.面向对象与面向过程 1.面向过程 面向过程(procedure Oriented Programming),简称POP,主要思想就是将问题分解成一个个步骤去解决,把这个步骤称为函数. 典型语言:C语言 优点:可以大大简化代码 缺点:当代码量过大时,不方便维护 2.面向对象 面向对象(Object Oriented Pr…