1.熟练掌握Java多线程技术,具有丰富的多线程开发经验
2.spring springmvc mybatis
3.熟练掌握mysql查询语句,存储过程,sql语句调优
4.熟悉各种redis的业务使用场景
5.实际使用过metaq消息队列进行流量削峰的异步解耦
6.dubbo zookeeper微服务
虚拟主机发布系统(多线程项目)
技术架构:
spring+mybatis+mysql+dubbo+tair+metaq+quartz
项目角色:
后端支持独立负责,从设计文档到开发到测试
项目背景:
项目团队(某大型互联网公司的一个业务线)管理大量的服务器,需要一个全新的发布系统来支持日常的发布任务,老的发布系统是串行的,发布效率满足不了现在的需求,还有老发布系统只支持单通道发布,没有应急通道可供发布切换,且发布功能单一。
老发布系统缺陷总结点如下:
1.发布通道单一,没有应急通道,一旦发布通道不可用,则发布系统瘫痪,无法进行日常的发布任务
2.发布通道底层串行,执行发布任务慢,满足不了项目团队大量服务器的发布需求
3.发布功能简单,只可执行简单的发布任务,没有诸如批次控制(灰度控制),发布暂停,自动暂停,人为暂停,发布回滚,紧急发布,常规发布,发布校验等功能
4.发布环境的隔离,预发环境与生产环境(这个问题比较复杂,感兴趣可以单独介绍一下)
新的发布系统便应运而生,提上了开发日程,后端支持由我一个人独立负责,且新的发布系统要解决老发布系统上面的痛点难点问题
项目介绍:
一套发布任务的流程如下(发布流程):
上传发布包——>发布流程——>发布测试——>预发验证——>正式发布
下面将从进行一个发布流程开始介绍
1.首先将制作好的发布包上传到OSS文件系统中,这一个包里包含两部分,一个是发布代码,一个是回滚代码
2.进入到发布流程页面,该页面会选择发布包,选择发布流程所包含的发布阶段,是否紧急发布(非紧急发布将执行严格校验策略,必须按顺序走完选择的发布阶段,还有一些时间上的校验策略),发布简介。
3.进入到发布测试页面,选择发布通道,指定发布的机器,选择发布时间,描述
4.发布测试验证通过,进入到预发验证页面,选择发布的通道,选择发布的操作系统版本,选择region,选择发布的产品线,产品code,发布的机器数量(会进行一定的算法处理,会尽量平均覆盖到每一个操作系统版本),是否需要暂停,发布开始时间,描述等
5.正式发布和预发创建类似
6.发布页面会有发布暂停按钮,发布回滚按钮,立即结束按钮,校验通过按钮,校验未通过按钮等,发布机器列表,每台机器状态
实现简介
两个项目,两个数据源,发布系统项目需要从另外一个项目中(暂且叫DP)获取发布的服务器信息,然后存入发布系统数据库中
两个通道:887(底层串行),云助手(底层并行)
暂停配置:通过配置的方式来读取每个阶段暂停数
Spring:基础项目框架
Mybatis:数据持久化ORM框架
MySQL:充当数据库
Dubbo:微服务中间件,多项目之间通过dubbo接口互相调用
Tair:消息队列消息去重,存储发布指令,立即暂停,立即开始等
Metaq:消息中间件,存储发布的每一台机器信息,然后推送到消费者进行分发执行,达到异步处理,解耦,流量削峰的作用
发布流程创建
创建发布流程,会根据传入的发布包ID,删除数据库中的对应发布包的以前发布命令,,metaq的生产者将发布包信息写入metaq中,写入时打上tag(tag_insert_instruction),便于消费者根据tag进行消费
对应的一个配置在spring配置文件中的常驻消费者,会去通过订阅普通消息的方式来消费对应tag的数据,可以配置消费的最小线程数,最大线程数,每次消费几条消息
通过tair根据消息id来进行排重,防止重复消费,prefix+消息id作为key,设置预计消费单条消息的过期时间即可
调用云助手接口,创建云助手的发布命令和回滚命令并进行落库。
定时更新云助手发布指令
因为从OSS获取的发布包连接过一段时间便会失效,所以需要开启一个定时任务去维护云助手打入的发布指令,因为发布指令里包含了发布包的连接。具体做法是,隔一段时间去检查发布指令信息,删除老的,再创建新的
发布单的创建
判断流程是否存在,判断是否包含当前阶段,判断是否已经存在该发布单,判断是否按照流程顺序创建,判断上个发布单是否校验通过,判断是创建的预发测试,预发验证还是正式发布,写入数据库,如果暂停,则从配置文件中读取暂停规则,向tair中存入下个阶段暂停数 key为nextStopPrefix+deployId,值为暂停数,设置永不过期,将发布单信息写入mq(为了从DP中搬运数据)
mq消费者利用tair排重,从DP系统中通过dubbo接口分页获取数据,由于数据量巨大(百万级),必须采用分页策略和利用主键索引进行分页的策略。如果不分页将可能一下耗死系统内存,如果不采取主键分页,随着数据量级别的增大,越往后分页越慢