用户连通性:投入生产两年 — 经验教训与新模式

发布: (2025年12月24日 GMT+8 14:23)
4 分钟阅读
原文: Dev.to

Source: Dev.to

引言

这是我之前关于 用户连通性:在线和离线用户状态的实时 Web 解决方案 的文章的后续。自从我首次将用户连通性解决方案部署到生产环境,已经快两年了。最初的实验已经成为我架构的基石。

最近,我遇到了由多个 API 进程引起的复杂数据库死锁问题。经过分析,我发现可以利用我的事件驱动架构来解决。通过将特定任务拆分并异步处理,我彻底消除了死锁。

事件分发器 的目标很简单:一个监听 Redis 过期事件且仅此而已的中心服务。

事件分发器的优势

  • 可追踪性 – 所有事件都经过同一点,便于追踪问题。
  • 日志记录 – 每个接收到的事件都会记录到 Azure Cosmos DB 并标记其状态。
  • 可伸缩性 – 工作函数可以根据队列深度独立扩展。
  • 可靠性 – 单一、受良好监控的监听器降低了漏掉事件的风险。

在运行该架构两年后,我对使用 Azure 服务实现类似方案的人员有两点关键观察。

关键观察

1. 为 Redis 监听器使用 Premium 计划

为什么?
Consumption 计划存在冷启动延迟和连接寿命限制。当 Function App 处于空闲状态时,它可能会进入休眠,从而错过 Redis 的事件。使用 Premium 计划时,Function App 始终保持在线,拥有长连接——没有冷启动,也不会错过事件。自从迁移到 Premium 后,我没有看到过任何丢失的事件。

你可能会问:原来的用户连通性方案是如何在 Consumption 计划上工作的?
它能够运行,但错过事件的风险更高。

2. Azure 托管 Redis 的限制

有一个重要限制:Azure 托管的 Redis 服务器无法完整配置以可靠地发送过期事件。当底层服务器重启或循环时,它们会丢失配置,进而停止发送过期事件。

我已向微软报告了此问题。他们确认已列入待办事项,但截至目前仍没有解决方案。如果你的架构依赖 Redis 键的过期事件,请在迁移到 Azure 托管 Redis 之前注意此限制。

收获

  • 为 Redis 监听器使用 Premium 计划,以避免冷启动和事件丢失。
  • 如果依赖过期事件,请对 Azure 托管 Redis 持谨慎态度,因为服务器重启时配置可能会丢失。

希望这些经验能帮助其他人更好地利用此架构。

Back to Blog

相关文章

阅读更多 »

分布式系统中的双写问题

概述:双写问题发生在单个逻辑操作必须更新两个或多个独立系统时——例如,将数据持久化到数据库并发布…

从领域事件到Webhooks

领域事件实现以下接口: ```php interface DomainEvent { public function aggregateRootId: string; public function displayReference: st... } ```