0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

SENSORO升哲科技 2022-08-26 11:44 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

文/升哲科技刘鹏

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

背景

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

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

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

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

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

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

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

延时队列的设计目标

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

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

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

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

技术选型

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

方案描述
BeanstalkdBeanstalkd C语言实现,我们团队主要采用Golang和Java,二次开发有难度,beanstalkd不支持集群部署,高可用无法保证。
RabbitMQ延时队列RabbitMQ提供了延时队列插件,需要单独开启插件使用,其原理是通过死信队列实现。

NSQ

NSQ开源延时队列,NSQ支持延时队列。

DelayQueue延时队列

JDK中提供了一组实现延时队列的API,位于Java.util.concurrent包下DelayQueue。

时间轮算法

时间轮是一个算法,在 Netty、Akka、Quartz、ZooKeeper、Kafka等组件中都有使用,适合做统一调度器。

Redis Sorted Set

Redis Sorted Set 利用它的score属性,启用一个线程轮询,根据score获取超时的数据,然后触发超时操作。

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

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

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

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

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

整体架构设计

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

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

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

pYYBAGMIPSWAadr5AAFsTrVOjrQ938.png

基础概念

● 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时根据任务参数重新插入队列,结合我们二次开发整体结构如下:

pYYBAGMIPVCAa4BwAADfigE8rpw668.png

性能表现

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

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

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

pYYBAGMIPXqARGSKAABKeHHOOaY266.png

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

poYBAGMIPYuAbM6lAABarCzSqO4714.png

总结

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

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

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

● 无法支持循环任务;

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 大数据
    +关注

    关注

    64

    文章

    9029

    浏览量

    143064
  • 智慧城市
    +关注

    关注

    21

    文章

    4395

    浏览量

    101841
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    优先队列介绍

    队列(Queue)的知识点:「概念」:队列是一种先进先出(FIFO)的数据结构,类似于排队的概念。「基本操作」:enqueue(item): 将元素添加到队列的末尾。dequeue(): 从
    发表于 11-26 07:56

    ‌MCP998x车规温度传感器技术解析与应用指南

    Microchip Connect MCP998x车规温度传感器非常适合用于汽车应用中的有效热控制。Microchip Connect MCP998x是符合AEC-Q100标准的多通道温度
    的头像 发表于 10-09 16:31 603次阅读
    ‌MCP998x车规<b class='flag-5'>级</b>温度<b class='flag-5'>传感器</b>技术解析与应用指南

    世界上最小的传感器有多小 头发丝的十万分之一到百万分之一

    世界上最小的传感器有多小? 世界上最小的传感器可以达到人类头发丝的十万分之一到百万分之一。据央视报道,在2025年9月,我国科研团队开发的量子传感器尺寸仅0.5纳米,相当于人类头发丝的
    的头像 发表于 09-22 11:17 1053次阅读

    MEMS惯性传感器​都有哪些种类?MEMS惯性传感器有哪些特点

    MEMS惯性传感器都有哪些种类?MEMS惯性传感器有哪些特点,下面火丰精密小编为你讲解一下: MEMS惯性传感器包括MEMS陀螺仪及MEMS加速度计,其分类有多种方式,根据精度由低到高其可分为消费
    的头像 发表于 08-26 17:39 744次阅读
    MEMS惯性<b class='flag-5'>传感器</b>​都有哪些种类?MEMS惯性<b class='flag-5'>传感器</b>有哪些特点

    机器人竞技幕后:磁传感器芯片激活 “精准感知力”

    支撑机器人竞技能力的核心力量,深刻改变着竞技机器人的能力边界。 磁传感器芯片为机器人运动提供 “精准导航”。在动态平衡系统中,像昆泰芯 KTH71 系列磁传感器芯片,通过检测地磁场与运动磁场变化构建
    发表于 08-26 10:02

    什么是照度传感器和接近传感器

    近年来,照度传感器和接近传感器在我们身边各类设备中的应用越来越广泛。除了单独使用照度传感器和接近传感器外,将这些传感器组合使用的情况也在不断
    的头像 发表于 08-22 14:46 2477次阅读
    什么是照度<b class='flag-5'>传感器</b>和接近<b class='flag-5'>传感器</b>

    Texas Instruments TMAG6180-Q1角度传感器数据手册

    。TMAG6180-Q1传感器在X轴和Y轴上有两个独立霍尔传感器输出,可用于将传感器的角度范围扩展至360° 。该传感器还具有正弦和余弦输出超低延时
    的头像 发表于 08-02 11:29 1032次阅读
    Texas Instruments TMAG6180-Q1角度<b class='flag-5'>传感器</b>数据手册

    时识科技推出百万像素工业事件相机

    时识科技(SynSense)发布百万像素高分辨率、高成像质量、高动态范围的工业事件相机——Syn-Shining HD(闪灵系列工业相机)。
    的头像 发表于 07-31 11:29 869次阅读

    毫米精度背后的“隐形守护者”:位移传感器如何重塑工业未来

    位移传感器以0.5微米的重复精度,守护着12英寸晶圆100%的良品率。这些看似科幻的场景,正通过位移传感器这一“工业感知神经末梢”变为现实。 一、从毫米到纳米:精度革命的幕后推手 位移传感器家族中,激光位移
    的头像 发表于 07-08 08:35 567次阅读
    毫米<b class='flag-5'>级</b>精度背后的“隐形守护者”:位移<b class='flag-5'>传感器</b>如何重塑工业未来

    stm32f103用freertos对一个采样率为1kHz的传感器,进行采样,数据出差

    您好,请问,用FreeRTOS的队列对采样率1khz的传感器读取数据, 在采集任务中:通过spi读取数据——滤波(ARM-DSP库)——将数据写入队列——延时vTaskDelay(1
    发表于 05-05 22:44

    NVME控制队列管理模块

    队列管理模块是整个NVMe Host控制的核心模块,该模块实现了提交队列与完成队列的管理,多队列请求的仲裁判决等功能。
    的头像 发表于 05-03 15:32 423次阅读
    NVME控制<b class='flag-5'>器</b>之<b class='flag-5'>队列</b>管理模块

    Vishay Opto VEML6031X00汽车环境光传感器

    VishayOptoVEML6031X00汽车环境光传感器(ALS)是一款高精度传感器,设有I2C接口。该传感器是一款环境光数字16位分辨率传感器
    的头像 发表于 04-03 10:31 974次阅读
    Vishay Opto VEML6031X00汽车<b class='flag-5'>级</b>环境光<b class='flag-5'>传感器</b>

    汉威科技柔弹性传感器为智能选床垫系统提供支撑

    汉威科技集团是国内首家从事柔弹性传感器研发生产的企业,打造了专业的柔弹性传感器研产体系,已经具备从材料、电子、软件到系统的全链条研发、生产能力,拥有年产数百万件弹性应变传感器的生产线,
    的头像 发表于 02-13 14:24 1008次阅读

    芯阅科技发布芯片水质传感器

    、准确地反映水质状况。更重要的是,该批产品首创性地解决了原位长期在线水质物理、化学数据的收集难题,为水环境监测提供了更为便捷、高效的方式。 芯阅科技的这款芯片水质传感器主要应用于海洋生态保护、海洋牧场建设等领
    的头像 发表于 02-11 10:14 839次阅读

    干簧管传感器属于什么传感器

    干簧管传感器,又称磁簧开关传感器或磁敏开关,是一种基于干簧管(Reed Switch)原理工作的传感器。作为一种重要的磁传感器,干簧管传感器
    的头像 发表于 01-30 15:33 2353次阅读