这是我参与「第五届青训营 」笔记创作活动的第10天
分布式定时任务&&Hertz框架学习
抖音春节活动 & 定时任务发展之路
实现原理
三个核心问题:触发、调度、执行
触发器:解析任务,生成触发事件
调度器:分配任务,管理任务生命周期
执行器:获取任务执行单元,执行业务逻辑
除此之外,还有一个控制台(Admin),提供任务管理和干预的功能
数据流
四层结构各自的功能
控制台
一些基本概念的E-R图
任务元数据
基础信息、调度时机、执行行为、执行方式
任务实例
job_id用于和任务元数据对应
任务实例是一个确定的job的一次运行实例
触发器
核心职责:
给定一系列任务,解析他们的触发规则,在规定的时间点触发任务的调度
设计约束比较严格:
触发器方案
定期扫描+延时消息
时间轮
目的:遍历任务列表,从中找出当前时间点需要触发的任务列表
查询复杂度O(n)
修改复杂度O(1)
优化
用时间轮存储任务
Hertz学习
路由注册
Hertz 提供了 GET、POST、PUT、DELETE、ANY 等方法用于注册路由。
示例代码
// "/get"是请求的路径
// 当客户端以GET的方式请求/hello路径时,会执行后面的匿名回调函数
h.GET("/get", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "get")
//返回String类型的数据
})
h.POST("/post", func(ctx context.Context, c *app.RequestContext) {
c.String(consts.StatusOK, "post")
})
路由组
Hertz 提供了路由组( Group )的能力,用于支持路由分组的功能,同时中间件也可以注册到路由组上。
路由类型
Hertz 支持丰富的路由类型用于实现复杂的功能,包括静态路由、参数路由、通配路由。
路由的优先级:静态路由 > 命名路由 > 通配路由
中间件
Hertz中间件的种类是多种多样的,简单分为两大类:
- 服务端中间件
- 客户端中间件
Hertz中间件本质上是HTTP请求响应周期中的一个函数,提供一种方便的机制去检查和过滤HTTP请求
中间件可以在请求更深入地传递到业务逻辑之前或之后执行:
之前执行:身份认证和权限认证等
之后执行:记录响应时间和从异常中恢复等
简单实现一个中间件
// 方式一
func MyMiddleware() app.HandlerFunc {
return func(ctx context.Context, c *app.RequestContext) {
// pre-handle
// ...
c.Next(ctx)
}
}
// 方式二
func MyMiddleware() app.HandlerFunc {
return func(ctx context.Context, c *app.RequestContext) {
c.Next(ctx) // call the next middleware(handler)
// post-handle
// ...
}
}
中间件有不同的级别,主要有
Server级别中间件和路由组级别中间件
Server中间件对整个server的路由生效
路由组中间件只对当前路由组下的路径生效