go工程实践与分布式定时任务学习笔记

175 阅读3分钟

一、分布式定时任务调度

定时任务实现

三大功能:触发、调度和执行。
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形式访问。