当前位置: 首页 > ops >正文

后端定时过期方案选型

最近有个需求:让智能机器人在用户 1 hour 内无活跃消息后,自动关闭当前用户会话,避免无效的上下文对用户的下次提问造成干扰。这里只涉及到后端强制过期清空上下文,前端是否需要有变化/通知基于业务场景去设计就好。我主要是想到了如下三种方案并分析了一下它们的优劣。

定时任务扫表更新状态

分析

创建一个定时任务,每个小时跑一次,每次游标分批捞出会话表中 50 条活跃的会话,check一下该会话关联的 最新消息是否在 1 hour 内,没有的话就把会话状态设置为失效。

优点

  • 每小时执行,天然具有重试逻辑,并且每次执行会过滤掉已经失效的会话
  • 异步执行,在原代码中不存在耦合逻辑,改造量小

缺点

  • 会加重数据库读负担,但是在主从分离的场景下,优先读从库,并且考虑到当前场景的新增会话体量较小,系统负载可接受
  • 需要控制分布式场景下单实例执行,考虑当前公司有比较成熟的分布式任务框架,市面上也有类似 Quartz 这种分布式任务框架,可以直接使用
  • 会话过期逻辑相对复杂,需要保证编码质量,考虑分批游标的方式减轻内存/CPU压力

Redis key 过期事件监听

分析

新创建会话时设置一个 key = conversationId 的 redis key,expiration time = 1hour,每次有会话关联的消息更新/新增时需要重置其关联的会话 redis key 的 expiration time = 1 hour

优点

  • 没有很重地会话失效逻辑,收到 key 过期事件就将对应的会话失效
  • 不会加重数据库负担

缺点

  • 代码中需要在 insert 会话、create/update 消息处耦合 redis 逻辑,改造量大
  • 频繁更新 redis 性能较差
  • Redis 过期事件是在服务器删除 key 时发出的,不是 key 过期就会直接发出;Redis 惰性删除 + 过期删除的机制会导致时效性差,删除 key 的时机不一定是 key 过期的时机
  • 过期事件监听丢失无法重试

RocketMQ 延迟消息推送

分析

新创建会话时延迟 1 hour 发送一条消息,消费者 1hour 后收到消息会校验该会话的状态,每次有会话关联的消息更新/新增时需要再发送一条其关联的会话的相同延迟消息

优点

  • 消息有重试机制,稳定性较高
  • 不会加重数据库负担

缺点

  • 代码中需要在 insert 会话、create/update 消息处耦合 MQ 逻辑,改造量大
  • 每次 insert 会话、create/update 消息都需要发送 MQ,消息冗余
  • 接收到消息的会话过期逻辑比较复杂,需要校验状态,也需要做消息幂等处理
  • 会有许多和最终关闭会话无关的消息发送出来

最终选型

最终选型为 定时任务扫表更新状态
因为其天然具有重试逻辑,并且不会在原有代码中耦合逻辑,改造成本比较小,此外还没有过多无效消息被发出来。

http://www.xdnf.cn/news/15170.html

相关文章:

  • Linux/Ubuntu安装go
  • ​Windows API 介绍及核心函数分类表
  • MySQL 5.7.29升5.7.42实战:等保三漏洞修复+主从同步避坑指南
  • 一分钟快速了解Apache
  • Ether and Wei
  • 【android bluetooth 协议分析 07】【SDP详解 2】【SDP 初始化】
  • 详解缓存淘汰策略:LRU
  • python数据分析及可视化课程介绍(01)以及统计学的应用、介绍、分类、基本概念及描述性统计
  • 闲庭信步使用图像验证平台加速FPGA的开发:第十一课——图像均值滤波的FPGA实现
  • 闲庭信步使用图像验证平台加速FPGA的开发:第十课——图像gamma矫正的FPGA实现
  • C++11的整理笔记
  • 【LeetCode 热题 100】25. K 个一组翻转链表——迭代+哨兵
  • 【YOLOv8-obb部署至RK3588】模型训练→转换RKNN→开发板部署
  • Jenkins+Gitee+Docker容器化部署
  • super task 事件驱动框架
  • 用AI做带货视频评论分析【Datawhale AI 夏令营】
  • 冒泡排序和快速排序
  • 「Linux命令基础」文本模式系统关闭与重启
  • 【C/C++】动态内存分配:从 C++98 裸指针到现代策略
  • Linux操作系统之进程间通信:命名管道
  • 飞算JavaAI:给Java开发装上“智能引擎”的超级助手
  • vue入门学习教程
  • 车载诊断进阶篇 --- 关于网关转发性能引起的思考
  • 匿名函数作递归函数引用
  • uniapp制作一个视频播放页面
  • C++11中的std::minmax与std::minmax_element:原理解析与实战
  • WIFI协议全解析06:Beacon帧、Probe帧你必须懂,搞WiFi通信绕不开它们
  • 【理念●体系】Windows AI 开发环境搭建实录:六层架构的逐步实现与路径治理指南
  • SEQUENCE在RAC多实例开启CACHE的NEXTVAL数值乱序问题
  • 从代码学习深度强化学习 - PPO PyTorch版