Saas系统多任务分发排队

需要考虑的技术点

监控

任务处理监控(待处理数量,耗时统计),可视化

  • mq看板查看mq中间件消息堆积情况
  • 线程池工作任务处理监控,排队中待处理的任务,拥堵情况
  • jvm、cpu、内存等的负载监控
  • mysql慢sql、长事务

优先级排队处理机制

可以动态插队吗

  • 这里可以根据用户等级拆分不同主题的队列,如免费版的topic和vip版的topic,里面调度逻辑一模一样,只不过对应不同的消费者,发送使用的账号可能也不同
  • 如果业务量确实超过1个账号的发送上限,考虑维护多个发送账号

限流机制

  • 目前消息从mq到消费端多是推模式,控制消费端并发的线程数(如果是拉模式的,消费端控制消息拉取的速率)
  • 对接第三方网络请求加令牌桶算法限流避免超过对方阈值

幂等

避免同个用户重复发送

  • 商品刊登一条发布记录对应一个商品的,可以用发布记录ID+状态做幂等校验,在mq消费端消费一条消息的时候,可以根据发布记录ID加锁,避免同时有多个线程在消费同一条消息
  • 像EDM这种单个广告量比较大,需要拆批的,可以根据广告ID+批次ID加分布式锁处理,幂等也是

网络请求优化

第三方对接网络请求的优化

  • 请求合并,数据包压缩,网络模型
  • 这里最佳实践是不要把网络请求放在事务里,容易造成长事务影响其他服务的数据库读写性能

数据存储与架构

发布任务比较多,存储的问题

  • 业务参数数据加密压缩
  • 业务校验或第三方返回的失败原因存储
  • 分库分表(单表转分库分表,或分库分表扩容,怎么迁移数据)或分布式数据库
  • 敏感数据,如手机号、邮箱等的加密
  • mq本身,集群模式,分区分片,消息堆积能力要强
  • mq多节点消费

插队

基础方案

缓存存储任务优先级(用户维度或任务维度),定时任务根据缓存元数据(获取优先处理的任务)扫描表,组装消息到mq中间件

人工线下处理

非常规操作,如果客户催得急。通过message-key搜索出队列消息拿到mq的body信息,手工发送消息到队列头部,后面消费到相同的幂等处理就好。

待续

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 13:12:06       91 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 13:12:06       97 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 13:12:06       78 阅读
  4. Python语言-面向对象

    2024-04-22 13:12:06       88 阅读

热门阅读

  1. Windows上构建 Chisel-Bootcamp

    2024-04-22 13:12:06       42 阅读
  2. 低配置的电脑上刷新WPF DataGrid 很卡,如何优化?

    2024-04-22 13:12:06       35 阅读
  3. /sys/class/dmi/id/目录文件详解,查看系统硬件信息

    2024-04-22 13:12:06       59 阅读
  4. .NET/C#汇总 —— WPF

    2024-04-22 13:12:06       32 阅读
  5. 【Terraform实战】如何从头自动起一个nginx实例

    2024-04-22 13:12:06       37 阅读