如何为事件驱动的微服务实现“去抖动”?

Posted

技术标签:

【中文标题】如何为事件驱动的微服务实现“去抖动”?【英文标题】:How to implement "debouncing" for event-driven microservices? 【发布时间】:2021-03-07 02:30:46 【问题描述】:

我在 Azure 上的 Kubernetes 集群中运行了 2 个微服务。当项目更新时,“项目”微服务会向 Kafka 发送一个事件。 “分析”-微服务消费事件,进行一些昂贵的计算,最后发送一封包含结果的电子邮件。

为了避免向接收者发送垃圾邮件,我想实现某种去抖动模式,以便仅在收到最后一个更新事件后一个小时后才进行计算。由于“分析”-微服务大部分时间都是空闲的,冷启动也不成问题,如果资源在不活动时不保留,那将是有利的。

在使用 Kafka 时如何实现去抖动场景?我曾想过引入一个资源密集度较低的微服务,其唯一目的是在内部时钟到期后触发“分析”微服务。这是一个明智的解决方案吗?我很感激以前处理过类似问题的人的意见。

【问题讨论】:

为什么你只每小时处理一次它们,这个事件是如何驱动的?如果这是一项要求,为什么不直接实现一个 GET 端点并每小时轮询一次呢? 用户通过 REST 端点更新项目。 “Project”微服务向 Kafka 主题发送“ProjectUpdated”事件。 “分析”-微服务会监听它。它是事件驱动的,因为生产者和消费者彼此不认识。由于事件是由用户行为发起的,因此它们通常间隔很短。我想避免执行昂贵的分析计算并为每个事件发送一封电子邮件。如果在一个时间范围内完成一次就足够了。定期调用的 GET 端点会发现处于中间状态的项目。 【参考方案1】:

您是否考虑过 Temporal 的耐用计时器。见这里:https://docs.temporal.io/docs/workflows/

您还可以考虑将 Temporal 与 Spiderwiz 结合使用以简化您的整个工作流程。

【讨论】:

以上是关于如何为事件驱动的微服务实现“去抖动”?的主要内容,如果未能解决你的问题,请参考以下文章

微服务实践:微服务的事件驱动数据管理

微服务实践:微服务的事件驱动数据管理

微服务实战:选择微服务部署策略

如何使用“onEvent”为事件实现去抖动器?

Chris Richardson微服务实战系列

微服务实践:从单体式架构迁移到微服务架构