干货 | 成本低误差小,携程基于 Kafka 的 Serverless 延迟队列的实践

Kafka 的延迟队列、死信队列和重试队列 通过以上步骤,你可以在 Spring Boot 中实现 Kafka 的延迟队列、死信队列和重试队列。这些功能可以确保消息处理的可靠性和健壮性,避免消息丢失或重复处理。希望这些示例能帮助你更好地理解和使用 Kafka 的高级特性。 阅读详情

作者简介

Pin,关注 RPC、Service Mesh、Serverless 等云原生技术。

一、背景

随着上云项目的不断推进,大量的应用需要部署到 aws 上,其中有很多应用都依赖延迟队列的功能。而在 aws 上,我们选择以 Kafka 作为消息队列,但是 Kafka 本身不支持延迟队列,这就需要思考如何基于 Kafka 来实现延迟队列。

二、需求

统计了一下所有需要使用到延迟队列的场景,有以下几大特点:

  • 延迟时间不固定。有的 topic 需要支持 5 分钟的延迟,有的却要求支持 7 天的延迟。

  • 延迟消息数量小。所有的场景中涉及到的每天延迟消息的数量不超过 1 亿条,每条消息的大小不超过 1MB。

  • 延迟消息不能丢失,可以不保证有序。

  • 延迟误差小。延迟误差是指实际消费消息的时间和希望消费消息之间的时间差值。根据统计的业务场景来看,要求延迟误差在 2s 以内。

  • 生产延迟消息的峰值比较高。很多情况下,业务会一次性创建 1000 万条延迟消息,并且这些延迟消息的延迟时长都是一致的。

三、目标

由于实现延迟队列的方式有很多,我们在满足需求的前提下,制定了几个目标:云上成本低、运维成本低、开发成本低、稳定性高和延迟误差小。

四、产品选型

在 aws 上支持消息队列的产品有 RabbitMQ、Apache ActiveMQ 和 SQS。其中 RabbitMQ 和 Apache ActiveMQ aws 主要是托管其安装部署,并非是以 Serverless 的方式对外提供服务。另外,我们当前已经选择使用 Kafka 作为消息队列,若仅仅为了满足延迟队列的功能而去更换消息队列,成本显然是巨大的。

除此之外,aws 还提供了 SQS 来支持延迟队列,虽然 SQS 是 Serverless 的,但是 SQS 有他自身的局限性:SQS 最多支持 15 分钟以内的延迟,明显无法满足我们的需求。

可见,仅仅基于云上已有的产品已无法满足我们的需求,基于这个原因,我们开始调研延时消息的实现方案,看看能否通过少量的开发来实现我们的需求。

五、方案调研

业界实现延时队列功能的方案比较多,我们对其进行了简单的分析,具体如下:

5.1 RabbitMQ

RabbitMQ 是基于 TTL+ 死信队列的方式来实现的。具体来说,通过设置消息的 TTL,当达到 TTL 时消息还没有被消费,此时会投递到死信队列。TTL 分两种:

  • Queue 级别的 TTL:所有消息统一的 TTL

  • Message 级别的 TTL:每条消息可以是不同的 TTL,但是存在队头阻塞问题

该方案的优点是实现简单,但是延迟误差不确定。

5.2 Apache ActiveMQ

Apache ActiveMQ 是基于定时调度的方式来实现的。具体来说,配置延迟时间或者 cron 表达式表示消息的投递策略,基于 Java 的 Timer 实现,将消息分级存储在文件和内存中。

该方案的优点是实现简单,延迟误差可控,但是可能会占用大量内存。

5.3 RocketMQ

RocketMQ 是基于定时调度+延迟等级的方式来实现的。具体来说,将延时消息发送到指定的延时等级队列(一共有 18 个等级),然后通过一个定时器进行轮询这些 ConsumeQueue 实现延时的效果。具体实现如下:

  • 修改消息 topic 名称和队列信息投递到对应等级的延时消息的 ConsumeQueue 中

  • ScheduleMessageService消费ConsumeQueue中的消息再重新投递到 CommitLog 中

  • 将 CommitLog 中的消息投递到目标 topic 中,消费者消费目标 topic 中的消息

该方案的优点是延迟误差可控,但是实现复杂。

5.4 Redis

基于 Redis 实现延迟队列的方式有很多,在这里简单描述两种:

1)定时轮询

该方案的大致步骤如下:

  • 将消息的延时时间戳作为 zset 的 key,消息的 ID 作为 zset 的 value

  • 消息 ID 作为 key,消息体序列化成 String 作为 value 存储在 Redis 中

  • 定时轮询 zset,大于当前时间则投递到 Redis 的 List 中供消费者消费

2)Key 过期监听器

每条消息设置一个过期时间,监听过期事件然后将消息投递到 target topic。

基于 Redis 实现延时队列的优点是实现简单,但是都可能存在丢消息的情况,并且存储成本高。

六、实现方案

既然使用单一的云上产品不能满足我们的需求,那就只能考虑通过少量的开发并结合云上产品的特性来实现基于 Kafka 的延迟队列的功能。具体的实现方案有如下几种:

6.1 RabbitMQ 或 Apache ActiveMQ

RabbitMQ 或者 Apache ActiveMQ 都是 aws 上支持的产品,从功能层面来看是可以满足需求。当前的消息队列是基于 Kafka 实现的,如果再结合 RabbitMQ 或者 Apache ActiveMQ 来实现延迟队列的功能,主要面临的问题是:缺少对 RabbitMQ 或者 Apache ActiveMQ 相关的技术储备,由于 aws 上对 RabbitMQ 或者 Apache ActiveMQ 仅仅只是部署层面的托管,当出现问题时,是需要有研发人员自己去 troubleshooting 的。所以,该方案就不考虑了。

6.2 基于 SQS 的多级队列

既然 SQS 已经支持 15 分钟内的延时队列,那么如果要实现更长时间的延迟队列是不是可以考虑通过多级延迟队列来实现?具体实现方案如下:

  1. 在延迟消息中增加一个字段 times 用来表示当前是第几轮(借鉴时间轮算法的思路)。

  2. 如果延迟消息的延迟时间小于 15 分钟,将延迟消息的 times 设置为 0,直接投递到 SQS 中。

  3. 如果延迟消息的延迟时间大于 15 分钟,计算一下 times 的值(延迟时间/15 分钟),然后直接投递到 SQS 中。

  4. 如果 Consumer 从 SQS 中消费到了一个延迟消息且 times 大于 0,则将 times 的值减去 1,再次投递到 SQS 中。如此反复,直到 times 为 0。

  5. 如果 Consumer 从 SQS 中消费到了一个延迟消息且 times 为 0,则表示该消息已经达到了延迟时间,则 Consumer 会直接将该消息投递到对应的目标 topic。

这种方案虽然能够实现延迟队列的功能,且 SQS 本身也是 Serverless 的,维护成本也比较低。

但是我们调研了一下 SQS 的计费标准发现,SQS 主要是根据消息数量来收费的。这样一来,如果延迟时间越长,消息数量会被放大的越严重。而我们实际业务中延迟时间在 15 分钟以内的没有,一般是 1 小时到 7 天,所以这种方案不可行。

6.3 基于 SQS 和定时调度策略

使用基于 SQS 的多级队列的方式最大的问题是云上的成本问题,更具体一点是云上的存储成本问题。因为该方案将所有的延迟消息都存储在 SQS 中,这是导致费用增加的最主要原因。既然如此,那我们是不是可以考虑将大于 15 分钟延迟时间的消息写入到一个成本低的存储上,然后在时间延迟时间小于 15 分钟的时候将其查询出来投递到 SQS 中即可。这样一来,延迟时间的长短不会对 SQS 的费用有影响,仅仅只需要考虑如何选择一个存储成本低、读写方便的 Serverless 产品作为延迟消息的存储即可。

基于这一思路,设计了一个基于 SQS 和定时调度策略的实现方案:

485d0820de6543ae17e6f10c8ad3516b.png

具体流程如下:

  1. 生产者 Producers 生产的正常消息直接投递到 Kafka 的目标 topic,如果是延迟消息投递到 Kafka 的一个延迟消息的 Delay Message Topic 中。

  2. Consumer 消费 Delay Message Topic 中的消息,如果该消息的延迟时间小于 15 分钟,直接投递到 SQS(Delay Queue)中。如果消息的延迟时间大于 15 分钟,直接将消息写入到 Message Store 中。

  3. Scheduler 会定时扫描 Message Store 中的消息,如果发现延迟时间小于 15 分钟,则直接投递到 SQS(Delay Queue)中,Scheculer 是通过 Event Bridge 来触发的。

  4. Emitter 会消费 SQS(Delay Queue)中的消息,并将该消息投递到目标 topic 中。

整个流程不算复杂,里面涉及到的 aws 服务都是 Serverless 的,但是涉及的服务太多以后 troubleshooting 就会比较复杂。

基于以上问题,我们对该方案的实进行了改进和简化,具体如下:

fa7e6bb25e55260663e73542fa14df4a.png

具体流程如下:

  1. 生产者 Producers 生产的正常消息直接投递到 Kafka 的目标 topic,如果是延迟消息投递到 Kafka 的一个延迟消息的 Delay Message Topic 中。

  2. Service 消费 Delay Message Topic 中的消息,如果该消息的延迟时间小于 15 分钟,直接投递到SQS(Delay Queue)中。如果消息的延迟时间大于 15 分钟,直接将消息写入到 Message Store 中。

  3. Service 会定时扫描 Message Store 中的消息,如果发现延迟时间小于 15 分钟,则直接投递到 SQS(Delay Queue)中。

  4. Service 会消费 SQS(Delay Queue)中的消息,并将该消息投递到目标 topic 中。

简化后的方案将 Consumer、Emitter 和 Scheduler 的逻辑都集中在 Service 这个服务中,Service 服务是集群部署的,这种方案所有的逻辑都在 Service 这个服务中,在 troubleshooting 时相对来说要方便一些。整体实现方案的大方向确定好以后,还需要细化以下几个问题:

1)消息如何存储

我们可以看到 Message Store的主要功能是存储延迟时间大于 15 分钟的延迟消息, 并供 Scheduler 进行查询,查询的时候是根据时间来查询的。支持 Serverless 方式存储的服务也比较多,经过调研最后选择 DynamoDB。

DynamoDB 中的 partition key 是延迟时间,sorted key 选择 message id,这样可以保证通过 partition key 和 sorted key 能够唯一定位到一条消息,不会出现冲突。同时,在查询的时候只需要根据 partition key 就可以查询出该时间片段内的所有消息,也不会出现热点或者 partition 不均匀的问题。

假设 partition key 为 1677400776(是 2023-02-26 16:39:35 的时间戳,精确到秒),则该 partition key 中对应的所有消息都是延迟时间从 2023-02-26 16:39:35 到 2023-02-26 16:39:36 之间的消息。因为每个消息都有唯一的 message id,所以将 sorted key 设置为 message id 就不会导致消息冲突的问题。Scheduler 在查询的时候只需要传入需要查询的时间戳就可以拉取该时间段内所有的消息,如果没有查询到,则表示该时间段内没有延迟消息。

同时,对于 DynamoDB 中的消息也设置了 TTL 用来自动删除数据的,设置的 TTL 时间比延迟时间大 24 小时,主要是方便 troubleshooting 的。当 DynamoDB 中的延迟消息被投递到 SQS 以后,会调用 API 去删除该消息。DynamoDB 中消息的数据结构还包括 topic、消息体等信息。

2)单点问题

单点问题主要是因为对于存储在 DynomaDB 中大于 15 分钟的延迟消息进行扫描的时候,接收到扫描通知的 Scheduler 出现了问题,则该时间段的消息没有被投递到 SQS中,从而导致消息丢失。现在 Scheduler 的功能都集成在 Service 服务中,而 Service 服务是集群部署,所以 Scheduler 不存在单点的问题。

但是需要解决另外一个问题:如何保证集群中只有一个 Scheduler 扫描 DynamoDB 中的数据,并且当 Scheduler 出现了问题以后,集群中其他 Scheduler 也可以继续接着执行?

为了解决这个问题:我们使用了 SQS 的 FIFO 队列。SQS 支持两种队列,一种是 Standard 对列,一种是 FIFO 队列。FIFO 队列可以严格保证消息的有序,同时支持消息的可见性,也就是说在一段时间内该消息只能有一个消费者可见,其他消费者无法访问。同时,SQS 的 FIFO 队列还支持去重的功能。基于 SQS 的 FIFI 队列的这些特性,解决单点问题就比较容易了。具体实现方案如下:

  1. 在 Service 服务中启动一个 Timer 定时向 SQS 的 FIFO 队列投递通知消息,一分钟投递一次。通知消息的消息体是当前时间的时间戳,精度到分钟。这样即使有 n 个 Timer 在同一分钟内向 SQS 的 FIFO 队列投递 n 次消息,也只会有一条消息被成功投递到 SQS 的 FIFO 队列中,n-1 条消息被 SQS 的 FIFO 队列的去重功能过滤掉了。

  2. 投递到 SQS 的 FIFO 队列中的可见性设置为 5分钟(可以配置)。可以保证在 5 分钟内只有一个 Scheduler 可以消费到通知消息,如果该 Scheduler 出现了故障,后续的其他 Scheduler 也可以接着继续消费。当 Scheduler 消费到通知消息时,会根据消息内容转换成时间戳,并在 DynamoDB 中查询这一时间戳范围内的所有消息,修改消息的延迟时间,投递到 SQS 的 Standard 队列中,最后删除 SQS 的 FIFO 队列中的这一条通知消息。

基于上面的方案,能够很好的解决单点问题。

3)消息丢失问题

因为 Timer 和 Schduler 都在 Service 服务中,都是集群问题,不存在单点问题。并且,SQS 的 FIFO 队列能够保证消息严格有序,所以不存在消息丢失的问题。唯一可能存在的问题是,因为消息量大积压导致的消息延迟过长。

4)如何查询延迟消息

Scheduler 查询的消息要满足该消息的延迟时间小于 15 分钟,所以在接收到通知消息并转换成对应的时间戳以后,查询当前时间戳 +14 分钟(延迟消息不能超过 15 分钟)的消息即可。

5)如何部署 Service 服务

对于 Service 服务,我们采用了 ECS+Fargate 的方式来部署。整个代码的部署都是通过 Terraform 脚本来创建 Code Pipeline、DynamoDB、SQS 和 ECS 等资源实现的,所有的资源都是通过代码来实现的,整个部署方案的设计全部都是基于 gitOps 的思想。

经过多以上方案的综合评估,最后我们选择基于 SQS 和定时调度策略的方案来实现延迟消息。

6.4 性能优化

以上方案在实践的过程中,做了很多优化,大致可以归纳成以下几点:

1)消息积压

由于需要处理的延迟消息会因为消费能力不足的情况导致消息积压的问题。优化这一问题主要从以下几个方面入手:

  • Delay Message Topic 的 partition 设置成 64 个。提高 Kafka 消费的消费能力可以通过增加 consumer 来实现,但是前提是要保证 partition 的数量大于等于 consumer 的数量。

  • 降低 Service 的服务配置,增加 Service 服务的副本数。Service 集群消费 Delay Message Topic 中的消息,副本数越多,消费能力越强。

2)DynamoDB 中 WCU 和 RCU

DynamoDB 的费用有很大一部分是通过 WCU 和 RCU 来统计的。WCU 是指单位时间内消息写入的数量,RCU 是指单位时间内消息读取的数量。如果单位时间内写入消息的数量超过了 WCU 的限制会导致消息写入失败,同理也会导致读取消息失败。

如果将 WCU 和 RCU 都设置成峰值肯定不会导致读写失败的问题,但是会产生巨大的成本浪费。为此,我们将 WCU 和 RCU 设置成动态扩缩容的方式。在扩容期间如果产生失败,则进行重试。经过相关参数的优化,现在已经可以达到一个最佳现状。

3)ECS 扩缩容设置

ECS 中最小的运行单元是 task,对于每一个 task 要求扩容要快,缩容要缓慢。task 快速扩容遇到的最大的问题是,拉起 Service 的耗时比较长。对于 Service 服务我们采用 golang 来实现,扩一个 task 能够基本上可以在 8s 内完成。扩缩容是基于 CPU 的使用峰值来设置的,每次扩容会扩 4 个 task,每次所容会缩 1 个 task。

4)消息平滑处理

由于写入 Delay Message Topic 中的消息峰值可能会比较大,如果快速消费这些消息,会导致后续对 DynamoDB 的读写压力比较大。因此,在消费 Kafka 的 Delay Message Topic 中的消息时,会将控制每个 Service 消费消息的数量。尽管有多个 Service 会同时消费,但是对于单个 Service 来说,写入消息的数量较少,对 DynamoDB 来说,每一次的写入比较平稳,并非一次性写入大量的数据,从而写入失败的概率会小很多。

6.5 实践效果

目前已经在生产环境稳定运行了 6 个月,各项指标都比较健康,拉取了最近 4 周的数据。

1)延迟消息成功率

c8ec56d762b6c74e1931847f1f5e7565.png

如上图所示,延迟误差在 2 秒以内的延迟消息成功率基本上是 100%。

2)延迟消息的数量

1b93370a85dfe0daf3feaac1d057e0af.png

如果上图所示,延迟消息在 5 分钟内的峰值达到 15 万,也就是峰值每秒处理 500 个延迟消息。

3)DynamoDB 性能指标

cf24c60f9eb4412a2f6797bec051ee05.png

从 PutItem ThrottledRequests 这个指标可以看出,通过 DynamoDB 写入消息没有发生写入失败的情况。从 QueryThrottledRequests 这个指标可以看出,通过 DynamoDB 查询消息也没有发生查询失败的情况。从 QueryReturnedItemCount 指标可以看出,延迟消息的峰值是 5 分钟内 3350 条,每秒低于 60 条。这是因为我们在 Service 中对写入消息进行了缓冲,从而降低了并发读写压力。

4)Kafka 消息积压

f4406cd3abba9f069ab3dcdc113c367f.png

如上图所示,Kafka 在 5 分钟内消息积压的峰值是 6 万,积压的消息都能很快被消费掉。

5)Timer 性能指标

f964e22f41206b5128996e070cdb3913.png

Timer 会每分钟向 SQS 的 FIFO 队列中投递一个消息,消息的数量与 Service 的副本数相同。从上图可以看出,5 分钟内最多投递了 300 个消息(因为 Service 的副本数最大为 64)。但是最后接收的消息是5分钟内仅仅接收了 5 个消息,也就是 1 分钟接收 1 条消息。

七、总结

由于该实现方案完全是基于 Serverless 的方式实现的,所以维护成本非常低。尽管开发起来有些复杂,但这是一次性的成本投入。从近几个月的数据来看,云上的使用成本大约每个月不超过 200 美元,误差延迟比较小,到目前为止整体运行起来比较稳定。

【推荐阅读】

3d089904607c83f3a243aad4bde29354.jpeg

 “携程技术”公众号

  分享,交流,成长

kafka之延迟队列 kafka实现延迟队列思路设计 阅读详情

相关推荐

Kafka - 延迟消息队列 - 使用、实现和原理

延迟消息队列是一种常见的消息传递模式,它允许在特定的时间点或延迟一段时间后发送消息。在本文中,我们将探讨如何使用Kafka来实现延迟消息队列,并深入了解其原理。

CvhShell的博客 1956

Kafka延迟队列的实现方式

延迟队列是一种特殊的消息队列,可以将消息或任务推迟到指定的时间再进行处理。它通常用于处理需要在未来某个时间点执行的任务,如定时任务、延迟通知等。延迟队列允许开发人员根据任务的延迟要求进行灵活的调度和处理。本文介绍了如何使用Kafka实现延迟队列的两种方式。无论是使用消息的时间戳和消费者组,还是使用Kafka Streams的事件时间,都可以实现灵活的延迟队列功能。通过合理的设计和调度,我们可以在分布式系统中实现高效、可靠的延迟任务处理。希望本文对你理解Kafka延迟队列的实现方式有所帮助。

果酱 の 博客 1万+

CTFHUB------XSS反射型(WP)

文章目录前言XSS测试平台 前言 一开始我直接在上面写js脚本发现出错,最后发现只能通过下面的输入框来执行XSS测试,于是我们只能用XSS测试平台解决问题 XSS测试平台 注册一个XSS测试平台 这里随便填写 勾选默认模块就够了,点击下一步 这时会出现一个找个将代码复制 拼接到网站后缀name后面,点击send 这时平台会收到一个记录点开即可 得到flag ...

Y4tacker的博客 1万+

springboot kafka 实现延时队列

延时队列的技术实现方案有:redis延时队列,Kafka延时队列,rabbit延时队列,Kafka延时队列等 本文章springboot kafka 实现延时队列,使用Kafka消费者的pause函数(暂停)和resume函数(恢复)+定时任务+事件监听机制+工厂。 延时任务的应用场景: 1,订单超时自动取消:用户下单后,如果在指定时间(半小时)内超时未完成支付,系统会自动取消订单,释放库存。 2,定时推送:比如消息通知,用户预约某个服务,系统会在服务开始前一定时间发送提醒短信。 3,定时任务 4,限时抢购

qq_41889508的博客 6万+

STM32F103C8T6+I2C+DMA读取陀螺仪模块JY901S(硬件I2C

说明:1.本实验代码适用移植一切stm32f1系列;2.本实验使用的是外设资源硬件I2C2;3.本实验运用的是DMA单次模式,如果需要DMA的循环模式,请移步我的另一篇文章;4.本文章不提供陀螺仪校准教学,并是在没有校准陀螺仪情况下读取数据;5.本文章是作者的学习记录及心得,如有不足,欢迎指正。 总结:亲测stm32f103c8t6最小系统板通过片上外设资源I2C配合DMA读去陀螺仪模块jy901s偏航角有效。

anquanyuanqqadsy的博客 6171

数据预处理的分箱操作

数据分箱 介绍 我们在建立模型前,一般需要对特征变量进行离散化,特征离散化后,模型会更稳定,降低模型过拟合的风险。尤其是采用 logsitic 建立评分卡模型时,必须对连续变量进行离散化。而特征离散化处理通常采用的就是分箱法,数据分箱(也称为离散分箱或分段)是一种数据预处理技术,用于减少次要观察误差的影响,提高泛化性。 数据分箱又分为有监督分箱和无监督分箱,是否使用标签进行离散化(分箱)决定了有监督还是无监督的离散化方法。 知识点 无监督分箱 split 分箱 merge 分箱 无监督分箱 这里为了

随笔记 5332

kafka实现延迟队列

首先说一下延迟队列这个东西,实际上实现他的方法有很多,kafka实现并不是一个最好的选择,例如redis的zset可以实现,rocketmq天然的可以实现,rabbitmq也可以实现。如果切换前几种方案成本高的情况下,那么就使用kafka实现,实际上kafka实现延迟队列也是借用了rocketmq的延迟队列思想,rocketmq的延迟时间是固定的几个,并不是自定义的,但是kafka可以实现自定义的延迟时间,但是不能过多,因为是依据topic实现的,接下来我使用go实现简单的kafka的延迟队列。

weixin_51991615的博客 4906

用AI画电路板AI EDA初探Creating WiFi Radio with CELUS: A Step-by-Step Tutorial 使用CELU.IO创建WiFi收音机:分步教程

结论:整体还不太成熟,所选器件单元是欧美思维,器件选型成本和咱们华强北还是无法比。可以关注迭代,看客就当走马观花就行了;不过里面的单元模块还带有AI提问的这个比较好,值得国内EDA从业者学习。话不多说上正文:本教程目的是让我们深入了解如何使用CELUS设计平台构建WiFi收音机实战项目。本指南的重点是使用该平台来选择正确的解决方案,并整合一个项目,让您可以将音乐和节目从互联网直接传输到您自己构建的扬声器。

2301_81235726的博客 1万+

Kafka系列之:延时队列

Kafka系列之:延时队列

zhengzaifeidelushang的博客 4033

智能车图像处理1-基础图像规格

从厂家摄像头的库函数中,我们可以直接得到完整图像的灰度数组,经过二值化之后(算力允许,可以考虑大津法),就是我们要处理的0-1二值图像了。本系列所有的文章中,我们的图像规格如下。

taiyuezyh的博客 4322

Google Earth Engine :处理Sentinel-1 GRD SAR数据以估算田间尺度土壤湿度的工作流程(计算双极化雷达植被指数(DpRVIc)和VV极化后向散射强度(VVdB))

本文介绍了利用Google Earth Engine (GEE)处理Sentinel-1 SAR数据估算田间土壤湿度的方法。工作流程包括:定义研究区域并筛选指定日期、轨道参数的Sentinel-1图像;预处理计算双极化雷达植被指数(DpRVIc)和VV极化后向散射强度(VVdB),通过均值滤波降噪并去除无效像素;结合动态世界数据集掩膜水体/城市区域;最终导出时序GeoTIFF文件。DpRVIc基于双极化后向散射系数比,对植被结构敏感,而VVdB反映地表反射特性,二者结合可有效评估土壤湿度。该方法适用于农业监

此星光明博客 383

Kafka 实现延迟队列的方法

虽然 Kafka 本身并不直接支持延迟队列,但通过结合 Kafka 的内置功能、外部定时器、时间轮算法或第三方插件,可以实现各种精度和性能需求的延迟队列。选择合适的方法取决于具体的业务需求和系统复杂度。

My_wife_QBL的博客 3195

PyTorch深度学习实战(29)——变分自编码器(Variational Autoencoder, VAE)

变分自编码器 (Variational Autoencoder, VAE) 是一种结合了自编码器和概率建模的生成模型,通过编码器将输入数据映射到潜在空间中的概率分布,并通过解码器将从潜在空间采样得到的潜在变量映射回原始数据空间,实现了数据的生成和特征学习。

盼小辉丶的博客 1万+

【学习笔记】kafka学习二

kafka学习笔记

qq_36149079的博客 2469

【QCA6174】QCA6174 DFS认证的时候会有概率信道不会跳转的情况,通常跳转成功概率只有25%问题分析及解决方案

Master设备需要测试的项目。

wgl307293845的博客 752

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Kafka--延迟队列--使用/实现/原理

本文介绍Kafka如何使用延迟队列的功能。 Kafka是很长用的消息队列,但Kafka本身是没有延迟队列功能的,RabbitMQ、RocketMQ有延迟队列的功能。本文介绍如何手动给Kafka添加延迟消息的功能。 虽然Kafka内部有时间轮,支持延时操作,例如:延迟生产、延迟拉取以及延迟删除,但这是Kafka自己内部使用的,用户无法将其作为延迟队列来使用。 本内容也是Java后端面试常问的问题 。...

IT利刃出鞘的博客 5万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Kafka--延迟队列-转载

本文介绍Kafka如何使用延迟队列的功能。Kafka是很常用的消息队列,但Kafka本身是没有延迟队列功能的(RabbitMQ、RocketMQ有延迟队列功能)。本文介绍如何手动给Kafka添加延迟消息的功能。虽然Kafka内部有时间轮,支持延时操作,例如:延迟生产、延迟拉取以及延迟删除,但这是Kafka自己内部使用的,用户无法将其作为延迟队列来使用。本内容也是Java后端面试常问的问题。

liujia_It的博客 1735

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

利用Kafka实现延迟队列实践

上面的实践存在什么样的问题,考虑一个场景,有一个延迟一小时的队列,这样消息发出后,实际上一个小时后在该主题上的消息拉取才有意义(之前即使拉取下来也发送不出去),但上面的实现仍然会不停阻塞唤醒,相当于在做无用功。主要实践原理是通过定阅原始主题,并判断是否满足延迟时间要求,满足要求后转发新主题,不满足则阻塞等待,同时外置一个定时器,每1秒进行唤醒锁协作。这边的原理是通过定阅原始主题,并判断是否满足延迟时间要求,满足要求后转发新主题,不满足则停止消费并等待。kafka本身是不支持延迟队列功能,我们可以通过。

sunquan291的专栏 5292

Kafka如何实现延迟队列?

如果采⽤每秒定时推进, 那么获取到第⼀个超时的任务列表时执⾏的200次推进中有199次属于“空推进”,⽽获取到第⼆个超时任 务时有需要执⾏639次“空推进”,这样会⽆故空耗机器的性能资源,这⾥采⽤DelayQueue来辅助以少量空间换时间,从⽽做到了“精准推进”。Kafka中的定时器真可谓是“知⼈善⽤”,⽤TimingWheel做最擅⻓的任务添加和删除操作,⽽⽤DelayQueue做最擅⻓的时间推进⼯作,相辅相成。Kafka中的定时器借助了JDK中的DelayQueue来协助推进时间轮。

完全体 1940

KAFKA

kafka简介

qq_25043977的博客 1317

Kafka 消息队列消息消费延迟解决方案

一、消息队列解决的问题: 引入消息队列一般能解决一下五种场景:异步处理,应用解耦,流量削锋,日志采集和消息通讯 1、异步处理 场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种 1.串行的方式;2.并行方式 (1)串行方式:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端 (2)并行方式:将注册信息写入数据库成功后,发送注...

leehsiao的专栏 1万+

Kafka的延迟队列是如何实现的?

主题命名策略:可以创建多个主题,每个主题代表一个时间段,生产者根据消息的延迟时间发送到对应的主题。消费者订阅:消费者订阅当前时间对应的主题,消费其中的消息。这种方法可以实现一定程度上的延迟消费,但需要管理多个主题,并且可能会增加存储开销。

qq_33240556的博客 1581

springboot kafka 实现延时队列_kafka延迟队列

②适用于轻量级的任务调度和消息通知场景,适合短期延迟任务,不适合长期任务,例如订单超时未支付等。①没有原生的延迟队列功能,需要使用topic和消费者组来实现,实现延迟队列需要额外的开发工作。①RabbitMQ的延迟队列是通过RabbitMQ的插件实现的,易于部署和使用。例如电商平台、社交软件等。①RocketMQ的延迟队列是RocketMQ原生支持的,易于使用和部署。②RocketMQ的延迟队列需要保证消息的顺序,可能会导致消息延迟。适用于大规模的数据处理,实时性要求较高的,高吞吐量的消息处理场景。

2401_86400247的博客 2272

Kafka如何实现延时队列

在订单创建后超过30分钟未支付的情况下,可以通过Kafka实现延时队列来取消订单。具体方案包括:在Kafka中创建相关主题,消费者轮询消费该主题的消息。消费者在消费消息时,判断消息的创建时间与当前时间是否超过30分钟(前提是订单未支付)。如果超过,则在数据库中修改订单状态为已取消;如果未超过,则记录当前消息的offset,并暂停消费后续消息。等待1分钟后,再次从Kafka拉取该offset及之后的消息,继续判断。Kafka本身不支持延时队列,但通过这种方式可以实现类似功能。

IT之一小佬的博客 620

从零实现Kafka延迟队列:Spring Boot整合实践与原理剖析

原生支持:无需额外中间件线性扩展:通过增加分区提升吞吐量精准控制:基于时间戳的毫秒级延时。

xiaoyu❅的博客 2194

4.2.8 Kafka 延时队列, 重试队列(结合redis实现)

4.2.8 Kafka 高级特性-延时/重试队列

chengh1993的博客 2587
上一篇: 干货 | Flutter 地图在携程的最佳实践
下一篇: 干货 | 携程火车票短信召回算法优化实践
携程技术
博客等级 码龄10年 3716粉丝 324原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值