1 SENSORO 支撑百万级传感器的延时队列-德赢Vwin官网 网
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协议通讯。

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

    关注

    64

    文章

    8882

    浏览量

    137392
  • 智慧城市
    +关注

    关注

    21

    文章

    4261

    浏览量

    97264
收藏 人收藏

    评论

    相关推荐

    纳芯微发布两款车规压力传感器新品

    近日,纳芯微正式推出了两款专为汽车排放管理设计的车规压力传感器产品。这两款新品分别是NSPGL1系列集成式压差传感器和NSPAS5N系列耐腐蚀绝压传感器
    的头像 发表于 10-30 18:15 563次阅读

    霍尔传感器测电压会有延时

    霍尔传感器的工作原理 霍尔传感器通常由一个霍尔元件(如霍尔晶体管或霍尔集成电路)和一个磁场感应部分(如磁芯)组成。当磁场变化时,霍尔元件会产生一个与磁场强度成正比的电压信号。这个信号可以被放大并转换为数字信号,以便
    的头像 发表于 10-15 10:04 284次阅读

    车载传感器主要有哪些传感器

    车载传感器是现代汽车中不可或缺的组成部分,它们为车辆提供关键信息,以确保驾驶安全、提高燃油效率、增强驾驶体验和实现自动驾驶功能。车载传感器的种类繁多,每种传感器都有其特定的功能和应用场景。以下是一些
    的头像 发表于 09-07 09:30 554次阅读

    长光辰芯发布亿像素CMOS图像传感器GMAX64104

    近日,长光辰芯科技有限公司正式发布了其最新研发的GMAX64104 CMOS图像传感器,这款传感器以其前所未有的大靶面与亿像素分辨率,在行业内引起了广泛关注。GMAX64104不仅代表了当前图像
    的头像 发表于 09-05 16:30 523次阅读

    TMP275-Q1汽车±0.75°C温度传感器数据表

    德赢Vwin官网 网站提供《TMP275-Q1汽车±0.75°C温度传感器数据表.pdf》资料免费下载
    发表于 08-15 10:32 0次下载
    TMP275-Q1汽车<b class='flag-5'>级</b>±0.75°C温度<b class='flag-5'>传感器</b>数据表

    压力传感器0.25,精度是怎么来的

    压力传感器是一种将压力信号转换为电信号的传感器,广泛应用于工业自动化、航空航天、医疗设备等领域。在这些领域中,对压力传感器的精度要求非常高,因此对压力传感器的精度进行深入研究具有重要意
    的头像 发表于 06-19 09:49 2183次阅读

    LEM莱姆汽车DHAB S/18霍尔电流传感器介绍

    德赢Vwin官网 网站提供《LEM莱姆汽车DHAB S/18霍尔电流传感器介绍.docx》资料免费下载
    发表于 06-17 13:17 2次下载

    深入解析:人体传感器、存在传感器与场景存在传感器的差异与应用

    场景存在传感器比存在传感器探测更精细化,存在传感器比人体传感器探测精度更高。
    的头像 发表于 05-22 11:05 2276次阅读
    深入解析:人体<b class='flag-5'>传感器</b>、存在<b class='flag-5'>传感器</b>与场景存在<b class='flag-5'>传感器</b>的差异与应用

    数字传感器在桥梁健康监测中的应用

      1.力传感器:力传感器可以通过测量桥梁结构的受力情况来评估桥梁的健康状况。力传感器可以安装在桥梁的关键支撑部位,通过测量受力情况来判断是否存在异常的压力或应力。这些数据可以用于判断
    的头像 发表于 04-02 08:42 330次阅读

    什么叫离子传感器?离子传感器的工作原理 离子传感器的特性

    什么叫离子传感器?离子传感器的工作原理 离子传感器的特性 离子传感器是一种能够检测和测量离子浓度的传感器。它们通常用于分析化学、环境监测和生
    的头像 发表于 03-05 17:01 1383次阅读

    称重传感器c3等的精度是多少 称重传感器怎么接线

    称重传感器的C3等是指该传感器的精度等级。C3等的精度可以根据不同的标准来衡量,常见的标准有国际计量委员会(International Organization of Legal
    的头像 发表于 01-17 14:03 4984次阅读

    称重传感器c3等的精度是多少

    C3称重传感器是一种高精度的称重传感器,用于测量物体的重量。在工业和商业领域广泛应用,能够满足各种精度要求的称重需求。 C3称重传感器
    的头像 发表于 01-12 13:54 6991次阅读

    传感器的分类

    可分为压力和力传感器、位置传感器、液位传感器、能耗传感器、速度传感器、加速度传感器、射线辐射
    的头像 发表于 01-09 10:14 1416次阅读

    激光传感器的特点 激光传感器适用于哪些测量场景?

    ,并且列举一些适用场景。 1. 高精度:激光传感器具有非常高的精度,可以实现微米的测量精度。这使得它在需要高精度测量的领域非常重要,如工业制造、光刻、医疗仪器等。 2. 高速测量:激光传感器可以实现高速测量,毫秒
    的头像 发表于 01-03 15:59 646次阅读

    爱普生陀螺仪传感器的特点

    低噪声、高稳定性单轴陀螺传感器 独特的石英传感器元件,低噪音,性能稳定 驱动和检测臂分离的双T结构元件 高抗振动和冲击的支撑结构低功耗、高性能,内置IC优化信号处理,为
    发表于 12-28 10:03 0次下载