架构(十七)翻译监控

一、引言

    作者最近做的一个功能是需要监控一个翻译转换,根据国家和语言进行分组,然后定时把监控情况放到ck里面。为什么是分组和定时监控呢?因为调用比较高的系统的qps在单机一万多,70台机器,可怕的高频调用注定他不能实时分析。

二、方案设计

1、需求

    先明确一下功能点,翻译监控很多读者可能不太理解,大家可以类比redis缓存监控,只不过由于高频不能做实时监控,要根据国家、语言把redis缓存进行分组监控,方便监控一段时间内的国家语言维度对应key的缓存访问频率。

2、分析

    首先要增加切点,因为这种监控肯定要方便发布、无需更新pom,所以要在字节码增强里面做

    要实现这样的监控,首先要有一个存储,把国家+语言+key作为唯一键,存储他的频率,这种肯定是需要一个map了。

    还需要定时将map存储的数据发送到ck,那就需要开启一个可配置频率的定时任务。定时任务的开启也是一个问题,因为在javaagent里面使用不了Spring的定时包,原因之前的文章说过。所以必须使用jdk原生的工具,jdk倒是使用延时队列和lock阻塞实现了一个ScheduledThreadPoolExecutor。

    使用ScheduledThreadPoolExecutor要注意它的无界队列,但是他没有提供更改队列数量的方法,那我们有两个方案:一个是使用信号量进行阻塞,防止大量任务进入队列;另外一种是封闭这个线程池,只在开启一次,队列不进行二次任务进入

    这里就带来了并发问题,map在被定时任务读取发送到ck的时候,还有高频的写入操作,加锁就太影响性能了。那么有什么巧妙的设计可以规避吗?可以设置两个map,一个用来读一个用来写,在定时任务读取的时候设置标志位,切换map的使用。

三、代码    

    分析完了还是要在代码中实践,会发现更多问题

1、map存储

   使用了一个AtomicBoolean标识目前使用的map

    

public class MonitorMapHandleUtils {private static final ConcurrentHashMap<String, Integer> firstMap = new ConcurrentHashMap<>();private static final ConcurrentHashMap<String, Integer> secondMap = new ConcurrentHashMap<>();private static AtomicBoolean useFirst = new AtomicBoolean(true);private static final String SEMICOLON = ";";/*** country+ key + locale维度分组* * @param key*/public static void pushMap(Object key, Object locale, String country) {String key = country + SEMICOLON + key + SEMICOLON + locale;if (useFirst.get()) {firstMap.compute(key, (k, v) -> (v == null) ? 1 : v + 1);return;}secondMap.compute(key, (k, v) -> (v == null) ? 1 : v + 1);}public static void runSendMap() {if (useFirst.get()) {sendMap(firstMap);return;}sendMap(secondMap);}/*** 控制分钟级别,不会有useFirst连续设置的风险* * @param map*/protected static void sendMap(ConcurrentHashMap<String, Integer> map) {useFirst.set(!useFirst.get());map.forEach((k, v) -> MonitorMapHandleUtils.sendCk(k, v));map.clear();}private static void sendCk(String key, Integer count) {}
}

2、定时发送

    这里其实是不断的在取延时多久执行,配置中心都是推送客户端缓存的,所以这里的检查不会有多少性能损耗

    使用start开启定时任务,可以思考下为什么要这样做。比如有的同事说为什么不在static静态块里面处理?

    首先即使在静态块处理,这个类也必须是主动使用的,否则不会被按需加载,类的主动使用包括以下几种情况:

创建类的实例。访问类的静态方法。访问类的静态字段,除了声明为final的字段,它们是编译时常量。使用java.lang.reflect包的方法对类进行反射调用。初始化一个类的子类(首先会初始化父类)。

   加载的时候必须保证所需的包已经加载好了,这里有什么操作?配置中心的首次检查,更新延时时间,所以我们必须让这个定时类的方法被调用,而且是在配置中心包加载好之后才能调用。

    这样的话就要把MonitorMapHandleUtils使用的变量或者方法放在MonitorDynamicScheduledTask,然后调用,这样才能保证配置中心一定是已经加载好的,这取决于调用的时机,只有被调用到的时候这些类才会按需加载,这样代码结构看起来就会比较诡异,互相依赖

    定时类只放开了一个方法,并且调用一次之后就不再允许处理,避免多次调用,所以就不会有无界队列过多任务的风险


public class MonitorDynamicScheduledTask {private static final ScheduledExecutorService scheduler = new ScheduledThreadPoolExecutor(1);/*** 初始延迟时间,单位为分钟*/private static volatile int currentDelay = 240;private static AtomicBoolean startFlag = new AtomicBoolean(false);/*** 开启仅执行一次,并发执行多次也没关系,瞬时不影响*/public static void start() {if (startFlag.get()) {return;}MonitorDynamicScheduledTask.checkDelay();scheduleTask(currentDelay);startFlag.set(true);}/*** 进入队列,不会有递归调用的方法栈问题* * @param delayInHours*/private static void scheduleTask(int delayInHours) {scheduler.schedule(() -> {if (Config.monitorRun()) {MonitorMapHandleUtils.runSendMap();MonitorDynamicScheduledTask.checkDelay();// 重新调度下一次执行MonitorDynamicScheduledTask.scheduleTask(currentDelay);}}, delayInHours, TimeUnit.MINUTES);}private static void checkDelay() {// 检查配置中心是否有更新int newDelay = Config.monitorInterval();if (newDelay != currentDelay && newDelay > 0) {currentDelay = newDelay;}}
}

四、总结

    翻译监控不难,难的是在agent无侵入的情况下去监控,要考虑性能损耗、类加载时机、包加载时机,即使是简单的并发也要考虑不能用锁造成性能损耗

图片

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

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

相关文章

【喜报】科大睿智多家服务企业上榜2024年第四批DCMM名单

近日&#xff0c;DCMM官方平台发布通知公告&#xff0c;根据《数据管理能力成熟度评估工作管理办法(暂行)》的有关规定&#xff0c;经单位自愿申请&#xff0c;评估机构评估、专家评审及公示&#xff0c;下列27单位获得数据管理能力成熟度等级证书。小编祝贺多家服务企业上榜20…

前端破圈用Docker开发项目

为什么要用 Docker 开发 &#x1f914; 直接在系统上开发不香吗&#xff1f;香&#xff0c;但是 Docker 有下面4香 环境依赖管理&#xff1a;Docker 容器可以管理所有依赖项&#xff0c;例如前端里面的 node 和 npm 版本&#xff0c;不需要在本地安装和维护这些依赖项 隔离&a…

618入手不亏的好物有哪些?五款品质兼优的好物分享!

随着618购物狂欢节的到来&#xff0c;各位消费者们是否已经摩拳擦掌&#xff0c;准备开启一场购物盛宴&#xff1f;在这里&#xff0c;我们为您精心准备了一份不容错过的购物清单&#xff0c;无论您是科技迷、学生还是家居生活爱好者&#xff0c;都能找到心仪的好物。 1、学生…

经典文献阅读之--RepViT-SAM(利用语义分割提高NDT地图压缩和描述能力的框架)

0. 简介 Segment Anything Model (SAM) 最近在各种计算机视觉任务上展现了令人瞩目的零样本迁移性能 。然而&#xff0c;其高昂的计算成本对于实际应用仍然具有挑战性。MobileSAM 提出通过使用蒸馏替换 SAM 中的重图像编码器&#xff0c;使用 TinyViT&#xff0c;从而显著降低了…

在VSCode 中增加文件与文件夹的可辨识度

今天重新打开VSCode&#xff0c;打算新建一个项目做测试&#xff0c;看到VSCode中的文件与文件夹很不容易辨认&#xff0c;有时候容易导致一些误操作&#xff0c;需要做一些配置来改变。 效果图&#xff1a; 只需要做简单的2步就可以了。 1、安装插件 ⑴ 打开VSCode的扩展搜索并…

降雨量应急监测站的工作原理

TH-YJ3】雨量监测站是一种自动化的气象监测设备&#xff0c;主要用于实时、准确地监测和记录降雨量数据。它通过安装在特定位置的传感器和数据处理设备&#xff0c;连续监测降雨的强度、持续时间和降雨分布等信息&#xff0c;为气象、水文、环境等领域的研究和应用提供数据支持…

OpenBuild推出Sui Quiz任务,瓜分500SUI奖励

Quiz 功能 让用户可以&#xff1a; - 测试对某个知识点的理解力&#xff1b; 通过测试后获得 NFT 凭证&#xff0c;未来该凭证可用于求职认可、Bounty 任务、空投门槛。 Sui 是一个高性能的去中心化平台&#xff0c;旨在解决传统区块链系统中的可扩展性和效率问题。其独特的架…

福建聚鼎科技:装饰画生意到底有没有前景

在当今社会&#xff0c;随着人们生活水平的提高和审美需求的多样化&#xff0c;家居装饰行业迎来了新的发展机遇。装饰画作为家居装饰的重要组成部分&#xff0c;其市场前景备受关注。那么&#xff0c;装饰画生意到底有没有前景呢? 从市场需求的角度来看&#xff0c;装饰画市场…

视频监控业务平台LntonCVS运用国标协议对接视频汇聚管理综合平台应用方案

为了实现“以信息化推动应急管理能力现代化”的目标&#xff0c;应急管理部提出了加速现代信息技术与应急管理业务深度融合的计划。这一计划是国家加强和改进应急管理工作的关键举措&#xff0c;也是满足日益严峻的应急管理形势和人民群众不断增长的公共安全需求的紧迫需求。 为…

vue3 调用本地exe

1、注册表注册 在注册表中直接按照图2注册数据&#xff1b;也可以按照图3注册表的文件创建文档&#xff0c;然后点击打开&#xff0c;将会将注册表写入window系统。 图2 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\F1] "URL:F1 Protocol Handler" &q…

国产POE芯片,芯昇电子成熟量产POE芯片,在PSE端和PD端均成熟量产产品

随着技术的发展和市场的需求&#xff0c;国产POE芯片已经逐渐崭露头角。在POE技术领域&#xff0c;POE芯片分为供电设备PSE和受电设备PD&#xff0c;而选择参与802.3bt标准与以太网联盟徽标计划的厂商来生产这些芯片&#xff0c;可以确保在互操作性和合规性上更有把握。过去…

按组计算每列最大最小值并横向填入格中

第 1 列是分组列&#xff0c;之后是N个数据列。 ABCD1ZN_1N_2Q_122A100200-1003A101-10-2004A102201-1045A991993006B1000110013007B10041200-9008C2000-210022009C1900-2090-2180 现在要按第 1 列分组&#xff0c;每组横向的2N个列&#xff0c;依次是组内每个数据列的最大值…

华为昇腾310 ATC转换工具安装

参考: https://bbs.huaweicloud.com/blogs/393282?utm_source=zhihu&utm_medium=bbs-ex&utm_campaign=other&utm_content=content https://www.hiascend.com/document/detail/zh/canncommercial/601/inferapplicationdev/atctool/atctool_0004.html 1、基本工具…

K8s中配置使用ingress

Ingress是什么 在Kubernetes中&#xff0c;Ingress是一种用于将外部流量路由到集群内部服务的API对象。它通常与Ingress控制器一起使用&#xff0c;Ingress控制器负责根据Ingress规则路由外部流量到不同的服务上。   Ingress 提供从集群外部到集群内服务的 HTTP 和 HTTPS 路由…

Vue中的常用指令

Vue 会根据不同的【指令】&#xff0c;针对标签实现不同的【功能】 概念&#xff1a;指令&#xff08;Directives&#xff09;是 Vue 提供的带有 v- 前缀 的 特殊 标签属性。 为啥要学&#xff1a;提高程序员操作 DOM 的效率。 vue 中的指令按照不同的用途可以分为如下 6 大…

【Unity iOS打包】Library not loaded: ‘@rpath/AdjustSdk.framework/AdjustSdk‘

Unity打包iOS&#xff0c;XCode运行App黑屏卡死&#xff0c;报错&#xff1a; dyld[8412]: Library not loaded: rpath/AdjustSdk.framework/AdjustSdkReferenced from: /private/var/containers/Bundle/Application/C019F943-138F-4B33-AAC1-F18453F942D9/AnimalsBAMBAM.app/…

采用Java+ SpringBoot+ IntelliJ+idea开发的ADR药物不良反应监测系统源码

采用Java SpringBoot IntelliJidea开发的ADR药物不良反应监测系统源码 ADR药物不良反应监测系统有哪些应用场景&#xff1f; ADR药物不良反应监测系统有哪些应用场景&#xff1f; ADR药物不良反应监测系统具有广泛的应用场景&#xff0c;以下是一些主要的应用场景&#xff1a…

发现一个可以白嫖GPU的平台

网址 https://platform.virtaicloud.com/gemini_web/auth/register?inviteCodeb0322161368ead7f49716688486796dd 驱动云注册有100点的算力点&#xff0c;目前最便宜的机器大概是0.49算力点每小时&#xff0c;安装个sd或者简单学习训练数据的话&#xff0c;应该能用挺久的。…

【豆伴匠】L1-L12更新完,一站式解决文史积累、阅读、写作难题,弯道超车,寒假必备

合抱之木&#xff0c;生于毫末&#xff1b; 九层之台&#xff0c;起于垒土&#xff1b; 千里之行&#xff0c;始于足下。 豆伴匠是什么&#xff1f; 豆伴匠内容包括&#xff1a;人、文、史、作四个模块&#xff0c;全面覆盖文史知识及读写技巧。 目前&#xff0c;豆伴匠有L…

【408真题】2009-24

“接”是针对题目进行必要的分析&#xff0c;比较简略&#xff1b; “化”是对题目中所涉及到的知识点进行详细解释&#xff1b; “发”是对此题型的解题套路总结&#xff0c;并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材&#xff08;2025版&…