架构师面试(三十七):监控系统架构模式
题目
监控是在产品生命周期的运维环节,能对产品的关键指标数据进行【实时跟踪】并对异常数据进行【实时报警】。
一句话描述,监控系统可以帮我们【主动预防和发现】业务系统中的问题。
我们常说,监控系统是 “粮草”,业务系统是 “兵马”,【兵马未动,粮草先行】,其重要性可见一斑。
你都接触过哪些监控系统或监控模式呢?能否抽象出监控系统的【架构模式】,并对架构模式中各个关键部分的职责进行分析?
解析
监控系统需要对指标数据进行【实时跟踪】和【实时报警】,所以数据源非常关键;根据对数据源处理的方式,我们可以抽象出三类监控系统的【架构模式】,即:【轮询计算模式】、【中心计算模式】和【边缘计算模式】。
一、轮询计算模式
在项目初创,业务和集群规模都非常小的时候,通常使用【轮询计算模式】搭建监控系统,如下图所示:
【轮询计算模式】的监控系统主要包括这样几个关键部分:日志、脚本、中控机。
日志:服务在运行过程中会将日志打印在日志文件中,比如常见的错误日志;
脚本:针对特定的日志文件和特定的日志统计逻辑编写特定的【脚本】,比如“ grep err error.log | wc -l ”;
中控机:中控机即是部署中控逻辑程序的服务器;中控机会定时发送指令到每台业务服务器上,运行已经部署好的脚本来对日志进行统计,在中控机获取到的统计结果超过预定的阈值时,进行报警。
轮询模式的监控系统架构比较简单,也非常容易落地实现。每台服务器上的脚本在中控机指令的驱动下会轮询对日志进行计算,不过这类计算比较简单,以统计特定关键字的日志为主;每产生一类新的日志,需要根据逻辑编写新的脚本,并需要对脚本进行部署。轮询模式的监控系统适合小规模的集群系统。
二、中心计算模式
在上述【轮询计算模式】的监控系统中,逻辑处理集中在 【脚本】单元,在部署和维护上很麻烦;【中心计算模式】的监控系统则将统计和分析逻辑进行中心化处理,如下图所示:
【中心计算模式】的监控系统主要包括这样几个关键部分:日志、flume、kafka集群 和 大数据日志统计平台。
日志:服务在运行过程中会将日志打印在日志文件中,在【中心计算模式】下,日志文件种类会很多,可以是错误日志,也可以各类业务信息日志;
flume:flume 是很常用的日志采集程序,它时刻监测日志文件,并读取新增日志,然后将新增日志进行上报;常见的采集程序除了 flume外,还有 filebeat;
kafka集群:流处理平台,对大量的采集程序客户端生产的日志消息做数据缓冲,并与 消费端逻辑处理进行解耦;
大数据日志统计平台:通过大数据实时数据处理技术,如:Spark/Storm/Flink,对日志根据指定关键字进行统计,在达到预设阈值时进行报警。
另外,ELK日志查询平台也可以从 kafka 集群中消费日志,然后对日志进行查询。
所有服务节点打印的日志,都会被采集程序采集后上报到中心化的处理单元,即【大数据日志统计平台】进行集中处理,而服务节点没有任何的计算逻辑,所以这种模式叫做【中心计算模式】;业务开发同学有任何的统计和监控需求,直接将需求和日志格式提报给 “大数据”部门即可。【中心计算模式】的监控系统,可以对日志做非常灵活的统计和分析,但是 磁盘IO 和 网络IO 非常大,而且中心计算单元机器成本非常高。
三、边缘计算模式
上述两种监控计算模式:【轮询计算模式】和【中心计算模式】的处理对象都是服务程序打印的日志,这就决定了这两种模式对资源的重量级消耗;【边缘计算模式】的监控系统相对来说更轻量级,如下图所示:
【边缘计算模式】的监控系统主要包括SDK、agent、监控后台系统 三部分。
SDK:SDK 是数据采集组件,嵌入在服务程序中运行;SDK提供函数供服务程序调用,常见函数如:Sum()、Avg()、Max()、Min()等;
agent:agent 是监控系统客户端,作为独立进程运行,在每台服务器上会部署一个专门的 agent 进程;服务器上所有的服务程序调用 SDK 后采集到的数据,通过本机传输到 agent,由 agent 进行汇总后上报到 监控系统服务端;
监控后台系统:监控后台系统即监控系统服务端;后台系统包括三大功能:接收 agent 上报的数据后,首先进行阈值告警判断,如果超过阈值则要报警;上报的数据为了方便分析和展示需要进行持久性存储(历史久远的数据意义不大,只存储近期数据即可);最后需要一个管理平台对阈值进行设定,对监控项数据进行图形化展示。
【边缘计算模式】的监控系统,采集程序 SDK 采集的是汇总过的一个数值,而非日志。举个例子, 要统计消息发送接口(msg_send)的 QPS,则服务程序需要在接口的入口处添加一行 代码:Sum("msg_send", 1);SDK会定时或定量将汇总过的一个数值传输给 agent,agent 会定时上报再次汇总过的数值到监控系统服务端,服务端也会对 agent 上报的数值进行聚合和统计。SDK 和 agent 基于业务服务器资源对监控的数据进行了计算,大大降低了服务端的压力,所以称为【边缘计算模式】。
下面对 【中心计算模式】和【边缘计算模式】进行简单对比:
三种模式的监控系统各有优劣,你是否都经历过?!
相关文章:
架构师面试(三十七):监控系统架构模式
题目 监控是在产品生命周期的运维环节,能对产品的关键指标数据进行【实时跟踪】并对异常数据进行【实时报警】。 一句话描述,监控系统可以帮我们【主动预防和发现】业务系统中的问题。 我们常说,监控系统是 “粮草”,业务系统是…...
【Redis】Hash哈希
文章目录 注意个问题hset命令(核心)hget命令(核心)hexists命令hdel命令hkeys和hvals命令hgetall和hmget命令hlen命令hsetnx命令hincrby命令哈希命令小结哈希编码方式使用场景1.关系型数据表保存用户的信息Redis三种缓存方式对比1.…...
【SpringBoot】Spring中事务的实现:声明式事务@Transactional、编程式事务
1. 准备工作 1.1 在MySQL数据库中创建相应的表 用户注册的例子进行演示事务操作,索引需要一个用户信息表 (1)创建数据库 -- 创建数据库 DROP DATABASE IF EXISTS trans_test; CREATE DATABASE trans_test DEFAULT CHARACTER SET utf8mb4;…...
从零开始讲DDR(9)——AXI 接口MIG 使用(2)
一、前言 在之前的文章中,我们介绍了官方DDR MIG AXI接口的例程的整体框架,在本文中,我们将着重介绍例程中关于数据产生,及驱动到AXI接口的相关逻辑实现。 二、data_gen 在例程中,有ddr4_v2_2_8_data_gen这样一个文件…...
组件通信-props
props 是使用频率最高的一种通信方式,父>子 子>父 父传子:属性值 是非函数子传父:属性值 是函数 父组件 <script setup lang"ts"> import { ref } from vue import Child from ./Child.vue const car ref(奥迪) c…...
纯原生Java实现:获取整个项目中指定接口所有的实现类
不使用第三方,不使用属性文件,不指定包名,获取整个系统中某一个接口所有的实现类,纯Java实现 /*** 类查找器,用于扫描类路径中的所有类,并找出指定类的实现类。* 该类通过递归扫描类路径下的所有 .class 文件…...
反射机制补充
不同对象实例的地址不同 在 Java 里,每当使用 new 关键字创建一个对象时,JVM 会在堆内存中为该对象分配一块新的内存空间,每个对象实例都有自己独立的内存地址。所以不同的对象实例,其内存地址是不同的。 以下是一个简单示例&am…...
计算机视觉的未来发展趋势
计算机视觉的未来发展趋势主要集中在以下几个方面: 1. 自监督学习与少样本学习 自监督学习:通过从无标签的数据中提取有用特征,克服对大量标注数据的依赖。2025年,基于大规模图像数据的自监督预训练模型将更加成熟,能…...
轻量级网页版视频播放器
用deepseek开发的轻量级,网页版视频播放器 可以选择本地文件 可以播放、暂停、全屏、有进度条和时间进度 代码如下: 新建.txt文本文档,把代码复制粘贴进去,把.txt文档后缀名改为.html,用浏览器打开即可使用 <!DO…...
18. LangChain分布式任务调度:大规模应用的性能优化
引言:从单机到万级并发的进化 2025年某全球客服系统通过LangChain分布式改造,成功应对黑五期间每秒12,000次的咨询请求。本文将基于LangChain的分布式架构,详解如何实现AI任务的自动扩缩容与智能调度。 一、分布式系统核心指标 1.1 性能基准…...
C/C++工程师使用 DeepSeek
一、使用 DeepSeek 生成 C/C 代码 在 C/C 开发中,很多时候需要编写一些常见功能的代码,如排序算法、文件读写操作、数据结构的实现等。借助 DeepSeek,工程师只需用自然语言清晰描述需求,它就能依据大量的代码数据和深度学习算法&a…...
数据结构-线性结构(链表、栈、队列)实现
公共头文件common.h #define TRUE 1 #define FALSE 0// 定义节点数据类型 #define DATA_TYPE int单链表C语言实现 SingleList.h #pragma once#include "common.h"typedef struct Node {DATA_TYPE data;struct Node *next; } Node;Node *initList();void headInser…...
第 7 篇:跳表 (Skip List):简单务实的概率性选手
前面几篇我们都在探讨各种基于“树”结构的有序表实现,它们通过精巧的平衡策略(高度、颜色、大小)和核心的“旋转”操作来保证 O(log N) 的性能。今天,我们要介绍一位画风完全不同的选手——跳表 (Skip List)。它不依赖树形结构&a…...
sys目录介绍
文章目录 1. 前言2. 目录层次3. 目录介绍3.1 devices 目录3.2 block 目录3.3 bus 目录3.4 class 目录3.5 dev 目录3.6 firmware目录3.7 fs 目录3.8 kernel目录3.9 module 目录3.10 power 目录 sys目录介绍 1. 前言 linux 下一切皆文件,文件的类型也很多,…...
基于DQN的自动驾驶小车绕圈任务
1.任务介绍 任务来源: DQN: Deep Q Learning |自动驾驶入门(?) |算法与实现 任务原始代码: self-driving car 最终效果: 以下所有内容,都是对上面DQN代码的改进&#…...
源码安装SRS4
Ubuntu20安装好SRS后,(源码安装) 注意:在trunk目录SRS ./objs/srs -c conf/srs.conf 以上为启动srs命令,-c 为指定配置文件, 查看SRS进程 ps aux | grep srs 查看端口: netstat -ano | gre…...
OrbitControls
OrbitControls 3D虚拟工厂在线体验 描述 Orbit controls(轨道控制器)可以使得相机围绕目标进行轨道运动。 Constructor OrbitControls( object : Camera, domElement : HTMLDOMElement ) 参数类型描述objectCamera(必须)将要…...
【数据库】四种连表查询:内连接,外连接,左连接,右连接
在数据库操作中,连表查询是处理多表关联的核心技术。以下是四种主要连接方式的详细介绍、快速掌握方法及实际应用指南: 目录 **一、四种连表查询详解****1. 内连接(INNER JOIN)****2. 左连接(LEFT JOIN / LEFT OUTER J…...
Redis怎么避免热点数据问题
使用 RedisTemplate 避免热点数据问题的解决方案、场景及示例: 1. 数据分片(Sharding) 场景:高频读写的计数器(如文章阅读量统计) 原理:将数据分散到多个子键,降低单个 Key 的压…...
完整的 VS Code + CMake + Qt + GCC 项目构建方案:EXE 程序与多个 DLL 库
完整的 VS Code CMake Qt GCC 项目构建方案:EXE 程序与多个 DLL 库 在本文中,我们将介绍如何构建一个包含 EXE 程序和多个 DLL 库的项目,适用于 VS Code CMake Qt GCC 开发环境。这个方案为一个模块化的项目结构,使得代码清…...
Python 数据智能实战 (7):智能流失预警 - 融合文本反馈
写在前面 —— 不再错过关键预警!结合用户行为与 LLM 文本洞察,构建更精准的流失预测模型 在之前的探索中,我们学习了如何利用大语言模型 (LLM) 对用户评论进行深度挖掘,提取情感、发现主题,并将非结构化的文本信息转化为有价值的特征 (如 Embeddings)。 现在,我们要将…...
Flutter - 概览
Hello world ⌘ shift p 选择 Empty Application 模板 // 导入Material风格的组件包 // 位置在flutter安装目录/packages/flutter/lib/material.dart import package:flutter/material.dart;void main() {// runApp函数接收MainApp组件并将这个Widget作为根节点runApp(cons…...
Python-pandas-操作Excel文件(读取数据/写入数据)及Excel表格列名操作详细分享
Python-pandas-操作Excel文件(读取数据/写入数据) 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是pandas的使用语法。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】:每…...
手写 Vue 源码 === Vue3 设计思想
1.声明式框架 Vue3 是声明式的框架,用起来简单。 命令式和声明式区别 早在 JQ 的时代编写的代码都是命令式的,命令式框架重要特点就是关注过程声明式框架更加关注结果。命令式的代码封装到了 Vuejs 中,过程靠 vuejs 来实现声明式代码更加简单,不需要关注实现,按照要求填代…...
Android WebView加载h5打开麦克风与摄像头的权限问题
目录 快速处理 app向系统申请录音与相机权限h5向app申请录音和相机权限 详细解答 app权限与h5权限录音与麦克风默许的风险最佳实践 Android webview h5 麦克风权限,摄像头(相机)权限实现与填坑。 快速处理 app向系统申请录音与相机权限 …...
三种计算最小公倍数的方法分析
三种计算最小公倍数的方法分析与比较 一.引言 最小公倍数(Least Common Multiple, LCM)是数学中的一个基本概念,指能够被两个或多个整数整除的最小的正整数。在编程中,我们有多种方法可以计算两个数的最小公倍数。本文将分析三种…...
PDF转换工具xpdf-tools-4.05
XPDF是一个开源的PDF查看、提取和转换工具套件,使用C编写,支持多种操作系统,包括Linux、Unix、OS/2、Windows和Mac OS X1。XPDF不仅是一个PDF查看器,还包含多个实用工具,如文本提取器、图像转换器和HTML转换器等&a…...
aws(学习笔记第四十课) image-content-search
aws(学习笔记第四十课) image-content-search 使用SQS Lambda集成 数据库(Aurora Serverless) Cognito(用户管理) rekognition(图像解析) 学习内容: 使用SQS Lambda Aurora Serverless Cog…...
GPT-4o 图像生成与八个示例指南
什么是GPT-4o图像生成? 简单来说,GPT-4o图像生成是集成在ChatGPT内部的一项功能。用户可以直接在对话中,通过文本描述(Prompt)来创建、编辑和调整图像。这与之前的图像生成工具相比,体验更流畅、交互性更强…...
PostgreSQL 查看表膨胀情况的方法
PostgreSQL 查看表膨胀情况的方法 表膨胀(Table Bloat)是PostgreSQL中由于MVCC机制导致的一种常见现象,当大量数据被更新或删除后,表中会积累"死元组"(dead tuples),这些死元组占据空间但不可见,导致表实际占用的磁盘空…...
从 0 到 1!深度剖析项目实施流程,开启项目管理新视野
一、项目准备 / 前期准备 (一)跟销售进行项目交接 对接人:销售人员交接会议内容: 了解项目背景、客户基本信息、项目版本、具备二次开发功能、接口、了解合同信息等。明确项目情况、客户基本情况、使用软件(版本&…...
书生实战营之沐曦专场
一:实验环境进入和启动实验容器(D.run平台) 1.1首先进入平台进行注册 D.run平台https://console.d.run/ 注册和登录环节就跳过了。 1.2 启动实验容器--详细步骤如下 1.2.1选择容器的名称、区域、镜像(注意镜像必须选择Dlinfer) 1.2.2可以选…...
在运行 Hadoop 作业时,遇到“No such file or directory”,如何在windows里打包在虚拟机里运行
最近在学习Hadoop集群map reduce分布运算过程中,经多方面排查可能是电脑本身配置的原因导致每次运行都会报“No such file or directory”的错误,最后我是通过打包文件到虚拟机里运行得到结果,具体步骤如下: 前提是要保证maven已经…...
基于YOLOV5的目标检测识别
基于YOLOV5的目标检测识别 舰船目标检测口罩目标检测飞机目标检测 舰船目标检测 口罩目标检测 飞机目标检测...
第4篇:服务层抽象与复用逻辑
在业务系统复杂度指数级增长的今天,服务层(Service Layer)的合理设计直接影响着系统的可维护性和扩展性。本文将深入剖析 Egg.js 框架中的服务层架构设计,从基础实现到高级封装,全方位讲解企业级应用的开发实践。 一、…...
多模态大语言模型arxiv论文略读(五十四)
RoboMP 2 ^2 2: A Robotic Multimodal Perception-Planning Framework with Multimodal Large Language Models ➡️ 论文标题:RoboMP 2 ^2 2: A Robotic Multimodal Perception-Planning Framework with Multimodal Large Language Models ➡️ 论文作者ÿ…...
中小企业MES系统详细设计
版本:V1.1 日期:2025年5月2日 一、设备协议兼容性设计 1.1 设备接入框架 #mermaid-svg-PkwqEMRIIlIBPP58 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PkwqEMRIIlIBPP58 .error-icon{fill…...
第二十周:项目开发中遇到的相关问题(一)
自十九周开始,我们便开始着手写项目(关于新闻资讯类的Web项目),当然,在这之中我们也学到了很多高效且有用的好技术,在接下来的内容中将去具体的描述这些好技术,介绍它们的具体用法和应用场景。本…...
WebRtc10: 端对端1v1传输基本流程
媒体能力协商过程 RTCPeerConnection(核心类) 基本格式 pc new RTCPeerConnection([configiration]); RTCPeerConnection方法分类 媒体协商Stream/Track传输相关方法统计相关方法 媒体协商过程 协商状态变化 媒体协商方法 createOffercreateAnswe…...
【云备份】配置文件加载模块
目录 一.为什么要配置文件 二.配置文件的实现 三.单例文件配置类设计 四.源码 一.为什么要配置文件 我们将服务端程序运行中用到的一些关键信息保存到配置文件中,这样可以使程序的运行更加灵活。 这样做的好处是,未来如果我们想要修改一些关键信息&…...
重构之道:识别并替换不合适使用的箭头函数
1、引言 JavaScript 自 ES6 引入了箭头函数(Arrow Function)后,因其简洁的语法和对 this 的词法绑定机制,迅速成为开发者喜爱的写法之一。然而,并不是所有场景都适合使用箭头函数。 在实际开发中,我们常常会因为追求代码简洁而忽视其潜在问题,例如: this 指向错误不适…...
git问题记录-如何切换历史提交分支,且保留本地修改
问题记录 我在本地编写了代码,突然想查看之前提交的代码,并且想保留当前所在分支所做的修改 通过git stash对本地的代码进行暂存 使用git checkout <commit-hash>切换到之前的提交记录。 查看完之后我想切换回来,恢复暂存的本地代码…...
【MySQL】事务管理
事务管理 一. 事务的概念二. 事务的特征三. 事务的版本支持四. 事务的提交方式五. 事务的常见操作六. 事务的隔离级别1. 查看与设置隔离级别2. 读未提交 (Read Uncommitted)3. 读提交 (Read Committed)4. 可重复读 (Repeatable Read)5. 串行化 (Serializable)6. 隔离级别的总结…...
【点对点协议(PPP)全解析】从原理到工程实践
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心配置实现案例1:基础PPP链路建立案例2:CHAP认证配置 运行结果验证 三、性能对比测试…...
环境搭建:开启 Django 开发之旅
一、环境搭建:开启 Django 开发之旅 (一)安装 Python 先确保电脑上装有 Python 3.6 及以上版本,Django 5.1 的话,至少得 Python 3.8 哦。 安装前,先查下有没有装过 Python ,终端(Wi…...
如何配置NGINX作为反向代理服务器来缓存后端服务的响应?
大家好,我是锋哥。今天分享关于【如何配置NGINX作为反向代理服务器来缓存后端服务的响应?】面试题。希望对大家有帮助; 如何配置NGINX作为反向代理服务器来缓存后端服务的响应? 1000道 互联网大厂Java工程师 精选面试题-Java资源…...
【Java IO流】File类基础详解
参考笔记:java File类基础 万字详解(通俗易懂)-CSDN博客 目录 1.前言 2. File类介绍 3. File类构造方法 4.File类常用的方法案例演示 4.1 创建文件/文件夹的方法 4.2 删除文件/文件夹的方法 4.3 判断文件/文件夹是否存在的方法 4.4 …...
《C#数据结构与算法》—201线性表
线性表的实现方式 顺序表 线性表的顺序存储是指在内存中用一块地址连续的空间依次存放线性表的数据元素,用这种方式存储的线性表叫顺序表。 特点:表中相邻的数据元素在内存中存储位置也相邻。 顺序表接口实现: 方法名参数返回值描述GetLen…...
MATLAB绘制局部放大图
今天,我将分享一段 MATLAB 代码,该代码生成了一个主副图结合的可视化展示,用于比较不同控制系统性能表现。 clc; clear; close all;% 生成时间向量 t 0:0.1:12;% 生成模拟数据 zero_feedback 0.5 * ones(size(t)); % 恒定…...
TS 常用类型
JS不会检查变量类型的变化 给变量规定特定的数据类型,错误赋值时会报错 优势:TS会标记出代码中的意外行为,尤其是typeerrors 具体实现:类型注解 JS和TS中数据类型的变化...