在微服务和分布式系统时代,我们有很多复杂的架构和强大的解决方案来解决大多数问题。但是如果我们想在系统中实现定时器,我们仍然倾向于在线程中使用 sleep(),这完全是低效且耗费资源的。

横幅

假设我有一个只需要 100 个计时器的系统,并且计时器的持续时间始终小于 5 秒。我可能会选择睡眠解决方案。但是如果需求发生变化,持续时间可以在几小时之间,并且计时器的数量增加到 100K。现在如何解决定时器的健壮性和一致性?

在本教程中,我们将介绍如何使用 MessageQueue 实现一个简单的分布式计时器,我们将使用 ActiveMQ,可以使用 RabbitMQ 设计相同的解决方案(带有延迟交换插件)

我们的系统将有 3 个组件:

生产者: 生产者将提供两个组件 REST API 来接受计时器和 MessageQueue 生产者,后者将以定义的延迟将消息写入队列。

**消息队列(ActiveMQ):**我们将使用带有 stomp 协议的 ActiveMQ。我们将使用本地 docker 安装,但如果我们想使用 AWS MQ 等云托管服务,我们也可以使用它。

**消费者:**消费者将在队列中可用时读取消息,并向请求中先前提供的端点发送 HTTP 调用,如果需要,我们可以发送元数据和所有其他类型的信息。

调度由 MessageQueue 处理

让我们以 15 秒计时器为例来了解其功能。

15 秒计时器

  1. 要初始化计时器,我们必须执行带有参数计时器持续时间和回调 URL 的 StartTimer API(HTTP/GRPC),我们希望在其中接收计时器已过期的通知。

API:POST /v1/startTimer

有效载荷:

{

“持续时间”:15,

"回调_url":"xyz.com",

“回调_方法”:“POST”

}

回复:

{

“消息”:“成功”,

“计时器_id”:“5af7f69b-2224-4c5f-8f2c-cf17804fdf65”

}

AMQ_SCHEDULED_DELAY=15000
time.Now()+15secs

4\。消费者将读取消息并向 URL 发送回调。

分布式计时器的最终 HLD 如下所示:

HLD

在下一篇文章中,我们将使用 Golang 和 Active MQ 从头开始构建这个分布式计时器。

参考:

跺脚

stomp 包提供了允许与支持 STOMP 协议的消息代理进行通信的操作......

pkg.go.dev

[

Go 编程语言

Go 是一种开源编程语言,可以轻松构建简单、可靠和高效的软件。

去开发

](https://go.dev/)

[

ActiveMQ

编辑说明

activemq.apache.org

](https://activemq.apache.org/)