HDBS之应用代码优化

1、目录结构树

  • 整体概述
  • 代码检测工具sonar
  • HDBS代码优化
  • 总结开发注意点

2、整体概述

  进入如今这家公司个人第一个任务就是对HDBS进行代码质量优化。HDBS可能你们不是很了解,如今给你们简单介绍下:HDBS是HadoopBaseService的简称,Hadoop有了解过大数据的朋友相信并不陌生,BaseService天然也就是基础服务的意思;因此HDBS这个服务主要是基础服务的配置,同时Hadoop则表示数据量的大。如下是我暂时了解的应用架构图方便各位理解,毕竟才来这个公司一个星期可能画的不是很完整不过整体就是这么回事:java

2、代码检测工具  

  • 前提描述

  这篇文章侧重讲HDBS代码存在的质量问题,至于怎么用、怎么搭建sonar代码异常检测平台后续再讲。git

  • SonarQube简介

  SonarQube系统是一个代码质量检测工具,主要用于检测代码的编写质量,好比:覆盖率、是否包含空指针异常、异常是否正确处理、map的遍历优化、是否包含无用代码块占据cpu资源等。 由如下四个组件组成(https://docs.sonarqube.org/display/SONAR/Architecture+and+Integration)程序员

  1.    一个sonarqube服务器 包含三个子进程(web服务(界面管理),搜索服务 计算引擎服务(写入数据库))
  2.  一个sonarqube数据库 配置sonarqube服务
  3.   多个sonarqube插件 位于解压目录 extensions\plugins目录
  4. 一个或者多个sonarqube scanners 用于分析特定的项目

  • 使用SonarQube(简称SQ)工做流程

   开发者使用开发工具(eclipse,ide)上传代码到SCM(源代码管理器)    系统自动同步代码到某个位置 sonarqube scanners 扫描该代码检查质量 将分析结果 将分析结果推送到SQServer 存储在SQ数据库 用户可使用eclipse插件sonarlint来同步sonarqube服务器配置(java和js版本等)能够实时在线分析。web

 

 3、HDBS代码优化

  • 代码优化的重要性

  经过sonar代码检测平台针对性地解决代码中相关问题。在大项目中代码质量尤其重要,虽然这些代码问题并非错误,在正常的数据状况下是不会发生问题的,可是也有不少状况是数据不正常的时候;一个小小的bug可能致使成千上万的订单做废,性能的优化也很重要由于性能的优化可使得QPS显著上升,代码问题最为严重的就可能致使整个实例挂掉(JVM异常退出)。因此代码质量的提高是重中之重。数据库

  • 如何优化

  因为HDBS是经由不一样的开发人员之手整体代码质量参差不其,虽然公司有一套开发手册可是执行起来彷佛比较难;可是事实告诉咱们:开发中要尽量第按照公司开发手册,若是没有就要按照通用的开发规范进行开发,好比遵循阿里的开发规范,毕竟大公司走过的路躺过的坑仍是比较多的咱们要学会站在巨人的肩膀上往上爬。做为程序员开发效率实际上是第一位,在实际开发中咱们要学会使用工具来取得开发的最大效率,好比:这里咱们采用sonar来管理代码质量问题、能够用SourceTree来管理git代码等;合理使用对应的工具能够达到开发效率的最大化,毕竟公司要的是一个可以有产出的人,若是你一天可以解决的问题而别人须要两天那么你就能获得上司的赏识。数组

4、总结开发注意点

  • HDBS代码中发现的问题(部分)
  1. 异常没有正确处理。好比:直接在代码中使用e.printStackTrace代码打印异常;这是有一个问题就是:这些代码在本地启动遇到异常后是能够正常打印异常信息,可是当应用部署到Linux服务器的时候却可能不会打印,这若是在线上生产环境发生问题须要盘查的时候就尴尬了,由于你可能根本找不到异常的信息也就是说系统压根就没有记录任何异常信息。
    解决方法:LOGGER.error("xx异常:{}",e)
  2. 可能发生NullPointerException。好比:前面的代码定义了 Map<Object,Object> map=null; 但后面在没有判断obj是否为null的状况下进行map.size()的操做;这也是咱们须要注意的地方,这种代码逻辑通常咱们是不会进行异常处理的,异常处理要遵循:可以不须要异常处理就不要用异常处理不能把异常处理当作工具来使用。这种状况下若是没判断为null就进行操做就会发生运行时异常当前线程就会意外终止。
    解决方法:先判断是否为null
  3. Map的遍历方式优化。在开发中我见过不少人是这样遍历Map的:先获得keySet()视图,而后遍历keys,经过get(key)的方式来获取对应的value。这种遍历性能实际上是不好的,由于咱们在遍历keys的时候须要花费必定的时间,在get(key)的时候又会花费必定的时间;咱们都知道Map的get()是要计算hashCode而后经过hashCode计算数组的下标,若是有hash冲突又会遍历链表,这种遍历方式显然是低效的,cpu资源是宝贵的这种方式会严重占用cpu而且时间花费的要长得多。
    解决方法:经过entrySet()获取key、value视图,一次遍历就能够获取对应的value,而不须要经过get();不过你也能够用迭代遍历,这都是能够的。
  4. 日志打印不规范。好比:LOGGER.info(“请求参数:”+params.toString); 日志是盘查问题的关键信息,因此在一个系统中无处不在,一个线程可能产生的log数量就是成百上千行,若是每条日志都这么打印的话会严重影响整个应用的性能。由于字符串拼接的性能是不好的,相信咱们都对String不陌生,像这种String c=a+b的方式性能有多好本身也清楚。
    解决方法:LOGGER.info(“请求参数:{}”,params.toString)
  5. 没有考虑线程安全问题。如:在多线程系统应用HashMap;线程安全的概念简单来说就是:同一个代码块在单线程和多线程的执行状况下的结果是同样的,不然线程非安全。若是在多线程系统应用了HashMap可能致使多个线程之间数据混淆或者是严重占用系统资源,占用系统资源即为发生了循环链表的问题,具体为何产生循环链表这里就很少加阐述了;同时String、StringBuffer、StringBuilder也相似。
    解决方法:用HashTable或者ConCurrentHashMap替换HashMap
  6. 无效代码。好比:Date date=new Date(),在判断date是不是空的时候用if( date!=null && !"".equal(date));咱们都知道date是Date类型永远也不多是String类型,可是在写代码的时候咱们却又一个习惯喜欢加上"".equal(date)来判断,固然这么写是不会有错的,虽然Date不是Strng可是因为 is-a的原则他们的父类都是Object,而equal是Object的方法因此那样判断天然也没有错。这里讲的不仅仅是Date这个类型,若是是非String类型都这样;还有就是当咱们使用List<String> list=new ArrayList<>的方式的时候,后续用list这个对象的时候不须要判断是否为null,由于new出来的对象在没有被JVM回收以前引用的对象永远是非null。
    解决方法:去除无效代码
  7. 合理使用同步锁。好比:全局定义了一个private static final DateFormat df=new SimpleDateFormat(“yyyy-MM-dd HH:MM:ss”)变量; 在该类中使用到df对象的时候都应用了同步锁;若是在线程并大量大的时候同步锁会严重占用系统资源的开销,由于得到锁与释放锁的过程都是须要占用资源的同时也会带来并发量的降低,因此在能不用同步锁解决问题的时候尽量不使用锁,万不得已的时候就可使用。
    解决方法:去除同步锁,在方法中定义局部变量:DateFormat df=new SimpleDateFormat(“yyyy-MM-dd HH:MM:ss”)
相关文章
相关标签/搜索