lmstfy介绍
GitHub - bitleak/lmstfy: A task queue with REST API
lmstfy是美图架构基础服务团队在 2018 年初基于 Redis 实现的简单任务队列(Task Queue)服务,由go语言开发。lmstfy本身不存储数据,而是使用Redis/Redis Sentinel。因此,数据的完整性和持久性掌握在redis手中,在生产环境中使用AOF和复制来确保这一点。
主要特性:
- 通过 HTTP REST API 提供服务
- 支持作业的额外生命周期管理:
- job TTL (time-to-live)
- job delay trigger (at second granularity)
- job auto-retry
- dead letter
- 丰富的业务和性能指标
- 具备横向扩展能力,消费/生成速率限制
内部实现图
官方图:
参考资料:
- lmstfy 的 redis 存储由四部分组成:
Timer Set(sorted Set):用来实现延迟任务的排序,再由后台线程定期将到期的任务写入到 Ready Queue 里面;Timer的实现是利用 zset 根据绝对时间戳进行排序,再由旁路线程定期轮询将到期的任务通过 redis lua script 来将数据原子地转移到 ready queue 里面。
Ready Queue (list):无延时或者已到期任务的队列
Dead Letter (list):消费失败(重试次数到达上限)的任务,可以手动重新放回队列
Job Pool(key-value):存储消息内容的池子
支持延迟的任务队列本质上是两个数据结构的结合: FIFO 和 sorted set。sorted set 用来实现延时的部分,将任务按照到期时间戳升序存储,然后定期将到期的任务迁移至 FIFO(ready queue)。任务的具体内容只会存储一份在 job pool 里面,其他的像 ready queue,timer,deadletter 只是存储 job id,这样可以节省一些内存空间。
- 内部主要由四个模块组成:
Pump Thread:每秒轮询 Redis 将到期的任务迁移到就绪队列(ready queue)
Metric Collector:定时收集队列相关统计数据到实例再通过 prometheus exporter 暴露给监控系统
Token Manager:用来管理 namespace 和 token 的模块,namespace 是用来做业务隔离的单位
Producer/Consumer:用来处理用户的任务和消费请求
Default Pool 除了用来存储业务数据,namespace/token 这类元数据也会默认存储到 Default 这个 Redis 池子里面
使用示例
此处我们在本机安装docker,使用官方提供的docker-compose即可启用体验lmstfy服务。
-
首先在拉取lmstfy源码,进入docker目录,通过docker-compose启动容器。
docker-compose -p test-lmstfy up -d
-
创建namespace 和 token,此处会返回token
curl -XPOST -d “description=test namesapce” “http://127.0.0.1:7778/token/test-ns”
返回:
{
"token": "01GXTC3MF9MHW83RJ2FJJAH7VH"
}
-
Publish一个内容为value的任务
curl -XPUT -H “X-token:{ENTER YOUR TOKEN}” -d “value” “http://127.0.0.1:7777/api/test-ns/test-queue?delay=1&ttl=3600&tries=16”
返回:
{“job_id”:“01GXTC71FFCCZSFFR3P40G0000”,“msg”:“published”}
-
Consume任务
curl -H “X-token:{ENTER YOUR TOKEN}” “http://127.0.0.1:7777/api/test-ns/test-queue?ttr=30&timeout=2”
返回: