上海闸北区网站建设深圳市推广网站的公司

张小明 2026/1/9 6:27:06
上海闸北区网站建设,深圳市推广网站的公司,移动建站优化,自己可以做类似拓者的网站吗业务背景跑批通常指代的是我们应用程序针对某一批数据进行特定的处理在金融业务中一般跑批的场景有分户日结、账务计提、欠款批扣、不良资产处理等等具体举一个例子 #x1f330;客户在我司进行借款#xff0c;并约定每月 10 号码还款#xff0c;在客户自主授权银行卡签约后…业务背景跑批通常指代的是我们应用程序针对某一批数据进行特定的处理在金融业务中一般跑批的场景有分户日结、账务计提、欠款批扣、不良资产处理等等具体举一个例子 客户在我司进行借款并约定每月 10 号码还款在客户自主授权银行卡签约后在每月 10 号通常是凌晨我们会在客户签约的银行卡上进行扣款然后可能会有一个客户、两个客户、三个客户、四个客户、好多个客户都需要进行扣款所以这一“批” 所有数据我们都要统一地进行扣款处理即为我们“跑批”的意思跑批任务是要通过定时地去处理这些数据不能因为其中一条数据出现异常从而导致整批数据无法继续进行操作所以它必须是健壮的并且针对于异常数据我们后续可以进行补偿处理所以它必须是可靠的并且通常跑批任务要处理的数据量较大我们不能让它处理的时间过于久所以我们必须考虑其性能处理总结一下我们跑批处理的应用程序需要做到的要求如下健壮性针对于异常数据不可能导致程序崩溃可靠性针对于异常数据我们后续可以跟踪大数据量针对于大数据量可在规定的时间内进行处理完毕性能方面必须在规定的时间内处理完从而避免干扰任何其他应用程序的正常运行跑批风险一些未接触过跑批业务的同学可能会犯一些错误·「查询跑批数据未进行分片处理」这种情况具体有两种情况一种是同学无意识进行分片处理直接根据查询条件将全量数据查出第二种情况呢不单是在跑批的时候可能出现的情况在平时的业务开发过程中也可能发现针对于查询条件未进行判空处理。比如 select id from t_user_account weher account_id 12; 然而在业务处理过程中account_id 为空却直接进行查询数据量一旦上来就容易导致 OOM 悲剧「未对数据进行批量处理」这种情况也是同学们容易犯的一个错误通常我们跑批可能会涉及到数据准备的过程那么有的同学就会直接梭哈边循环跑批数据边去查找所需的数据一方面for嵌套的循环处理时间复杂度通常是随着你的 for 个数上升的在项目中一个同学在保费代扣的跑批任务中进行了五次for 循环这个时间复杂度就是O(n ^ 5)了并且如果你的方法未进行事务管理的话数据库的连接释放也是一个非常消耗资源的事情上一个伪代码可能会比较好理解// 调用数据库查询需跑批数据 ListBizApplyDo bizApplyDoList this.listGetBizApply(businessDate); // for 循环处理数据 for(BizApplyDo ba : bizApplyDoList) { // 业务处理逻辑.. 省略 // 查询账户数据 ListBizAccountDo bizAccountDoList this.listGetBizAccount(ba.getbizApplyId()); for (BizAccountDo bic : bizAccountDoList){ // 账户处理逻辑.. 省略 } ... // 后续还会嵌套 for 循环 }「事务使用的力度不恰当」我们知道 Spring 中间的事务可分为编程性事务和声明式事务具体二者的区别我们就不展开说明了在开发过程中就有可能同学不管三七二一爽了就行直接 Trancational 覆盖住我们整个方法一旦方法处理时间过久这个大事务就给我们的代码埋下了雷「未考虑下游接口的承受能力」我们跑批任务除了在我们本系统进行的处理外还有可能需要调用外部接口比如代扣时我们需要调用支付公司侧的接口那么我们是否有考虑下游接口的承受能力和响应时间这里有一个坑下一个 part 我们展开说一下「不同的跑批任务时间设置不合理」在我们的项目中有一个的业务玩法是我们必须在保费扣完之后才可进行本息的代扣小张同学想当然我的保费代扣定时任务从凌晨12点开始一个小时定时任务总该结束了吧那么我的本息代扣的定时任务从凌晨1点开始吧可是这样设置真的合适吗优化思路定时框架的选择常用的有 Spring 定时框架、Quartz、elastic-job、xxl-job 等框架无谓好坏适合自己业务的才是最佳的可针对自己业务进行技术选型我们常使用的技术为 xxl-job针对于我们上文中所说到的不同的跑批任务设置的时间不合理我们即可利用 xxljob 的子任务特性进行嵌套的任务处理在保费代扣任务完成后紧接着进行本息代扣任务防止OOM切记分片处理这一点其实没有什么好展开的在对跑批任务进行开发的时候一定要记住分片处理一次性加载所有数据到内存里无疑是自掘坟墓那么如何优雅分片呢这时候小张同学举手了分片我会呀比如像这种扣款的都是以时间维度来的我直接 select * from t_repay_plan where repay_time 2022-04-10 limit 0,1000那么现在我们找个数据来看下这种深度分片的性能如何我在数据库中插入了大概两百万条数据把制造数据的过程也分享给你们// 1、创建表 CREATE TABLE t_repay_plan ( id int(11) NOT NULL AUTO_INCREMENT, repay_time datetime DEFAULT NULL COMMENT 还款时间, str1 int(11) DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT3099998 DEFAULT CHARSETutf8mb4 // 2、创建存储过程 delimiter $$ create procedure insert_repayPlan() begin declare n int default 1; while n 3000000 do insert into t_repay_plan(repay_time,str1) values(concat( CONCAT(FLOOR(2015 (RAND() * 1)),-,LPAD(FLOOR(10 (RAND() * 2)),2,0),-,LPAD(FLOOR(1 (RAND() * 25)),2,0))),n); set n n1; end while; end // 3、执行存储过程 call insert_repayPlan();随着逐渐的数据偏移数据耗时逐渐增加。因为这种深度分页是将数据全部查询出来并且抛弃掉效果自然不是那么尽如人意其实我们分片还有一种方法那就是利用到我们的 id 来进行分页处理当然是你的 id 是需要保证业务增长并且结合具体的业务场景来进行分析我们同样来试一下怎么利用 id 进行分片的耗时情况我们可以看到效果很明显利用 id 进行分片效果是优于我们的这个还款时间字段的当然关于跑批过程中「覆盖索引的使用、尽量不去 select * 等、批量进行插入」等 sql 常见点不和大家一一展开说明了针对所需数据进行 map 的构造我们再写一个简单的反例// 调用数据库查询需跑批数据 ListBizApplyDo bizApplyDoList this.listGetBizApply(businessDate); // for 循环处理数据 for(BizApplyDo ba : bizApplyDoList) { // 查询账户数据 BizAccountDo bizAccountDo this.getBizAccount(ba.getbizApplyId()); // 账户处理逻辑.. 省略 // 查询扣款人数据 CustDo custDo this.getCust(ba.getUserId); // 扣款人处理逻辑.. 省略 }我们可以这样进行改造伪代码、忽略判空处理// 调用数据库查询需跑批数据 ListBizApplyDo bizApplyDoList this.listGetBizApply(businessDate); // 构建业务申请编号集合 ListString bizApplyIdList bizApplyDoList.parallelStream().map(BizApplyDo::getbizApplyId()).collect(Collectors.toList()); // 批量进行账户查询 ListBizAccountDo bizAccountDoList this.listGetBizAccount(bizApplyIdList); // 构建账户 Map MapString, BizAccountDo accountMap bizAccountDoList.parallelStream().collect(Collectors.toMap(BizAccountDo::getBizApplyId(), Function.identity())) // 扣款人数据同样处理 for(BizApplyDo ba : bizApplyDoList) { account accountMap.get(ba.getbizApplyId()) // 账户处理逻辑.. 省略 }尽可能减少 for 循环的嵌套减少数据库频繁连接和销毁事务控制长点心一旦我们使用了Trancation进行管理事务那么就要求组内开发人员在开发过程中需要瞪大眼睛去注意事务的控制范围因为 Trancation 是在第一个 sql 方法执行的时候就开启了事务在方法未结束之前都不会进行提交有些同学接手改造这个方法的时候没有注意到这个方法是被Trancation覆盖那么在这个方法里加入一些RPC的远程调用、消息发送、文件写入、缓存更新等操作1、这些操作自身是无法回滚的这就会导致数据的不一致。可能RPC调用成功了但是本地事务回滚了可是PRC调用无法回滚了。2、在事务中有远程调用就会拉长整个事务。那么久会导致本事务的数据库连接一直被占用那么如果类似操作过多就会导致数据库连接池耗尽或者单个链接超时我曾经就见过一个方法经过多人之手后从而因为大事务导致数据库连接被强行销毁的悲剧所以「我们可以有选择性的去使用编程性事务去处理」我们的业务逻辑让接手的同学可以明确看到什么时候开启了事务什么时候提交了事务也尽可能将我们的事务粒度的范围缩小下游接口 hold 住么分享此条优化之前先大致介绍一下我们的业务背景保费代扣的跑批任务中我们是会借助流程编排这个框架去异步发起我们的代扣你可以理解为一笔代扣申请就是一个异步线程代扣的数据全部在流程编排中进行传递在我们进行优化完毕的时候准备在UAT环境进行优化测试的时候发现仅20w条保费数据处理时间就非常的不尽入人意监控系统环境发现系统频频在进行 GC我的第一反应不会是发生内存泄露了吧在准备 dump 文件的时候我意外的发现大部分申请都是卡在了对外扣费的这个节点经过日志观察发现下游接口给的响应时间过久甚至部分出现了超时情况那么这个GC就合理了由于我们的代扣申请生成的速度非常快并且是异步的线程调度线程还未死亡一直在尝试对外请求扣费就导致所有的数据都堆在内存里就导致了频繁GC在和下游接口方进行核实之后的确针对于该接口没有进行限流处理太坑了优化的思路也很简单了在业务可接受的情况我们采取的是去发送 mq 请求后就挂起流程编排该线程会死亡然后让消费者进行处理调用成功后唤醒流程进行后续处理即可当然使用固定的线程池直接调外也是可以的目的都是防止过多的线程处于 RUNNING从而导致内存一直的堆积还有一种对外调用的万金油处理方式就是在业务可接受的情况下采取一种 fast success 方式举个例子在进行保费扣费的时候我们调用支付公司的接口之前直接将我们的扣费状态更改为扣费中然后直接挂起我们的业务然后用定时任务去查证我们的扣费结果收到扣费结果后在继续我们扣费后的操作机器利用方面给我打满针对于生产上面的机器我们通常不会是单机部署那么如何可以尽可能去压榨我们服务器的资源呢那就是利用xxl-job的「分片广播」和「动态分片」功能执行器集群部署时任务路由策略选择”分片广播”情况下一次任务调度将会广播触发对应集群中所有执行器执行一次任务同时系统自动传递分片参数可根据分片参数开发分片任务“分片广播” 以执行器为维度进行分片支持动态扩容执行器集群从而动态增加分片数量协同进行业务处理在进行大数据量业务操作时可显著提升任务处理能力和速度。“分片广播” 和普通任务开发流程一致不同之处在于可以获取分片参数获取分片参数进行分片业务处理。// 可参考Sample示例执行器中的示例任务ShardingJobHandler了解试用 int shardIndex XxlJobHelper.getShardIndex(); int shardTotal XxlJobHelper.getShardTotal();具体举个例子比如我们做分户日结的时候可以根据商户的编号对机器进行取模处理然后每台机器只执行某些特定商户的数据那么这边留一个问题给大家如果发生数据倾斜你会如何处理即某个商户的数据量特别大 导致这台机器执行的任务非常的重要是你你会如何处理这种场景总结今天针对于大数据量的跑批在项目中实践思考就到此结束了。文章介绍了我们常见跑批任务中可能出现的风险和比较常用通用的一些优化思路进行了分享关于线程池和缓存的运用我未在文章中提及这两点也对我们的高效跑批具有极大的帮助小伙伴们可以加以利用当然文章只是引起大家针对于跑批任务的思考更多的优化还需结合任务具体情况和项目本身环境进行处理AI大模型学习福利作为一名热心肠的互联网老兵我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。一、全套AGI大模型学习路线AI大模型时代的学习之旅从基础到前沿掌握人工智能的核心技能因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获取二、640套AI大模型报告合集这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示。因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获三、AI大模型经典PDF籍随着人工智能技术的飞速发展AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型如GPT-3、BERT、XLNet等以其强大的语言理解和生成能力正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获四、AI大模型商业化落地方案因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获作为普通人入局大模型时代需要持续学习和实践不断提高自己的技能和认知水平同时也需要有责任感和伦理意识为人工智能的健康发展贡献力量
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

设计网站公司名称ui软件

死锁检测技术实现:等待图与定时遍历方案 死锁是数据库和并发系统中常见的问题,多个事务互相持有对方所需的资源,导致系统陷入停滞。通过构建等待图并配合定时检测机制,可以高效识别死锁并触发事务回滚,保障系统可用性…

张小明 2026/1/8 6:40:25 网站建设

网站设计中级网络公司怎么挣钱的

金融行业也能用AI做视频?Wan2.2-T2V-A14B助力年报可视化 在每年财报季,金融机构的投资者关系部门总是忙得脚不沾地——PPT改了又改,动画调了再调,就为了把那一串串枯燥的数字讲出“故事感”。但你有没有想过,有一天这些…

张小明 2026/1/8 6:50:54 网站建设

做视频网站需要域名查询入口

Tabula完整指南:从PDF轻松提取表格数据的高效解决方案 【免费下载链接】tabula Tabula is a tool for liberating data tables trapped inside PDF files 项目地址: https://gitcode.com/gh_mirrors/ta/tabula Tabula是一款专业的开源工具,专门用…

张小明 2026/1/8 8:10:34 网站建设

大连做网站孙晓龙结构设计网站

微PE系统环境下测试ACE-Step最小运行环境:极限场景验证 在一台老旧笔记本上插入U盘,30秒后命令行跳出一行提示:“模型加载完成,准备生成音乐。”没有操作系统、没有图形界面、甚至没有联网——这台机器运行的既不是Windows也不是L…

张小明 2026/1/8 8:21:43 网站建设

网站制作公司dedecms开发app和做网站

0.9B参数重构多语言文档解析:PaddleOCR-VL开启轻量化VLM普惠时代 【免费下载链接】PaddleOCR-VL PaddleOCR-VL 是一款顶尖且资源高效的文档解析专用模型。其核心组件为 PaddleOCR-VL-0.9B,这是一款精简却功能强大的视觉语言模型(VLM&#xff…

张小明 2026/1/8 8:36:25 网站建设

网站开发查找漏洞的工具三明网站设计

SVNAdmin2高效管理指南:Web图形化SVN权限控制系统 【免费下载链接】SvnAdminV2.0 基于web的SVN管理系统,支持HTTP协议、SVN协议、支持LDAP认证、Docker部署 项目地址: https://gitcode.com/gh_mirrors/sv/SvnAdminV2.0 SVNAdmin2是一款基于Web的S…

张小明 2026/1/8 8:52:25 网站建设