面试题-项目和工作
项目业务介绍
- 持续开发的项目
- 通用电气下面的通用医疗器械的在线视频培训和推广网站。百度搜e学e用。
- 用户是:购买了医疗器械的医生和相关操作人员,也可以免费注册
- 功能: 视频直播培训、文档资料分享、论坛、网站其他推广
项目技术分析
- 支持PC、手机端、微信公众号等形式
- 网站系统(做了个集群)和内容管理系统两个独立的分布式的系统
- 部署在电信云上,4台centos的系统里面:开发环境、测试环境
- 网站程序相关的框架
后端: Spring、MVC、Mybatis、JPA、nginx、zookeeper、solr_cloud 、redis、activemq、loombok
前端: jsp、js 、Jquery 、 SpringBoot、siteMash
我做的工作(
- 架构调整:网站程序集群、jvm优化(垃圾回收器CMS、和PermSize调优)、插件引入(mybatis的xml文件定时热加载)、MVC扫描方式的优化等等、war包的瘦身
- 日常开发:新的模块(PCB模块)、新功能(展视直播)
- 服务器维护:性能监控、数据库定是备份、运营数据邮件的发送、上线、服务器迁移过程中的重新部署
- 需求分析
架构升级–集群(解决一台机子上性能负载过高的问题)
- 登录引入redis做session共享
- nginx配置更改
- 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"