写点什么

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

  • 2023-05-16
    北京
  • 本文字数:2081 字

    阅读完需:约 7 分钟

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

一、背景

业务监控是指通过技术手段监控业务代码执行的最终结果或者状态是否符合预期,实现业务监控主要分成两步:一、在业务系统中选择节点发送消息触发业务监控;二、系统在接收到 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,降级


作者:京东零售 胡飞

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

发布于: 刚刚阅读数: 3
用户头像

拥抱技术,与开发者携手创造未来! 2018-11-20 加入

我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩

评论

发布
暂无评论
一种通用的业务监控触发方案设计 | 京东云技术团队_京东云_京东科技开发者_InfoQ写作社区