支撑百万级传感器的延时队列

文/升哲科技 刘鹏

摘要:本文主要描述升哲科技在打造物联智慧城市平台过程中关于如何实现延时队列服务的技术选型经验、延时队列服务的架构设计以及延时队列的底层细节实现原理。

背景

升哲科技是一家物联网与人工智能领域的国家高新技术企业、独角兽企业。

要打造物联智慧城市平台,在业务中涉及到各种延时任务的需求,例如设备定时空气开关,定时更新设备状态,定时提醒等等,基于这些需求,需要一个可靠、实时、海量的延时队列服务作为基础设施。

那么延时队列是什么呢?延时队列不同于消息队列按照先入先出(FIFO)的顺序来消费,而是根据消息指定时间延时消费。延时队列的使用在我们日常应用也非常多,比如:

· 在电商平台购物,在30分钟内没有支付自动取消订单;

· 待处理的工单超过1天未处理,二次发送提醒。

以上场景往往都需要延时队列实现。

早期延时队列的实现采用了数据库扫表方式,服务定期查询到期的任务,再通过Kafka来中转消息。当任务量小,延时精度要求低时扫表方式还能应对,然而随着业务增长、任务数量不断增多,延时时间精度要求也变高,扫表的方式已经无法满足我们的业务,于是我们开始探索新的技术方案来支撑百万级任务的延时队列。

延时队列的设计目标

1.高可用:多副本部署,保证服务不出现单点故障;

2.可扩展:可随着业务量增长来扩容,同时生产消费的请求延时也要低;

3.兼容旧接口,保证旧的服务不需要做任何修改;

4.消息传递可靠,至少保证一次送达。

技术选型

在开源社区已经存在一些解决方案:

 

考虑到运维难度和可扩展性,最终我们选择了开源项目Lmstfy作为基础来进行二次开发,选择Lmstfy的原因如下:

● 无状态服务,使用Redis来持久化,Redis的高可用方案已经非常成熟,在公/私有云都有Paas服务可使用;

● 支持扩容,可以配置多个Redis集群;

● 提供Java/Go/Rust/PHP客户端,监控面板完善;

● 采用Golang开发,高并发性能优秀,也方便后续二次开发。

整体架构设计

1.Delayer:无状态服务,提供给业务服务调用,兼容旧接口,在Delayer这一层直接操作Redis实现了任务删除和更新任务等等功能;

2.Lmstfy:无状态服务,提供延时队列基础服务,底层实现采用;

3.Redis Sentinel集群:保证Redis发生故障时自动主备切换。

基础概念

● namespace - 用于隔离业务,也可以通过配置namespace绑定不同的Redis集群;

● queue - 队列,用区分同一业务不同消息类型;

● job - 业务定义的业务,主要包含以下几个属性:

  ○ id: 任务 ID,全局唯一;

  ○ delay: 任务延时下发时间, 单位是秒;

  ○ tries: 任务最大重试次数,tries = N 表示任务会最多下发 N 次;

  ○ ttr(time to run): 任务预期执行时间,超过 ttr 则认为任务消费失败,触发任务自动重试。

数据存储

Lmstfy 的 Redis 存储由四部分组成:

● Timer: 使用ZSET结构来存储延时任务,Score即任务的到期时间来排序;

● Ready queue -  使用LIST结构,存储已经到期的延时任务,实现FIFO消费;

● Deadletter- 使用LIST结构,消费失败(重试次数到达上限)的任务,可以手动重新放回到队列;

● Job pool – string类型,存储消息meta信息;

● Job mapping - string - 存储应用自定义id和job的关联关系。

创建任务

创建任务会生成一个Job ID, Job ID包括写入时间戳、随机数和延时时长,然后将任务的meta信息写入Redis,Key为 j/{namespace}/queue/{id} ,当任务延时时间(delay)= 0,(实时消息队列我们使用Kafka)表示不需要延时则直接写到 Ready Queue(List),当延时时间(delay) = n(n > 0),表示需要延时,将延时加上当前系统时间作为绝对时间戳写到 Timer(sorted set),Timer的实现是利用 ZSET 根据绝对时间戳进行排序,再由一个goroutine定期轮询将到期的任务通过 redis lua script 来将数据转移到 Ready Queue(List)中。

任务消费

支持延时的任务队列本质上是两个数据结构的结合: Ready Queue (LIST)和 Sorted Set。

Sorted Set 用来实现延时的部分,将任务按照到期时间戳升序存储,随后定期将到期的任务迁移至 Ready Queue(LIST)。

任务的具体内容只会存储一份在 Job pool 里面,其他的如 Ready Queue 只是存储Job id,这样可以节省内存空间。

任务更新和删除

Lmstfy本身不支持删除和更新,我们在Delayer层中在创建任务同时在Redis中创建了一个Mapping Key,客户端可以自定一个ID关联到Job id ,Delayer提供了删除和更新(先删除再创建)API,我们业务还需要支持多次执行的功能,在处理Job Ack时根据任务参数重新插入队列,结合我们二次开发整体结构如下:

性能表现

通过本地限定1核CPU 压测生产消息数据如下:

200万任务量占内存600MB+,其中包括mapping key导致key数量翻倍。

以下是单核CPU的环境下压测结果,任务创建可高达1500TPS:

延时任务到期时间比较分散的情况下,消费表现如下接800TPS:

总结

封装lmstfy的方案已足够支撑当前的使用场景,但还是有一些不足之处,比如:

● 在Delayer中操作Redis中的任务,无法保证原子性;

● 任务创建和消费另外会多一次网络请求,产生不必要的开销;

● 无法支持循环任务;

● Lmstfy采用HTTP协议,无法发挥更好性能。

未来,我们计划融合两个服务,完善任务CRUD功能,减少网络开销,并采用GRPC来替换HTTP协议通讯。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度解析|基于 eBPF 的 Kubernetes 一站式可观测性系统

简介:阿里云 Kubernetes 可观测性是一套针对 Kubernetes 集群开发的一站式可观测性产品。基于 Kubernetes 集群下的指标、应用链路、日志和事件,阿里云 Kubernetes 可观测性旨在为 IT 开发运维人员提供整体的可观测性方案。 作者:李煌东、炎…

系列解读SMC-R:透明无感提升云上 TCP 应用网络性能(一)| 龙蜥技术

简介:已有的应用若想使用RDMA技术改造成本高,那么有没有一种技术是不做任何改造就可以享受RDMA带来的性能优势? 文/龙蜥社区高性能网络SIG 引言 Shared Memory Communication over RDMA (SMC-R) 是一种基于 RDMA 技术、兼容 socket 接口的内…

技术引领未来, IDC TechScape中国数据安全发展路线图首发

2022年8月26日,IDC 2022 CSO全球网络安全峰会(中国站)在上海隆重开幕,会上首次发布《IDC TechScape:中国数据安全发展路线图,2022》。报告认为,帮助用户构建全方位数据安全治理体系将成为大趋势…

DataV 3D 平面地图 2.0 焕新上线

简介:DataV3月,3D平面地图2.0现已上线~ 3D 平面地图 2.0 现已上线~ 让我们来看看更新了哪些功能吧! 01 交互升级,省市区自由下钻 自带行政区域数据,无需配置: 甚至,可以通过「蓝图编辑器」实…

PolarDB-X 发布 2.1.0 版本,Paxos 开源

简介:2022年4月1号,PolarDB-X 正式开源X-Paxos,基于原生MySQL存储节点,提供Paxos三副本共识协议,可以做到金融级数据库的高可用和容灾能力,做到RPO0的生产级别可用性,可以满足同城三机房、两地三…

828成首个B2B企业节,华为联合3万生态伙伴助力中小企业数字化转型

中小企业既是市场的主体,也是保就业的主力军。截至2021年末,中小企业在全国企业中数量占比已超过99%,并贡献了80%的就业机会。 为助力中小企业创新发展,8月28日,华为联合3万家生态伙伴,共同发起了全国首个…

阿里云贾扬清:数据湖正成为企业数据应用创新标配

简介:全球数据湖峰会开幕 数字经济蓬勃发展的今天,越来越多的用户已经从“上好云”,走到了“用好云”的这个阶段。如果说在“上好云这个阶段,大多数用户关心的是如何在成本上获得更好的回报。那么在上好云这个阶段,更…

强强联手,NVIDIA 与 Ampere Computing 重磅推出云原生服务器平台

随着 5G、元宇宙的兴起,云游戏再一次迎来爆发。据 IDC 与中国信息通信研究院联合发布的《全球云游戏产业深度观察及趋势研判(2022年)》显示,2021年,中国地区云游戏市场收入已达 40.6 亿元,同比增长 93.3%。…

有了这款工具,定位线上问题事半功倍|云效工程师指北

简介:有了这款工具,定位线上问题事半功倍,程序员在日常工作中经常会遇到一些线上问题需要排查,本文的主人公程序员小张也不例外。但排查的过程却时常令他困扰不已。让我们一起看看他遇到了哪些问题,又是怎么解决的。 …

云原生时代如何用 Prometheus 实现性能压测可观测-Metrics 篇

简介:可观测性包括 Metrics、Traces、Logs3 个维度。可观测能力帮助我们在复杂的分布式系统中快速排查、定位问题,是分布式系统中必不可少的运维工具。 作者:拂衣 什么是性能压测可观测 可观测性包括 Metrics、Traces、Logs3 个维度。可观测…

基于 KubeVela 的机器学习实践

简介:本文主要介绍如何使用 KubeVela 的 AI 插件,来帮助工程师更便捷地完成模型训练及模型服务。 作者:KubeVela 社区 在机器学习浪潮迸发的当下,AI 工程师除了需要训练、调试自己的模型之外,还需要将模型进行部署上…

Gartner发布2022年云平台服务技术成熟度曲线,iPaaS、低代码将达到成熟期

Gartner 2022年云平台服务技术成熟度曲线显示,集成平台即服务(iPaaS)和低代码应用平台(LCAP)技术将在不到两年的时间内达到生产成熟期(Plateau of Productivity)。 编辑 | 宋慧 供稿 | Gartner…

贼喊捉贼?“盗版”软件开发者向 GitHub 投诉被侵权

整理 | 于轩 出品 | CSDN(ID:CSDNnews)拥有超过2亿个代码存储库,由8000多万用户共享,GitHub已然成为世界上最大和最先进的开发平台。 与其他托管用户生成内容的平台一样,这个庞大的代码库经常会接到版权…

基于 Serverless 架构的头像漫画风处理小程序

简介: 当一个程序员想要个漫画风的头像时... 前言 我一直都想要有一个漫画版的头像,奈何手太笨,用了很多软件 “捏不出来”,所以就在想着,是否可以基于 AI 实现这样一个功能,并部署到 Serverless 架构上让…

异动分析技术解决方案—异动归因之指标拆解

简介:归因的方法有多种,这篇文章的重点是指标拆解,也是我们做业务分析时最常用到的方法。我们的目的是解放人力,将指标拆解实现自动化,一方面可以加快业务迭代速度,快速定位问题;另一方面可以对…

阿里巴巴云原生混部系统 Koordinator 正式开源

简介: 脱胎于阿里巴巴内部,经过多年双 11 打磨,每年为公司节省数十亿的混部系统 Koordinator 今天宣布正式开源。通过开源,我们希望将更好的混部能力、调度能力开放到整个行业,帮助企业客户改进云原生工作负载运行的效…

足不出户,确保交付——独家交付秘籍(第二回)

简介:在后疫情时代,遇到无法出差、无法访客时,如何保障交付按时保质的进行,做好运维质量的保障,从而不影响企业整体营收,已成为我们生死攸关的难题。小锤在遇到无法只通过远程就完成项目交付验收&#xff0…

如何使用 PTS 快速发起微服务压测

简介:本文讲阐述什么是微服务架构、微服务架构对系统稳定性带来的影响,以及用性能测试验证稳定性的必要性、用户进行微服务压测的痛点和 PTS 的独特优势、云上使用 PTS 快速发起微服务压测的步骤,以及压测完成后排查分析相关问题的 Tips。 作…

一首让计算机崩溃的歌曲!

大家好,我是轩辕。想象一个场景:手机里播放一首音乐,然后你带着手机从一台电脑旁经过,电脑就被你弄崩溃死机了。这是不是有点像电影里的桥段?一年前,我写过一篇文章:电脑关机了,黑客…

OpenYurt 之 Yurthub 数据过滤框架解析

简介:OpenYurt 是业界首个非侵入的边缘计算云原生开源项目,通过边缘自治,云边协同,边缘单元化,边缘流量闭环等能力为用户提供云边一体化的使用体验。在 Openyurt 里边缘网络可以使用数据过滤框架在不同节点池里实现边缘…