一、背景

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

作者:京东零售 胡飞

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

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

  1. 京东云高可用业务架构建设 | 京东云技术团队

    本文以 2022 年一个实际项目为基础,来演示在京东云上构建高可用业务的整个过程.公有云及私有云客户可通过使用京东云的弹性 IAAS.PAAS 服务,创建高可用.高弹性.高可扩展.高安全的云上业务环境 ...

  2. 性能测试监控指标及分析调优 | 京东云技术团队

    一.哪些因素会成为系统的瓶颈? 1.CPU,如果存在大量的计算,他们会长时间不间断的占用CPU资源,导致其他资源无法争夺到CPU而响应缓慢,从而带来系统性能问题,例如频繁的FullGC,以及多线程造成 ...

  3. 监控服务器怎么增加碟机,微服务业务监控方法及服务器专利_专利申请于2017-12-15_专利查询 - 天眼查...

    1. 一种微服务业务监控方法,其特征在于,包括: 生成多个调用请求信息,每个所述调用请求信息对应多个微服务,并将各个所述调用 请求信息发送给对应的微服务;每个所述调用请求信息用于使得对应的微服务生成与 ...

  4. GPRS GPRS(General Packet Radio Service)是通用分组无线服务技术的简称,它是GSM移动电话用户可用的一种移动数据业务,属于第二代移动通信中的数据传输技术...

    GPRS 锁定 本词条由"科普中国"百科科学词条编写与应用工作项目 审核 . GPRS(General Packet Radio Service)是通用分组无线服务技术的简称,它是 ...

  5. 自用型监控系统方案设计

    一.监控系统整体概述 系统背景: 在当前项目中,当我们对特定流程注入故障后,如何评估故障的效果以及系统应对故障的表现?传统方式是用户需要登录线上机器或者各种监控系统去查看具体的指标信息,然后通过人工判 ...

  6. 腾讯专家分享:腾讯做业务监控的心得和经验

    转载地址:http://www.qcloud.com/blog/?p=497 分享主题: 腾讯业务立体化监控体系 1.介绍腾讯业务监控体系的层级构成: 2.用代表性的监控系统阐述每个监控层次的实现方法 ...

  7. 腾讯业务监控的修炼之路

    作者丨李光:现任职于腾讯社交网络运营部/织云产品团队,负责织云监控告警平台规划与运维新产品开发工作,具有多年业务运维.运营规划经验. 概述 本文作为监控告警产品的专题系列的第二篇文章,主要讨论的是IA ...

  8. 架构设计器_大厂案例:马蜂窝大交通业务监控报警系统架构设计与实现

    部门的业务线越来越多,任何一个线上运行的应用,都可能因为各种各样的原因出现问题:比如业务层面,订单量比上周减少了,流量突然下降了:技术层面的问题,系统出现 ERROR ,接口响应变慢了.拿大交通业务来 ...

  9. python在线考试系统设计csdn下载_一种通用的网页相似度检测算法

    如果我们需要在海量的结构未知的网页库中找到和指定的网页相似度比较高的一些网页,我们该怎么办呢?本文提出的"一种通用的网页相似度检测算法"就是专门解决这个问题. 算法如下: 1.提取 ...

最新文章

  1. git rollback代码都没了_Git使用总结
  2. Oracle to_char格式化函数
  3. 赠书|零压力入门算法的顶流畅销书《漫画算法》
  4. Java并发编程基础与实战
  5. VMware介绍与网络的三种模式
  6. 实验报告一:词法分析
  7. WebView http图片加载失败
  8. 解决设备升级至Android 4.2.2之后,可以连接但无法调试的问题
  9. 【.Net core】EFCore——Code First生成数据库与表
  10. Go bufio.Reader 结构+源码详解
  11. socket编程(一)
  12. 当浏览器窗口大小改变时,设置显示内容的高度
  13. Android透明状态栏设置
  14. Axure原型设计相关:Axure RP8中继器实例(附rp文件)——列表的增删改查、分页
  15. 【深入理解JS核心技术】14. 什么是一元函数
  16. log4j2自定义级别日志
  17. 自然语言处理领域介绍
  18. 微信JSAPI支付调不起收银台问题
  19. Install SysBench support MySQL and PostgreSQL
  20. Photoshop CS2 视频教程-PS锁定图层(转)

热门文章

  1. JavaScript ECMAScript学习笔记
  2. 1.Python3.6环境部署
  3. 阿里云服务器安装mysql、jdk、redis、tomcat
  4. 第五届中国网络安全大会(NSC2017)在京隆重举行
  5. H3CF1060防火墙透明模式典型组网配置案例
  6. cad怎么打字_AUTOCAD 2015以上版本如何定制CAD经典界面?
  7. Nginx下codeigniter的rewrite规则配置
  8. Oracle数据库管理系统的体系结构图解简单说明(一)
  9. Renishaw使用什么命名规则来描述其测针系提列产品?
  10. PHP理财网站搭建开发源码/遇见互助系统源码+三级分红+红利返点