算法mq 交互通用校验模块设计

背景

当前与算法交互均通过rocketMQ异步交互,绝大部分场景一条请求mq消息应对应一条返回mq,但由于各种原因(消息积压、程序bug),可能会导致返回mq超时未返回或者消息丢失。工程侧针对一些重要场景 case by case的通过定时任务不断检查返回mq的状态,并在一定时间后手动触发告警提醒返回mq出现问题。该方案也能够一定程度的解决问题,但存在一些弊端:

  • 需要case by case的开发,开发成本高
  • 容易遗漏
  • 手动触发告警容易导致告警过多,产生疲劳,真正的问题被隐藏在大量的告警中。
    因此这里介绍一种通用方案,预期能够解决以上问题。

现有方案

在这里插入图片描述

主要问题

  • 如何唯一标识请求mq对应的返回mq
    • 目前的方案是根据场景的不同,选择不同的业务字段,如resourceId
    • 方案一:统一约定公共字段,如bizMsgId,所有与算法交互请求和返回mq均带有该字段
      • 优点:能够实现唯一标识的目标
      • 缺点:工程、XX、算法均需要改造,成本较高
    • 方案二(推荐):通过traceId串联请求和返回mq,即返回mq将请求mq带下去的traceId带回来。
      • 优点:
        • 有很多现成的框架可以集成,对java工程来说开发成本低
        • 集成了traceId之后无论是工程还是算法都可以用来做全链路追踪,方面问题的排查。
      • 待确认点
        • 算法rocketMq以何种方式向下传递 traceId
  • 如何进行状态检查
    • 后端维护一张通用的任务表,在发送请求mq和收到算法返回mq时进行拦截,发送时向表中增加一条数据,更新状态为已发送,待返回。
    • 收到算法返回mq时更新对应行的状态
    • 定时任务,捞取30分钟(待定)前未返回的消息详情,并埋点
  • 告警如何触发
    • 通过SLS配置定时检查任务,按照告警规则配置进行告警分组(解决同一类型告警重复报多次的问题)、告警分级(解决大量告警淹没重要告警的问题)通知告警处理人
      • 一分钟内,<5条 飞书群提醒
      • 5条 短信提醒

      • 10条 短信、电话提醒

  • 告警升级策略
    • 10分钟不认领,短信、电话提醒TL
    • 30分钟未处理升级。
  • 算法 纳入全链路监控

技术方案

在这里插入图片描述

数据模型

在这里插入图片描述

其他

  • 有些场景是通过dubbo发起请求,通过mq返回结果,需要梳理场景
  • 有些场景是发送请求给搜推mq,但返回mq是由算法发送,待梳理

参考

  • rocketmq发送、接收拦截器
    • 生产者发送拦截
public class TraceProducerInterceptor implements ProducerInterceptor {private static final String TRACE_ID = "traceId";private static final String SPAN_ID = "spanId";@Overridepublic Message<?> beforeConvert(Message<?> message) {String traceId = TraceContext.getTraceId();String spanId = TraceContext.getSpanId();if (traceId != null && spanId != null) {MessageHeaders headers = message.getHeaders();headers.put(TRACE_ID, traceId);headers.put(SPAN_ID, spanId);if (message instanceof ErrorMessage) {ErrorMessage errorMessage = (ErrorMessage) message;Message<?> originalMessage = errorMessage.getOriginalMessage();if (originalMessage != null) {originalMessage = beforeConvert(originalMessage);errorMessage = new ErrorMessage(errorMessage.getPayload(), originalMessage, errorMessage.getHeaders(), errorMessage.getCause());}return errorMessage;}}return message;}
}
  • 消费者消费拦截
public class TraceConsumerInterceptor implements ConsumerInterceptor {private static final String TRACE_ID = "traceId";private static final String SPAN_ID = "spanId";@Overridepublic void afterReceive(Message<?> message) {String traceId = message.getHeaders().get(TRACE_ID, String.class);String spanId = message.getHeaders().get(SPAN_ID, String.class);if (traceId != null && spanId != null) {MDC.put(TRACE_ID, traceId);MDC.put(SPAN_ID, spanId);}}
}
  • 配置拦截器
rocketmq:producer:interceptor:- com.example.TraceProducerInterceptorconsumer:interceptor:- com.example.TraceConsumerInterceptor
  • rocketmq集成opentelemetry trace
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/868128.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySql数据库常用指令合集

MySql数据库常用指令合集 一、创建数据库db11.创建表 字段---表头 student_no,username,sex2.新增单条插入多条插入3.删除4.更新5.查询5.1.查询该表全部信息5.2.查询该表中username&#xff0c;并且要求名字为zhangsan性别女&#xff0c;还可以用&#xff08;or&#xff09; 6.…

卷积神经网络有哪些应用场景

卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff09;的应用场景非常广泛&#xff0c;尤其是在处理具有网格结构的数据&#xff08;如图像、视频&#xff09;时表现出色。以下是一些主要的应用场景&#xff1a; 1. 图像识别与分类 图像分类…

基础权限存储

一丶要求 建立用户组shengcan&#xff0c;其id为 2000建立用户组 caiwu&#xff0c;其id 为2001建立用户组 jishu&#xff0c;其id 为 2002建立目录/sc,此目录是 shengchan 部门的存储目录&#xff0c;只能被 shengchan 组的成员操作4.其他用户没有任何权限建立目录/cw,此目录…

GIT 使用相关技巧记录

目录 1、commit 用户信息变更 全局用户信息&#xff08;没有特殊配置的情况下默认直接用全局信息&#xff09; 特定仓库用户信息&#xff08;只针对于当前项目&#xff09; 方法一&#xff1a;修改config文件 方法二&#xff1a;命令方式 2、idea同一代码推向多个远端仓库…

Ubuntu编译 OSG

目录 一、安装步骤 二、配置 1、数据文件配置 2、OSG环境变量配置 一、安装步骤 在Ubuntu上安装OSG(OpenSceneGraph),你可以按照以下步骤操作: 打开终端,更新你的包管理器的包列表: sudo apt update 安装必要的依赖库 sudo apt install libglu1-mesa-dev freeglu…

Java -- 实现MD5加密/加盐

目录 1. 加密的引出2. MD5介绍3. 解决MD5不可解密方法4. 实现加密解密4.1 加密4.2 验证密码 1. 加密的引出 在MySQL数据库中&#xff0c;一般都需要把密码、身份证、电话号码等信息进行加密&#xff0c;以确保数据的安全性。如果使用明文来存储&#xff0c;当数据库被入侵的时…

8.做pwn题的大致流程

file <文件名> 判断是32还是64位&#xff0c;用对应工具分析&#xff08;比如ida&#xff0c;可以直接把文件拖到对应图标上&#xff09; ida中如果没找到main函数就找start函数从而找到main函数起始地址 两种分析方式&#xff1a; 静态分析ida 动态分析gdb 如果发现…

第七篇——攻谋篇:兵法第一原则——兵力原则,以多胜少

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 微观层面上&#xff0c;也有很多值得深度思考的问题 二、思路&方案 …

CV- 人工智能-深度学习基础知识

一, 深度学习基础知识 1,什么是深度学习?机器学习是实现人工智能的一种途径,深度学习是机器学习的一个子集,也就是说深度学习是实现机器学习的一种方法。2, 传统机器学习算术依赖人工设计特征,并进行特征提取,而深度学习方法不需要人工,而是依赖算法自动提取特征。深度…

一个SQL查询出表结构

select table_schema as “数据库”, table_name as “表名”, table_rows as “记录数”, truncate(data_length / 1024 / 1024,2) as “数据容量(MB)”, truncate(index_length / 1024 / 1024, 2) as “索引容量” from information_schema.tables where table_schema ‘数据…

MuLan:模仿人类画家的多对象图像生成

在图像生成领域&#xff0c;处理包含多个对象及其空间关系、相对大小、重叠和属性绑定的复杂提示时&#xff0c;现有的文本到图像模型仍面临挑战&#xff1a;当文本提示中包含多个对象&#xff0c;并且这些对象之间存在特定的空间关系时&#xff0c;现有模型往往难以准确地捕捉…

6.pwn Linux保护机制

保护机制 CANARY NX ASLR PIE RELRO 回顾 栈的作用为存储函数调用相关信息以及函数的局部变量 这些局部变量通常为数组或者输入的缓冲区(buf)。 而函数调用相关的信息&#xff0c;主要是返回地址和栈底指针(rbp) CANARY 看到程序里readfsqword&#xff08;0x28u&…

Spring 框架的基础知识

Spring 框架是由于软件开发的复杂性而创建的&#xff0c;Spring 使用的是基本的 JavaBean 来完成以前只可能由 EJB 完成的事。从简单性、可测性和松耦合性角度而言&#xff0c;绝大部分Java 应用都可以用 Spring。 1、控制反转&#xff08;Inversion of Control, IOC&#xff0…

差分进化算法

一、简介 差分进化&#xff08;DE&#xff09;是一种算法&#xff0c;通过创建一些随机个体&#xff0c;将它们与预定义的评估指标进行比较&#xff0c;并保留最好的个体&#xff0c;然后通过混合剩余个体的特征来创建新的个体&#xff0c;并重复这个过程来解决全局优化问题。…

嵌入式c语言4——类型修饰符

register&#xff0c;将变量保存在寄存器中&#xff0c;使得访问速度增加 const是常量&#xff0c;static是静态量&#xff0c;volatile是

从0-1实现一个前端脚手架

https://gitee.com/childe-jia/kfc-cli.git gitee完整地址 介绍 为什么需要脚手架&#xff1f; 脚手架本质就是一个工具&#xff0c;作用是能够让使用者专注于写代码&#xff0c;它可以让我们只用一个命令就生成一个已经配置好的项目&#xff0c;而不用我们再花时间去配置和安…

zabbix 与 grafana 对接

一.安装 grafana 1.初始化操作 初始化操作 systemctl disable --now firewalld setenforce 0 vim /etc/selinux/config SELINUXdisabled 2.上传数据包并安装 cd /opt grafana-enterprise-9.4.7-1.x86_64.rpm #上传软件包 yum localinstall -y grafana-enterprise-9.4.7-1…

Faster R-CNN 和 YOLO 对比

Faster R-CNN 和 YOLO 是两种常用的目标检测算法&#xff0c;它们在结构、性能和适用场景上有显著的区别。以下是两者的详细对比&#xff0c;包括各自的优缺点&#xff1a; Faster R-CNN 结构和原理&#xff1a; 两阶段检测器&#xff1a;Faster R-CNN 先通过区域提议网络&a…

Javascript常见数据结构和设计模式

在JavaScript中&#xff0c;常见的数据结构包括两大类&#xff1a;原始数据类型&#xff08;Primitive Types&#xff09;和对象类型&#xff08;Object Types&#xff09;。对象类型又可以进一步细分为多种内置对象、数组、函数等。下面是一些JavaScript中常见的数据结构&…

Nginx 虚拟主机和反向代理 (同一个ip多个二级域名配置不同的前端服务)

把多个二级域名映射到不同的文件目录&#xff0c;例如 bbs.abc.com&#xff0c;映射到 html/bbs blog.abc.com 映射到 html/blog http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 80…