分布式定时任务&&Hertz框架学习|青训营笔记

519 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第10天

分布式定时任务&&Hertz框架学习

抖音春节活动 & 定时任务发展之路

实现原理

image.png

三个核心问题:触发、调度、执行

触发器:解析任务,生成触发事件

调度器:分配任务,管理任务生命周期

执行器:获取任务执行单元,执行业务逻辑

除此之外,还有一个控制台(Admin),提供任务管理和干预的功能

数据流

image.png

四层结构各自的功能

image.png

控制台

一些基本概念的E-R图

image.png

任务元数据

基础信息、调度时机、执行行为、执行方式

image.png

任务实例

job_id用于和任务元数据对应

任务实例是一个确定的job的一次运行实例

image.png

触发器

核心职责:

给定一系列任务,解析他们的触发规则,在规定的时间点触发任务的调度

设计约束比较严格:

image.png

触发器方案

定期扫描+延时消息

image.png

时间轮

image.png

目的:遍历任务列表,从中找出当前时间点需要触发的任务列表

查询复杂度O(n)

修改复杂度O(1)

image.png

优化

image.png

用时间轮存储任务

image.png

Hertz学习

路由 | CloudWeGo

路由注册

Hertz 提供了 GETPOSTPUTDELETEANY 等方法用于注册路由。

示例代码

//	"/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的路由生效

路由组中间件只对当前路由组下的路径生效