Contents
  1. 1. 项目业务介绍
  2. 2. 项目技术分析
  3. 3. 我做的工作(
    1. 3.1. 架构升级–集群(解决一台机子上性能负载过高的问题)

项目业务介绍

  1. 持续开发的项目
  2. 通用电气下面的通用医疗器械的在线视频培训和推广网站。百度搜e学e用。
  3. 用户是:购买了医疗器械的医生和相关操作人员,也可以免费注册
  4. 功能: 视频直播培训、文档资料分享、论坛、网站其他推广

项目技术分析

  • 支持PC、手机端、微信公众号等形式
  • 网站系统(做了个集群)和内容管理系统两个独立的分布式的系统
  • 部署在电信云上,4台centos的系统里面:开发环境、测试环境
  • 网站程序相关的框架
    后端: Spring、MVC、Mybatis、JPA、nginx、zookeeper、solr_cloud 、redis、activemq、loombok
    前端: jsp、js 、Jquery 、 SpringBoot、siteMash

我做的工作(

  1. 架构调整:网站程序集群、jvm优化(垃圾回收器CMS、和PermSize调优)、插件引入(mybatis的xml文件定时热加载)、MVC扫描方式的优化等等、war包的瘦身
  2. 日常开发:新的模块(PCB模块)、新功能(展视直播)
  3. 服务器维护:性能监控、数据库定是备份、运营数据邮件的发送、上线、服务器迁移过程中的重新部署
  4. 需求分析

架构升级–集群(解决一台机子上性能负载过高的问题)

  1. 登录引入redis做session共享
  2. nginx配置更改
  3. quarz定时任务通过数据库级别分布式锁,来实现不重复消费的问题
  • 创建定时任务锁表(lock_corn : id、lock_name、status),不同的业务争夺不同的行锁,互相不影响。
  • 业务逻辑:tryLock() doBusiness() uplock() 在一个事务里面,避免了业务异常导致的加锁成功但解锁失败的情况。
  • 设置的doJob()的隔离性为允许提交读,因为默认mysql的mvcc事务处理机制,事务id自增的特性,避免了重复读取重复消费的问题。
    @Transactional(isolation=Isolation.READ_COMMITTED)
    doJob(String lockName){
    tryLock(lockName);
    sleep(500);//等待事务完全提交到mysql上
    doBusiness();
    uplock(lockName) ;
    }
    tryLock(String lockName) 阻塞等待锁,可以复用的,不需要返回值: update set Status=“LOCKED” where lockName="wx_push"
    doBusiness(): checkTask(), excuteTask();
    unlock(String lockName): update set Status=“OPEN” where lockName="wx_push"
Contents
  1. 1. 项目业务介绍
  2. 2. 项目技术分析
  3. 3. 我做的工作(
    1. 3.1. 架构升级–集群(解决一台机子上性能负载过高的问题)