当前位置: 首页 > news >正文

招聘网站是做什麼的怎么建设个人网站教程

招聘网站是做什麼的,怎么建设个人网站教程,帮忙注册公司多少钱,相册在线设计平台前言接口性能问题#xff0c;对于从事后端开发的同学来说#xff0c;是一个绕不开的话题。想要优化一个接口的性能#xff0c;需要从多个方面着手。本文将接着接口性能优化这个话题#xff0c;从实战的角度出发#xff0c;聊聊我是如何优化一个慢查询接口的。上周我优化了… 前言接口性能问题对于从事后端开发的同学来说是一个绕不开的话题。想要优化一个接口的性能需要从多个方面着手。本文将接着接口性能优化这个话题从实战的角度出发聊聊我是如何优化一个慢查询接口的。上周我优化了一下线上的批量评分查询接口将接口性能从最初的20s优化到目前的500ms以内。总体来说用三招就搞定了。到底经历了什么1. 案发现场我们每天早上上班前都会收到一封线上慢查询接口汇总邮件邮件中会展示接口地址、调用次数、最大耗时、平均耗时和traceId等信息。我看到其中有一个批量评分查询接口最大耗时达到了20s平均耗时也有2s。用skywalking查看该接口的调用信息发现绝大数情况下该接口响应还是比较快的大部分情况都是500ms左右就能返回但也有少部分超过了20s的请求。这个现象就非常奇怪了。莫非跟数据有关比如要查某一个组织的数据是非常快的。但如果要查平台即组织的根节点这种情况下需要查询的数据量非常大接口响应就可能会非常慢。但事实证明不是这个原因。很快有个同事给出了答案。他们在结算单列表页面中批量请求了这个接口但他传参的数据量非常大。怎么回事呢当初说的需求是这个接口给分页的列表页面调用每页大小有10、20、30、50、100用户可以选择。换句话说调用批量评价查询接口一次性最多可以查询100条记录。但实际情况是结算单列表页面还包含了很多订单。基本上每一个结算单都有多个订单。调用批量评价查询接口时需要把结算单和订单的数据合并到一起。这样导致的结果是调用批量评价查询接口时一次性传入的参数非常多入参list中包含几百、甚至几千条数据都有可能。2. 现状如果一次性传入几百或者几千个id批量查询数据还好可以走主键索引查询效率也不至于太差。但那个批量评分查询接口逻辑不简单。伪代码如下public ListScoreEntity query(ListSearchEntity list) {//结果ListScoreEntity result  Lists.newArrayList();//获取组织idListLong orgIds  list.stream().map(SearchEntity::getOrgId).collect(Collectors.toList());//通过regin调用远程接口获取组织信息ListOrgEntity orgList  feginClient.getOrgByIds(orgIds);for(SearchEntity entity : list) {//通过组织id找组织codeString orgCode  findOrgCode(orgList, entity.getOrgId());//通过组合条件查询评价ScoreSearchEntity scoreSearchEntity  new ScoreSearchEntity();scoreSearchEntity.setOrgCode(orgCode);scoreSearchEntity.setCategoryId(entity.getCategoryId());scoreSearchEntity.setBusinessId(entity.getBusinessId());scoreSearchEntity.setBusinessType(entity.getBusinessType());ListScoreEntity resultList  scoreMapper.queryScore(scoreSearchEntity);if(CollectionUtils.isNotEmpty(resultList)) {ScoreEntity scoreEntity  resultList.get(0);result.add(scoreEntity);}}return result; }其实在真实场景中代码比这个复杂很多这里为了给大家演示简化了一下。最关键的地方有两点在接口中远程调用了另外一个接口需要在for循环中查询数据其中的第1点即在接口中远程调用了另外一个接口这个代码是必须的。因为如果在评价表中冗余一个组织code字段万一哪天组织表中的组织code有修改不得不通过某种机制通知我们同步修改评价表的组织code不然就会出现数据不一致的问题。很显然如果要这样调整的话业务流程上要改了代码改动有点大。所以还是先保持在接口中远程调用吧。这样看来可以优化的地方只能在for循环中查询数据。3. 第一次优化由于需要在for循环中每条记录都要根据不同的条件查询出想要的数据。由于业务系统调用这个接口时没有传id不好在where条件中用id in (...)这方式批量查询数据。其实有一种办法不用循环查询一条sql就能搞定需求使用or关键字拼接例如(org_code001 and category_id123 and business_id111 and business_type1) or (org_code002 and category_id123 and business_id112 and business_type2) or (org_code003 and category_id124 and business_id117 and business_type1)...这种方式会导致sql语句会非常长性能也会很差。其实还有一种写法where (a,b) in ((1,2),(1,3)...)不过这种sql如果一次性查询的数据量太多的话性能也不太好。居然没法改成批量查询就只能优化单条查询sql的执行效率了。首先从索引入手因为改造成本最低。第一次优化是优化索引。评价表之前建立一个business_id字段的普通索引但是从目前来看效率不太理想。由于我果断加了联合索引alter table user_score add index  un_org_category_business (org_code,category_id,business_id,business_type) USING BTREE;该联合索引由org_code、category_id、business_id和business_type四个字段组成。经过这次优化效果立竿见影。批量评价查询接口最大耗时从最初的20s缩短到了5s左右。4. 第二次优化由于需要在for循环中每条记录都要根据不同的条件查询出想要的数据。只在一个线程中查询数据显然太慢。那么为何不能改成多线程调用第二次优化查询数据库由单线程改成多线程。但由于该接口是要将查询出的所有数据都返回回去的所以要获取查询结果。使用多线程调用并且要获取返回值这种场景使用java8中的CompleteFuture非常合适。代码调整为CompletableFuture[] futureArray  dataList.stream().map(data - CompletableFuture.supplyAsync(() - query(data), asyncExecutor).whenComplete((result, th) - {})).toArray(CompletableFuture[]::new); CompletableFuture.allOf(futureArray).join();CompleteFuture的本质是创建线程执行为了避免产生太多的线程所以使用线程池是非常有必要的。优先推荐使用ThreadPoolExecutor类我们自定义线程池。具体代码如下ExecutorService threadPool  new ThreadPoolExecutor(8, //corePoolSize线程池中核心线程数10, //maximumPoolSize 线程池中最大线程数60, //线程池中线程的最大空闲时间超过这个时间空闲线程将被回收TimeUnit.SECONDS,//时间单位new ArrayBlockingQueue(500), //队列new ThreadPoolExecutor.CallerRunsPolicy()); //拒绝策略也可以使用ThreadPoolTaskExecutor类创建线程池Configuration public class ThreadPoolConfig {/*** 核心线程数量默认1*/private int corePoolSize  8;/*** 最大线程数量默认Integer.MAX_VALUE;*/private int maxPoolSize  10;/*** 空闲线程存活时间*/private int keepAliveSeconds  60;/*** 线程阻塞队列容量,默认Integer.MAX_VALUE*/private int queueCapacity  1;/*** 是否允许核心线程超时*/private boolean allowCoreThreadTimeOut  false;Bean(asyncExecutor)public Executor asyncExecutor() {ThreadPoolTaskExecutor executor  new ThreadPoolTaskExecutor();executor.setCorePoolSize(corePoolSize);executor.setMaxPoolSize(maxPoolSize);executor.setQueueCapacity(queueCapacity);executor.setKeepAliveSeconds(keepAliveSeconds);executor.setAllowCoreThreadTimeOut(allowCoreThreadTimeOut);// 设置拒绝策略直接在execute方法的调用线程中运行被拒绝的任务executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());// 执行初始化executor.initialize();return executor;} }经过这次优化接口性能也提升了5倍。从5s左右缩短到1s左右。但整体效果还不太理想。5. 第三次优化经过前面的两次优化批量查询评价接口性能有一些提升但耗时还是大于1s。出现这个问题的根本原因是一次性查询的数据太多。那么我们为什么不限制一下每次查询的记录条数呢第三次优化限制一次性查询的记录条数。其实之前也做了限制不过最大是2000条记录从目前看效果不好。限制该接口一次只能查200条记录如果超过200条则会报错提示。如果直接对该接口做限制则可能会导致业务系统出现异常。为了避免这种情况的发生必须跟业务系统团队一起讨论一下优化方案。主要有下面两个方案5.1 前端做分页在结算单列表页中每个结算单默认只展示1个订单多余的分页查询。这样的话如果按照每页最大100条记录计算的话结算单和订单最多一次只能查询200条记录。这就需要业务系统的前端做分页功能同时后端接口要调整支持分页查询。但目前现状是前端没有多余开发资源。由于人手不足的原因这套方案目前只能暂时搁置。5.2 分批调用接口业务系统后端之前是一次性调用评价查询接口现在改成分批调用。比如之前查询500条记录业务系统只调用一次查询接口。现在改成业务系统每次只查100条记录分5批调用总共也是查询500条记录。这样不是变慢了吗答如果那5批调用评价查询接口的操作是在for循环中单线程顺序的整体耗时当然可能会变慢。但业务系统也可以改成多线程调用只需最终汇总结果即可。此时有人可能会问题在评价查询接口的服务器多线程调用跟在其他业务系统中多线程调用不是一回事还不如把批量评价查询接口的服务器中线程池的最大线程数调大一点显然你忽略了一件事线上应用一般不会被部署成单点。绝大多数情况下为了避免因为服务器挂了造成单点故障基本会部署至少2个节点。这样即使一个节点挂了整个应用也能正常访问。当然也可能会出现这种情况假如挂了一个节点另外一个节点可能因为访问的流量太大了扛不住压力也可能因此挂掉。换句话说通过业务系统中的多线程调用接口可以将访问接口的流量负载均衡到不同的节点上。他们也用8个线程将数据分批每批100条记录最后将结果汇总。经过这次优化接口性能再次提升了1倍。从1s左右缩短到小于500ms。温馨提醒一下无论是在批量查询评价接口查询数据库还是在业务系统中调用批量查询评价接口使用多线程调用都只是一个临时方案并不完美。这样做的原因主要是为了先快速解决问题因为这种方案改动是最小的。要从根本上解决问题需要重新设计这一套功能需要修改表结构甚至可能需要修改业务流程。但由于牵涉到多条业务线多个业务系统只能排期慢慢做了。往期推荐面试突击63distinct 和 group by有什么区别阿里出品SpringBoot自动化部署神器面试突击55delete、drop、truncate有什么区别
http://www.yutouwan.com/news/307091/

相关文章:

  • 怎么建个人公司网站怎么把网站推广
  • 栾城区住房建设局官方网站公众号平台网页版
  • 贵州三线建设博物馆网站网站建设教材
  • 在线做静态头像的网站注册一个公司需要哪些资料
  • 做虚拟主机网站十大ppt模板免费下载网站
  • 微网站免费制作公司培训课程有哪些
  • 数据中心网站模板买源码做网站
  • 网站怎么做第三方登录上海徽与章网站建设宗旨
  • 如何给自己公司做一个网站天堂 最新版中文在线
  • 如何建设网站pdf下载如何用front做网站网页
  • 网站建设学习哪家专业跨国网站浏览器
  • 芜湖网站开发茂名网站优化
  • 网站前台的功能模块做别人一样的网站模板
  • 北京公司公示在哪个网站深圳市建设工程造价管理站官网
  • 同时在线上万人的网站需要什么配置云服务器软件开发模型有哪些
  • 给公司做网站 图片倾权北京怀柔网站制作
  • 镇江网站建设一般多少钱未来做哪个网站能致富
  • 网站建设优惠券免费网站源码博客
  • 微商手机网站制作公司哪家好龙湖地产 网站建设
  • 怎么做签到网站成都建站哪家好
  • 网站如何推广引流店铺名称设计logo设计
  • wordpress模板云端青岛自动seo
  • 无锡专业网站推广wordpress设置收费下载
  • 网站首页效果图怎么设计网站备案期间 搜索引擎
  • 灰系网站榆林网站建设vs0912
  • 网站设计尺寸大小公司网站建设岗位
  • 一级域名和二级域名做两个网站自己怎么做视频网站
  • 媒体网站开发小型网站开发用什么语言
  • 兰州优化网站推广南磨房网站建设公司
  • 学习php做毕设网站方向wordpress无法创建文件