热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何优化批量处理接口

本篇内容主要讲解“如何优化批量处理接口”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何优

本篇内容主要讲解“如何优化批量处理接口”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何优化批量处理接口”吧!

背景

同批量导入一样,在我们的系统中,存在着大量的批量处理的接口,比如批量获取运单,批量出库,批量打印,等等,像这样的接口大概有10几个。

这些请求往往具有以下几个特点:

  1. 单条数据处理耗时较长,一般来说都在200ms及以上

  2. 数据批量较大,像我们系统最大一页是1000条数据,用户可选择的最大批量也就是1000

  3. 总体耗时较长,比如按200ms和1000条数据算,总共就需要耗时200s,这个时间太长了

  4. 这些单条的数据无法合并在一起进行处理

所以,我们有必要对批量处理的接口进行统一的性能优化。

但是,要如何进行优化呢?

如何优化

我们知道单台机器的性能是有上限的,像这种批量请求,一方面会占用大量的内存,同时也会占用很高的CPU,全部放在同一个进程里面处理势必导致整体处理时间更进一步上升,所以,针对这种批量的请求,最好的办法就是分而治之。

什么是分而治之呢?

分而治之,在很多场景中都有用到,比如上一篇我们说的批量导入,它一般分成四个部分:

  1. 接收请求

  2. 分发请求

  3. 处理请求

  4. 汇总请求

如何优化批量处理接口

那么,在我们这个批量处理的过程中如何应用分而治之的思想呢?

首先,我们要把大批量请求改成一个一个的小请求,这里的“改”是指我们后端来改,而不是前端调用来修改,前端还是调用大批量的请求。

然后,通过某种机制把这些小请求分发到多台机器上进行处理,比如,使用Kafka来做分发器。

最后,再统计每个小请求的完成情况,当所有的小请求都完成了之后,就通知前端整个请求已完成。

这里的通知可以走消息模块,同时,上面的完成小请求的改造后就可以返回前端了,等到这里全部完成再异步通知。

好了,我们直接来看我的架构设计图:

如何优化批量处理接口

整体来说,还是蛮复杂的,让我们每个步骤来过一遍:

  1. 接收请求,前端请求后端的大批量接口

  2. 记录本次批量处理请求的信息,比如分配请求号、哪个用户、哪个操作、总共多少条、成功0条、失败0条,等等

  3. 批量更新数据库中这些数据的状态为xxx处理中,并记录原来的状态,这里使用mysql的批量更新,速度很快

  4. 把大批量的数据一条一条的发到Kafka中,Kafka承担了分发器的作用

  5. 给前端返回响应,说明本次请求收到了,并且在处理中了,这样界面上查询的结果就是这些单据正在xxx处理中

  6. 多个服务实例从Kafka拉取消息来消费

  7. 针对每一条数据进行处理,比如检查权限、参数,处理复杂的业务逻辑,等等,并写入mysql处理的结果

  8. 记录每一条数据的处理结果到redis中,比如成功条数+1,失败条数+1,等等

  9. 当检测到所有数据都处理完了,即总共条数=成功条数+失败条数,就发个消息到消息服务

  10. 消息服务发送一个新的通知给前端:您刚才进行的XXX操作已完成,成功X条,失败X条

  11. 前端收到这个通知后,检查如果还在这个界面,就自动刷新下页面,等等,可以做一些很友好的交互

这就是整体批量请求的处理过程,怎么样,还可以接受不?

另外,因为我们系统中的批量处理接口实在是太多了,如果每个接口都这样实现一遍,有很多重复的代码。

所以,我们可以做一个通用的批量接口,通过配置元数据的形式实现,元数据的格式为:{action: xx操作,targetStatus: xx处理中},这样除了中间的处理消息的过程无法复用外,其他的部分都是可以复用的。

好了,接着我们再来回顾下这种骚操作可以运用到哪些场景呢?

运用场景

  1. 单条数据处理耗时较长,如果单条数据处理耗时非常短则没必要

  2. 数据批量较大,如果一次批量不大则没必要

  3. 总体耗时较长,上面两个因素的叠加,如果总体耗时不长则没必要

  4. 无法进行批量更新数据库的场景,如果可以批量更新数据库则没必要

最后,我们再看看还有哪些改进措施呢?

改进措施

我认为主要有以下两种改进措施:

  1. 不一定每次请求都是大批量,比如说,如果一次请求的数据量小于10条,是不是本机直接处理更快呢?

  2. 不是每个批量场景都需要优化,见上面运用场景分析的没必要场景

到此,相信大家对“如何优化批量处理接口”有了更深的了解,不妨来实际操作一番吧!这里是编程笔记网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


推荐阅读
  • 旁路|发生_Day749.旁路缓存:Redis是如何工作的Redis 核心技术与实战
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Day749.旁路缓存:Redis是如何工作的-Redis核心技术与实战相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 软件测试工程师,需要达到什么水平才能顺利拿到 20k+ 无压力?
    前言最近看到很多应届生晒offer,稍有名气点的公司给出的价格都是一年30多W或者月薪20几k,相比之下工作几年的自己薪资确实很寒酸.根据我自己找工作经历,二线城市一般小公司招聘 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • Java工程师书单(初级,中级,高级)
    简介怎样学习才能从一名Java初级程序员成长为一名合格的架构师,或者说一名合格的架构师应该有怎样的技术知识体系,这是不仅一个刚刚踏入职场的初级程序员也是工作一两年之后开始迷茫的程序 ... [详细]
  • 朱晔的互联网架构实践心得S1E7:三十种架构设计模式(上)【下载本文PDF进行阅读】设计模式是前人通过大量的实践总结出来的一些经验总结和最佳实践。在经过多年的软件开发实践之后,回过头 ... [详细]
author-avatar
再让我沦陷一次丶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有