一、分布式定时任务调度
定时任务实现
三大功能:触发、调度和执行。
trigger:根据触发规则,触发。
调度器scheduler:对任务进行协调。
执行器executor:对任务执行。
1、任务创建
(回调用相应的代码、任务的基础信息和触发规则),然后通过admin控制台存储在任务DB 中。
2、触发器
时间轮转方案 定时扫描+延时消息,时效性较好,但是可控性较差。
3、调度
资源调度中的节点选择:随机选择节点,广播通知所有节点和任务分片三种方法。
其中任务分片,分而治之,通过将单击任务分片到不同的执行器上,提高资源的利用率。
故障转移机制
当调度器选择了一个执行器去执行,该执行器挂了,会返回给调度器重新分配执行器。
原理:[基于一致性hash策略分发任务]((一致性hash算法)。
4、执行器
- 注册
- 调度
- 回调
- 心跳检测
二、go工程项目实战
高并发相关
1、什么协程
协程,英文Coroutines,是一种比线程更加轻量级的存在。 协程不是进程,也不是线程,它就是一个可以在某个地方挂起的特殊函数,并且可以重新在挂起处继续运行。所以说,协程与进程、线程相比,不是一个维度的概念。
2、创建协程
创建一个协程 go func(..){..} 协程之间通信,使用channel共享通道来进行数据交换。
make(chan `元素类型`int ,`缓冲区数量`2)
工程的实现
1、依赖管理
用各种封装好的包
进化阶段 gopath->go vendor->go module gopath
go get直接依赖src下的代码,使用go get下载最新版本包在scr下,弊端:无法实现多版本控制go vendor多一个vender引入一份依赖副本,解决冲突依赖,弊端:无法控制依赖版本go module通过go.mod管理依赖包版本,使用指令go get/go mod。用的最多go mod tidy下载需要的依赖、删除不需要的依赖。
2、测试
单元测试
单元测试中,以_test.go为后缀名的源文件在执行go build时不会被构建成包的一部分,它们是go test测试的一部分。 通过go test xx_test.go xx.go --cover 来进行覆盖测试
mock测试
monkey打包工具 github.com/bouk/monkey
monkey.Patch(ReadFirstLine,func() string{
retuen xxx
})
对ReadFirstLine打桩测试,后面要加上
defermonkey.Unpathch(ReadFirstLine)
来将拆除桩。
- 不依赖与本地文件,在任何时候都能测试。
基准测试
分析系统性能 测试开头是
function Benchamark......(){
} func BenchmarkSelect(b \*testing.B) {
b.ResetTimer() //计数器重置
测试调用的函数
3、分层
项目实战中 整体分为三层,repository数据层,service逻辑层,controoler视图层。
数据层关联底层数据模型,也就是这里的model,封装外部数据的增删改查,我们的数据存储在本地文件。对service层透明,屏蔽下游数据差异,也就是不管下游是文件,还是数据库,还是微服务等,对service层的接口模型是不变的。
Servcie逻辑层处理核心业务逻辑,计算打包业务实体entiy,对应我们的需求,例如话题页面,包括话题和回帖列表,并上送给视图层;
Controller视图层负责处理和外部的交互逻辑,以view视图的形式返回给客户端,对于我们需求,我们封装json格式化的请求结果,api形式访问。