大厂偏爱的Agent技术究竟是个啥

2023-11-15

搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。

hello大家好,我是小楼,今天给大家分享一个关于Agent技术的话题,也是后端启示录的第3篇文章。

通过本文你可以了解到如下内容:

什么是Agent技术

为了解释什么是Agent技术,我在网上搜了一圈,但没有找到想要的结果。反倒是搜到了不少Java Agent技术,要注意Java Agent技术指的是一种Java字节码修改技术,和本文要说的完全是两码事

既然搜不到,我就说下自己的理解吧。Agent技术是在「客户端」机器上部署一个Agent进程,「客户端」与「服务端」的交互通过这个Agent进行代理,其中Agent与Client通常在同一主机,即可通过「localhost」进行访问。

看到这里,相信你能想到不少类似的架构,例如当前大热的Service Mesh,又如Flume Agent等等。

在我所在的公司,Agent技术也被非常广泛的使用,涉及了日志处理、配置下发、服务注册发现、监控数据收集等方面。

Agent技术能解决什么问题

既然Agent技术被如此广泛的运用,那么它主要是为了解决什么问题呢?

要充分理解它,我们需要从Agent的特点去考虑。

  1. 进程级资源隔离

这点可以参考之前我写的文章《Cobar SQL审计的设计与实现》,为了在Cobar中新增SQL审计的功能,第一考虑的是稳定性,不想因为引入了新的组件(Kafka)导致Cobar不可用,所以将SQL收集存储部分独立为一个Agent。

如果将逻辑放在业务进程中,首先资源(Cpu、内存等)消耗不可控,其次也极易有可能引入Bug导致原进程崩溃。

  1. 语言框架无关

举个日志切割的例子,如果大家都用Java,并用了Log4J日志框架,那么完全可以使用一个配置来把日志按时间进行切割和保留。

但如果有人使用了一个小众的语言,或者用了一个不具备日志切割能力的日志框架,这时想拥有Log4J同样的日志切割能力怎么办呢?

你可能会说怎么会有这样的日志框架,可能大家用Log4J或Logback这样的日志框架都太过于强大了,事实上其他语言真的有这样的,而且日志框架也有很多轮子,质量参差不齐。

不能要求每个日志框架都具备同等的能力,只能通过一个Agent进程来处理。

看到这里,你可能已经发现这个Agent已经超出文章开头的定义了,严格来说叫「Sidecar模式」,但这个词更多的用在Service Mesh上,所以本文还是用Agent来代替。

  1. 存算分离

这个概念在数据库和消息队列使用的比较多,这里我借用一下,如果表述不准确还请见谅。

在没有Agent之前,服务端负责数据的存储和计算,在有了Agent后,服务端的部分计算可以交给Agent,这样不仅可以减少服务端的压力,也能大幅度降低服务端代码的复杂度。

  1. 基础组件与业务解耦

这点用Service Mesh的例子讲解恰到好处,对于流量的治理,比如限流、熔断、切流,原先实现在RPC框架,每一次改动升级都需要业务方修改依赖升级并发布,而使用Agent技术后,将原先RPC具有的能力下沉到Agent,变更也只需要升级Agent,业务与基础组件的研发互不相干,效率得到极大地提升。

为什么大厂偏爱Agent技术

大厂的特点是人多,人多必然带来一些效率上的问题,所以大厂在工程效率上的探索往往走的比较靠前,他们会把基础架构和业务研发分开,大家的边界很清晰,各司其职。

但这也带来了很严重的问题,如果基础组件和业务耦合比较严重,那就导致架构的演进受到阻碍。

举个例子,某一天基础架构部新增了一个维度的限流能力,升级推广需要业务方操作,这时刚好业务紧急,那基础组件的升级势必会搁置。

于是基础组件与业务解耦的Agent技术受到大厂的偏爱。

大厂同样有个问题是技术栈众多,有时候为了跨语言、跨框架地解决问题,只能采用Agent技术。

Agent关键技术和缺点

Agent关键技术有很多,看起来不难,但要做好,确实得下很多功夫:

  • 资源隔离,这点通常使用cgroups技术
  • Agent生命周期管理,包括Agent的上线、升级、灰度、下线等等的管理,需要有统一的管控平台,否则Agent的管理将会非常头疼
  • 进程间通信,这点不是必须,但大多数Agent需要考虑这点,一般可选项有如下可选,结合实际情况进行选择即可

  • 稳定性,Agent随时会挂,要带着这个去设计实现Agent
  • 资源消耗问题
    • Agent毕竟只是个附属品,不能占用过多的内存、CPU,启动速度也得快,从这点来看Go是个不错的选择
    • 在容器的环境下,Agent独立为一个容器和业务容器组成Pod,这就导致了一台物理机上装了很多Agent容器,资源浪费严重,同理,虚拟机也是如此。所以省资源的玩法是一台物理机只装一个Agent,做好租户隔离即可。

技术没有银弹,Agent也有它的缺点:

  • 架构复杂,管理困难使多小厂望而却步
  • 性能问题,如果是直接代理流量,性能问题会很严重,毕竟在网络通信上多了一跳,这也是Service Mesh的问题之一,甚至还演进出了proxyless Mesh

最后说一句

虽然看完本文你也不知道怎么实现一个Agent,但通过本文你能了解到Agent技术是什么,有什么好处,大厂为什么偏爱这项技术,以及要实现一个Agent的技术关键点和缺点各是什么。

这也是后端启示录系列文章的出发点,「为什么」比「怎么做」更重要。如果你也喜欢这类文章,读完有那么一点收获,希望你能帮我点个在看关注,当然能分享出去就更好了,我会继续加油写这个系列~我们下期再见!

后端启示录系列


搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大厂偏爱的Agent技术究竟是个啥 的相关文章

  • 按下按钮并在java中的新窗口中打开文件

    我创建了一个 JFrame 并放置了一个文本字段和按钮 在文本字段中我放置了从文本文件读取的名称 我知道我想单击按钮并打开一个已知窗口 我想在其中放置名称 其他信息来自同一个文件 这是我的代码 这是我的主框架 package Fronten
  • 使用 Java 的 Apache Http 摘要身份验证

    我目前正在开发一个 Java 项目 但无法使 http 摘要身份验证正常工作 我尝试使用 Apache 网站 但没有帮助 我有一个需要 HTTP 摘要身份验证的网站 DefaultHttpClient httpclient new Defa
  • 如何在由子控件组成的 SWT 复合材料上跟踪鼠标?

    我创建了自己的控件 我想跟踪鼠标并添加一个MouseTrackListener 很遗憾MouseEnter and MouseLeave当鼠标移动到我的合成部分 即标签和按钮 上时 也会生成事件 Mouse enter mouse ente
  • 如何在java中将数组值排序为循环格式?

    我的数组值如下 String value 1 2 3 4 5 6 7 8 9 10 假设如果我将值 5 传递给 tat 数组 它应该按如下顺序排序 5 6 7 8 9 10 1 2 3 4 怎么办 有人帮忙吗 感谢你 你需要的就是所谓的轮换
  • 如何在 JavaFX 中连接可观察列表?

    我所说的串联是指获得一个新列表 该列表侦听所有串联部分的更改 方法的目的是什么FXCollections concat ObservableList
  • eclipse行号状态行贡献项是如何实现的?

    我需要更新状态行编辑器特定的信息 我已经有了自己的实现 但我想看看 eclipse 贡献项是如何实现的 它显示状态行中的行号 列位置 谁能指点一下 哪里可以找到源代码 提前致谢 亚历克斯 G 我一直在研究它 它非常复杂 我不确定我是否了解完
  • Thymeleaf 3 Spring 5 映射加载字符串而不是 HTML

    我正在尝试将 Spring 5 和 Thymeleaf 3 一起配置 我正在 Eclipse 上工作 我使用 全新安装 构建并使用 springboot run 运行应用程序 我已经设置了一个控制器和几个模板 但 Thymeleaf 似乎找
  • 提供节点名或服务名,或未知 Java

    最近我尝试运行我的 Java 项目 每当我运行它并将其打开到我得到的服务器地址时 Unable to determine host name java net UnknownHostException Caused by java net
  • 在 Java 中如何找出哪个对象打开了文件?

    我需要找出答案哪个对象在我的 Java 应用程序中打开了一个文件 这是为了调试 因此欢迎使用工具或实用程序 如果发现哪个对象太具体了 这class也会很有帮助 这可能很棘手 您可以从使用分析器开始 例如VisualVM http visua
  • 断言 Kafka 发送有效

    我正在使用 Spring Boot 编写一个应用程序 因此要写信给 Kafka 我这样做 Autowired private KafkaTemplate
  • Java 中如何将 char 转换为 int? [复制]

    这个问题在这里已经有答案了 我是Java编程新手 我有例如 char x 9 我需要得到撇号中的数字 即数字 9 本身 我尝试执行以下操作 char x 9 int y int x 但没有成功 那么我应该怎么做才能得到撇号中的数字呢 ASC
  • 将非 Android 项目添加到 Android 项目

    我在 Eclipse 中有三个项目 Base Server 和 AndroidClient Base和Server是Java 1 7项目 而AndroidClient显然是一个android项目 基础项目具有在服务器和 Android 客户
  • 从jar中获取资源

    我有包含文件的 jar myJar res endingRule txt myJar wordcalculator merger Marge class 在 Marge java 中我有代码 private static final Str
  • 蓝牙发送和接收文本数据

    我是 Android 开发新手 我想制作一个使用蓝牙发送和接收文本的应用程序 我得到了有关发送文本的所有内容逻辑工作 但是当我尝试在手机中测试它时 我看不到界面 这是Main Activity Code import android sup
  • Java Swing - 如何禁用 JPanel?

    我有一些JComponents on a JPanel我想在按下 开始 按钮时禁用所有这些组件 目前 我通过以下方式显式禁用所有组件 component1 setEnabled false 但是有什么办法可以一次性禁用所有组件吗 我尝试禁用
  • Spring @Cacheable 和 @Async 注解

    我需要缓存一些异步计算的结果 具体来说 为了克服这个问题 我尝试使用 Spring 4 3 缓存和异步计算功能 作为示例 我们采用以下代码 Service class AsyncService Async Cacheable users C
  • 部署 .war 时出现 Glassfish 服务器错误:部署期间发生错误:准备应用程序时出现异常:资源无效

    我正在使用以下内容 NetBeans IDE 7 3 内部版本 201306052037 爪哇 1 7 0 17 Java HotSpot TM 64 位服务器虚拟机 23 7 b01 NetBeans 集成 GlassFish Serve
  • Java RMI - 客户端超时

    我正在使用 Java RMI 构建分布式系统 它必须支持服务器丢失 如果我的客户端使用 RMI 连接到服务器 如果该服务器出现故障 例如电缆问题 我的客户端应该会收到异常 以便它可以连接到其他服务器 但是当服务器出现故障时 我的客户端什么也
  • MiniDFSCluster UnsatisfiedLinkError org.apache.hadoop.io.nativeio.NativeIO$Windows.access0

    做时 new MiniDFSCluster Builder config build 我得到这个异常 java lang UnsatisfiedLinkError org apache hadoop io nativeio NativeIO
  • 由 Servlet 容器提供服务的 WebSocket

    上周我研究了 WebSockets 并对如何使用 Java Servlet API 实现服务器端进行了一些思考 我没有花费太多时间 但在使用 Tomcat 进行一些测试时遇到了以下问题 如果不修补容器或至少对 HttpServletResp

随机推荐

  • Testng学习笔记

    TestNG设计涵盖所有类型的测试 单元 功能 端到端 集成等 它需要JDK5或更高的JDK版本 TestNG是一个开源自动化测试框架 其灵感来自JUnit和NUnit的 TestNG环境设置 配置安装 TestNG是一个Java的框架 所
  • 在浏览器地址栏输入一个网址,从敲下回车键,到页面完全加载完毕,中间都发生了什么?

    1 如果地址栏中输入的是一个域名 浏览器会先使用自己的DNS缓存进行域名解析 转为IP地址 如果缓存中不存在 则会请求使用上层DNS 操作系统的DNS 操作系统会先查询本地HOST文件 如果HOST文件中不存在则会使用网络设置的DNS进行域
  • 关于 Q值

    先从大的方面来讲 从系统 从能量的角度来讲 Q值 描述任何可储能器件的性能 比如LC振荡回路 激光谐振腔 FP标准具 即Q 系统内能量 损耗功率 可见 Q值是储能器件受 振 荡驱动力和阻尼力的矛盾作用的结果 Q值越高 表示阻尼越小 当Q值
  • unity ugui序列帧动画

    使用unity自带的动画功能 1 使用unity自带的动画功能 2 在脚本中不停切换一个UI的图片以实现动画效果 1 使用unity自带的动画功能 2 在脚本中不停切换一个UI的图片以实现动画效果 using UnityEngine usi
  • 【配电网故障重构SOP】基于二阶锥松弛的加光伏风机储能进行的配电网故障处理和重构【考虑最优潮流】(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 电力系统最优潮流 综合考虑电网安全性和经济
  • c++哈希表-map&set (无序)

    简述 无序的map set 称为unordered map unordered set 采用迭代器遍历出来的元素是无序的 这是因此底层实现数据结构为哈希表 1 哈希表不同于红黑树 哈希表它的查找效率是o 1 一个常数的效率 虽然红黑树是o
  • 使用的chorm插件 留存自用

    使用的chorm插件 留存自用 保存一下常用的插件 省的以后忘记了 啊哈哈 掘金插件 每次打开浏览器都得看上几眼 JSON handle 在线json解析 不解释了 好用 PostMan 模拟api的网络请求 The Great Suspe
  • 浅谈ThreadLocal

    目录 一 ThreadLocal原理 二 TheadLocal特性 二 TheadLocal使用场景 一 ThreadLocal原理 1 每个Thread对象都含有一个ThreadLocalMap ThreadLocalMap是由Entry
  • node.js错误 --> node-pre-gyp install --fallback-to-build

    错误 node pre gyp install fallback to build 问题描述 在安装ghost博客的时候需要使用node js 但是在执行sudo npm install production的时候报了这个错误 接着百度 看
  • 饥饿和公平

    转自 饥饿和公平 下文笔者将讲述java多线程中的 饥饿与公平 的相关知识 如下所示 Java中饥饿与公平的概念 当一个线程因为CPU时间全部被其他线程获取而无法获取CPU运行时间时 我们将这种状态称之为 饥饿 此时此线程由于 饥饿 而无法
  • 最大公约数与最小公倍数 -- 3种计算方法详解

    目录 1 穷举法 最大公约数 思路 最小公倍数 思路 2 辗转相除法 最大公约数与最小公倍数 最大公约数思路 最小公倍数思路 公式 3 特殊方法 最大公约数 相减法 思路 最小公倍数 叠乘法 思路 总结 1 穷举法 最大公约数 思路 假设两
  • C/C++问题处理:error : no matching function for call to ‘max‘

    报错代码 MaxVal max MaxVal words i size words j size 上面的 words 是vector
  • vue的双向绑定原理---defineProperty->Proxy

    可以实现双向绑定的方法有很多 基于观察者模式 基于数据模型 Angular基于脏检查的双向绑定 本篇我们重点讲vue的基于数据劫持和发布订阅的双向绑定 vue实例化过程中进行了以下操作 initLifecycle vm initEvents
  • Android性能之内存泄漏

    和你一起终身学习 这里是程序员Android 经典好文推荐 通过阅读本文 您将收获以下知识点 一 什么是内存泄漏 二 Android中导致内存泄漏的主要几个点三 Java虚拟机内存管理四 Java内存几种分配策略 五 垃圾收集器是如何判断对
  • MATLAB环境下基于支持向量机、孤立森林和LSTM自编码器的三轴振动数据的机械异常检测

    本文讲解如何使用机器学习和深度学习来检测机械振动数据中的异常 属于异常检测领域 这玩意在工业中用的更多 因为工业中毕竟还是正常样本远多于故障样本 异常样本 运行环境为MATLAB R2021B 第三方面包多官网下载如下 正在为您运送作品详情
  • 因为一个bug来深入探讨下分页插件PageHelper

    事情来源是这样的 因为某些操作失误 在使用分页插件pageHelper时 因为这样一句不起眼的操作 竟然引发了一系列的灾难 下面来看下灾难的由来 Page localPage PageHelper startPage page limit
  • Linux WIFI 驱动实验(USB和SDIO方式)

    目录 WIFI 驱动添加与编译 向Linux 内核添加WIFI 驱动 配置Linux 内核 编译WIFI 驱动 驱动加载测试 wireless tools 工具移植与测试 wireless tools 移植 wireless tools 工
  • 数据结构循环链表,增删改查基本操作

    一 双向循环链表的描述 和单链表的循环类似 双向链表也可以有循环表 循环表的引进是为了弥补双向链表不能向前遍历的弊端 在双向循环链表中 头结点的直接前驱为尾结点 而尾结点的直接后继为头结点 二 双向循环链表的存储结构 三 双向循环链表基本操
  • VS2012:LNK4098: 默认库“MSVCRT”与其他库的使用冲突

    VS2012警告 LINK warning LNK4098 默认库 MSVCRT 与其他库的使用冲突 请使用 NODEFAULTLIB library 原因 在使用多线程调试dll MDd 模式的时候 lt 位置 配置属性 c c 代码生成
  • 大厂偏爱的Agent技术究竟是个啥

    搜索关注微信公众号 捉虫大师 后端技术分享 架构设计 性能优化 源码阅读 问题排查 踩坑实践 hello大家好 我是小楼 今天给大家分享一个关于Agent技术的话题 也是后端启示录的第3篇文章 通过本文你可以了解到如下内容 什么是Agent