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

横幅
假设我有一个只需要 100 个计时器的系统,并且计时器的持续时间始终小于 5 秒。我可能会选择睡眠解决方案。但是如果需求发生变化,持续时间可以在几小时之间,并且计时器的数量增加到 100K。现在如何解决定时器的健壮性和一致性?
在本教程中,我们将介绍如何使用 MessageQueue 实现一个简单的分布式计时器,我们将使用 ActiveMQ,可以使用 RabbitMQ 设计相同的解决方案(带有延迟交换插件)
我们的系统将有 3 个组件:
生产者: 生产者将提供两个组件 REST API 来接受计时器和 MessageQueue 生产者,后者将以定义的延迟将消息写入队列。
**消息队列(ActiveMQ):**我们将使用带有 stomp 协议的 ActiveMQ。我们将使用本地 docker 安装,但如果我们想使用 AWS MQ 等云托管服务,我们也可以使用它。
**消费者:**消费者将在队列中可用时读取消息,并向请求中先前提供的端点发送 HTTP 调用,如果需要,我们可以发送元数据和所有其他类型的信息。
调度由 MessageQueue 处理
让我们以 15 秒计时器为例来了解其功能。

15 秒计时器
- 要初始化计时器,我们必须执行带有参数计时器持续时间和回调 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/)