一种通用的业务监控触发方案设计 | 京东云技术团队

news2024/10/6 14:26:24

一、背景

业务监控是指通过技术手段监控业务代码执行的最终结果或者状态是否符合预期,实现业务监控主要分成两步:一、在业务系统中选择节点发送消息触发业务监控;二、系统在接收到mq消息或者定时任务调度时,根据消息中或者任务中的业务数据查询业务执行的结果或状态并与业务预期的结果相对比。目前供销系统的方案如下:

由业务系统发送消息触发规则中心的校验任务,校验逻辑和报警规则通过规则中心的groovy脚本代码实现,该方案的缺点如下:
1.业务监控代码掺杂在正常的业务代码中,业务监控的代码侵入性高;
2.业务监控消息触发代码可复用性极低,各个应用都要维护一套代码,后期若要增加或维护某个功能时成本大;
3.增加业务监控的开发工作量,开发人员需要开发和维护与业务监控功能无关的代码,如:消息触发降级功能、性能监控、异步触发等功能;
为解决上述问题,本文提出了一种通用的业务监控触发方案。

二、方案介绍

  1. 通用mq消息体:
public class BusinessCheckMessage {
    /**
     * 监控类型
     */
    private String businessType;
    /**
     * 业务监控需要的参数
     */
    private Object data;
    /**
     * 业务方
     */
    private String businessSource;
    /**
     * 当前所属的topic
     */
    private String topic;
}

其中,
businessType用于区分业务监控的类型,如:终止合作、提单等;
data用于存储和业务相关的关键数据,如订单id、商家id等;
businessSource用于区分不同业务方的业务,如:万商的提单、供销的提单等;
topic用于隔离消息,如:业务监控任务执行快的可以用主题A、执行慢的的可以用主题B等;

2.自定义注解 + 切面
以供销系统业务监控为例,接近50%的场景是将方法体中的参数作为业务数据来触发业务监控,针对此场景,本文采用注解+切面解耦业务监控代码和正常业务代码,降低业务监控代码对正常的业务代码的侵入,其中自定义注解负责获取业务监控需要用到的方法入参中的相关数据,切面负责组装通用mq数据模型并完成消息的发送。自定义注解定义如下:

public @interface BusinessCheckPoint {
    /**     
     * 业务监控类型     
     */    
   String businessType();    
   /**     
    * 业务方     
    */    
   String businessSource();    
   /**     
    * 要发送的消息的topic     
    */    
   String businessTopic();    
   /**     
    * 方法参数的第几个参数作为消息内容,从0开始     
   */    
   int dataIndex();    
   /**     
    * 在执行业务流程前发送消息     
    * 默认在业务流程执行后发送消息     
    */    
   boolean beforeOperate() default false;
}

其中,
businesstype用于获取业务监控类型;
businessSource用于获取业务方;
businessTopic用于获取当前要发送的消息主体;
dataIndex用于获取方法体参数中的数据,从0开始;
beforeOperate用于获取消息发送的时间,在业务流程执行后发送消息还是业务流程执行前发消息;

3.侵入式触发业务监控
考虑到业务系统可能会在复杂场景下触发业务监控,本文也提供了通用的解决方案,具体如何使用见下一章节的实战介绍。

三、实战介绍

1.引入依赖

<dependency>    
    <groupId>com.jd</groupId>    
    <artifactId>business.check</artifactId>   
    <version>1.0.0</version>
</dependency>

2.初始化切面

<bean id="businessCheckAspect" class="com.jd.gmall.monitor.aspect.BusinessCheckAspect"/>

3.Producer及线程池赋值

<bean id="businessCheckHandler" class="com.jd.gmall.monitor.service.impl.BusinessCheckHandlerImpl">    
    <property name="messageProducerMap">        
        <map>            
            <entry key="gx_bussiness_check" value-ref="businessCheckProducer" />        
        </map>    
    </property>    
    <property name="commonExecutor" ref="asyncTaskThreadPoolTaskExecutor"/>
</bean>

其中,
messageProducerMap类型为Map<String, Producer>,用于指定topic对应的Producer;
commonExecutor用于指定异步发送消息时用到的线程池(建议自行创建线程池);

4.业务监控消息发送
场景一:
简单场景下可使用自定义注解来发送消息,如下所示

业务监控类型 = “100”
消息主题 = “gx_bussiness_check”
业务方 = “ws”
消息体中的业务数据data = req

场景二:
复杂场景下,可在服务中注入sdk中的消息发送服务,如下所示

场景二与场景一发送的消息内容一致。

5.业务监控降级不发送消息
sdk中的类BusinessCheckHandlerImpl中定义了控制降级的方法:

public static void setBusinessCheckSwitch(boolean businessCheckSwitch) {            
    BusinessCheckHandlerImpl.businessCheckSwitch = businessCheckSwitch;
}

此处给出了通过ducc控制降级的方法:

@LafValue("business.check.switch")
public void setBusinessCheckSwitch(boolean switch) {   
  BusinessCheckHandlerImpl.setBusinessCheckSwitch(b);
}

switch:true,开启消息发送;false,降级

作者:京东零售 胡飞

内容来源:京东云开发者社区

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

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

相关文章

【Python Matplotlib】零基础也能轻松掌握的学习路线与参考资料

Python Matplotlib是一个流行的数据可视化工具&#xff0c;可以帮助数据科学家和分析师更好地理解数据。本文将介绍Python Matplotlib的学习路线&#xff0c;参考资料和优秀实践。 文章目录 一、Python Matplotlib的学习路线二、Python Matplotlib参考资料三、Python Matplotl…

ChatGPT的使用体验及教程

ChatGPT对社会带来了什么影响&#xff1f; ChatGPT的出现对社会产生了广泛的影响&#xff0c;主要体现在以下几个方面&#xff1a; ① 提升了人工智能领域的发展水平&#xff1a;ChatGPT在最初发布时获得了广泛的关注&#xff0c;并受到了人工智能领域专家和研究者的高度评价。…

OpenGL实战-调试

glGetError() OpenGL文档&#xff0c;可以查询函数出现的错误的对应原因。  默认情况下glGetError只会打印错误数字&#xff0c;如果你不去记忆的话会非常难以理解。通常我们会写一个助手函数来简便地打印出错误字符串以及错误检测函数调用的位置。 GLenum glCheckError_(co…

SpringBoot——RESTful风格以及如何快速发送不同方式的请求

RESTful风格&#xff1a; 简单来说&#xff0c;RESTful就是一种将请求方式融合到路径中的一种请求路径书写风格&#xff0c;注意这里是风格&#xff0c;不是规定&#xff0c;我们也可以不使用他或者不是非常严格的按照他规定的样式来写&#xff0c;但是由于行业中大多数的人在…

Boost电路的参数设计

本文以实例方式介绍Boost电路的参数设计方法。项目需求&#xff1a;12V升压至50V&#xff0c;功率35W。 先看示例电路图&#xff0c;如下图所示。 在进行具体的参数计算之前&#xff0c;我们先简要的分析一下Boost电路的工作原理。 1、我们假设&#xff0c;C3和C4的容值相对于负…

发挥数据潜能,为在金融服务行业进行创新做好准备

发挥数据潜能&#xff0c;为在金融服务行业进行创新做好准备 为何选择 NetApp 的金融服务&#xff1f; 作为云专家&#xff0c;我们将确保始终适时适地提供财务数据&#xff0c;以推动转型。我们将消除数据孤岛&#xff0c;提供实时的市场就绪分析&#xff0c;借助经验证的 AI…

易基因:多组学关联分析及组学分子实验验证方法(表观组+转录组+微生物组)|干货系列

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 生物过程具有复杂性和整体性&#xff0c;单组学数据难以系统全面解析复杂生理过程的分子调控机制。而多组学&#xff08;Multi-omics&#xff09;联合分析可同时实现从“因”和“果”两个…

Cartographer源码阅读---后端优化思路

Cartographer的后端优化是借用SPA&#xff08;Sparse Pose Adjustment&#xff09;优化算法的思想. 其主要步骤如下: 确定两个节点在global坐标系下的相对位姿变换.通过其它方式再次获取这两个节点的相对位姿变化对这两个相对位姿变换的差的最小二乘问题进行求解进行求解后得到…

nifi DBCPconnectpool 连接oracle 死链接

nifi DBCPconnectpool 连接oracle 死链接 问题展示问题解决后言官网中文网Groovy脚本学习 问题展示 原因&#xff0c;nifi 连接oracle因为网络波动出现死链接&#xff0c;我的数据同步停止于前一天晚上一点半左右&#xff0c;因为最近一致出现这个问题&#xff0c;综合判断之下…

SAP HUM 嵌套HU初探 II (TCODE:POP1, POF1,HU03) <转载>

SAP HUM 嵌套HU初探 II 这里以物料号ZFG0003为例&#xff0c;做一个阐述。 1&#xff0c;维护好包装指令主数据&#xff08;POP1/POP2/POP3&#xff09; 包装指令ZFG0003A 包装指令ZFG0003B 然后维护好PI 确定记录主数据&#xff08;POF1/POF2/POF3&#xff09; 2, COR1/…

老域名挖掘方法-网站老域名批量查询

老域名挖掘方法 老域名对于SEO优化非常重要&#xff0c;可以提高网站的排名和曝光度。因此&#xff0c;很多SEO从业者会使用专门的老域名挖掘工具来挖掘高质量的老域名。以下介绍一种常用且有效的老域名挖掘方法&#xff0c;以及推荐一款优秀的老域名挖掘工具——147SEO老域名…

饿了么在即时零售的胜算

平台商家越多&#xff0c;消费者的选择就会越多&#xff0c;然后就会吸引更多的消费者来消费。与此同时&#xff0c;平台商家越多&#xff0c;平台订单量就会越多&#xff0c;相应的骑手的订单配送响应时效就越快&#xff0c;然后还会吸引更多的商家入驻。如此循环&#xff0c;…

Rust每日一练(leetDay0001) 两数之和、两数相加、最长子串

目录 1. 两数之和 Two Sum &#x1f31f; 2. 两数相加 Add Two Numbers &#x1f31f;&#x1f31f; 3. 无重复字符的最长子串 Longest substring without repeating characters &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练…

如何在Windows11下开启IE浏览器

在Windows11下开启IE浏览器 Microsoft 发布 Windows 11 之后&#xff0c;系统使用基于 Chromium 内核的 Edge 浏览器来代替被人唾骂已久的 IE 浏览器&#xff0c;IE 浏览器入口也已经被屏蔽掉了。通过任何常规方式打开 IE 浏览器都会自动使用 Edge 浏览器打开。 最新消息&…

语音与语言处理技术交流会(深圳)

嘉宾介绍 嘉宾介绍&#xff1a;罗艺&#xff0c;2021年在美国哥伦比亚大学获得博士学位后加入腾讯AI Lab Shenzhen任高级研究员&#xff0c;研究方向主要为音频前端处理&#xff0c;包括但不限于音频分离、单/多通道语音增强等。 报告题目&#xff1a;腾讯AI Lab音频与语音前端…

网站备案:阿里云ICP备案服务码是什么?申请流程来了

阿里云备案服务码是什么&#xff1f;ICP备案服务码怎么获取&#xff1f;阿里云备案服务码分为免费和付费两种&#xff0c;申请备案服务码是有限制条件的&#xff0c;需要你的阿里云账号下有可用于申请备案服务码的云产品&#xff0c;如云服务器、建站产品、虚拟主机等&#xff…

关于扇区、簇、块、页等概念的区分

1、什么是扇区和&#xff08;磁盘&#xff09;块&#xff1f; 物理层面&#xff1a;一个磁盘按层次分为 &#xff1a; 磁盘组合 -> 单个磁盘 -> 某一盘面 &#xff08;platter&#xff09;-> 某一磁道 &#xff08;track&#xff09;-> 某一扇区&#xff08;secto…

未针对内部单位 D 的语言 ZH 定义任何语言特定的单位

在写ABAP程序的时候调用功能函数或者调用BDC的时候会要求输入单位。当我们正常输入单位后调用函数就会报错 提示&#xff1a;未针对内部单位 ** 的语言 ZH 定义任何语言特定的单位。但是我们检查表T006和T006A两个后台表的时候&#xff0c; 发现单位在两个表中都存在&#xff0…

vue通过sync标识符 在子组件中更便捷的修改父组件的值

这里 我们创了一个vue2 项目 根组件 App.vue参考代码如下 <template><div><span>{{ name }}</span><text-data :name "name" /></div> </template><script> import textData from "/components/textData&quo…

python网络爬虫笔记20:批量下载图片并将其转换为pdf文档

对于有些网页,你可以预览所有的页面内容,并且也可以通过F12获取到页面的URL,但是面对动辄几十页的图片,手动下载显然是不可行的。 在这里我们给出一个人机交互的通用解决策略。 第一步:使用F12获取页面所有感兴趣图片的URL 这一步看似简单,其实也暗藏玄机。因为有些网…