当前位置: 首页 > news >正文

埋点日志解决方案——Golang+Gin+Sarama VS Java+SpringCloudGateway+ReactorKafka

埋点日志解决方案——Golang+Gin+Sarama VS Java+SpringCloudGateway+ReactorKafka

之前我就写过几篇OpenResty+lua-kafka-client将埋点数据写入Kafka的文章,如下:

Lua将Nginx请求数据写入Kafka——埋点日志解决方案

python定时任务执行shell脚本切割Nginx日志-慎用

nginx+lua写入kafka报buffered messages send to kafka err: not found broker

关于OpenResty+doujiang24/lua-resty-kafka写入kafka故障转移模拟测试

以上一步一个坑,有些是自己能力不够踩的,有些是为了解决某个问题踩的,最后终于消停的一阵。但又出现新问题了,这次问题没那么紧急,但比较重要。
按照一般的剧本,上面的坑都踩完,基本上也就不会怎么去改这个服务,但新的问题还是出现了,就是容器化部署基础镜像要升级,从原来的debian10升级成了debian11,当然这是大版本,小版本几乎没周都会升级,升级时也不会通知项目组测试,运维直接升。在debian10升级debian11的时候,出现了一个问题细思极恐,就是zlib升级其中一个方法签名变了,导致我们lua脚本报错了,我们发现了这个问题,由此引出来一个担忧:运维升级小版本的时候会不会升级到某个我们用到的运行库导致线上出问题。评估下来发现非常有可能,因为运维升级镜像是基于一个镜像扫描软件,这个软件经常会扫描出诸如openssl这种组件的问题,要求运维在一个月内升级完成。这就很有可能影响到我们。并且,我们在升级kafka server的时候发现doujiang24出品的kafka-client很难像社区一样保持活跃更新,支持一些kafka新特性,并且有问题也难以求助(虽然上次得到他本人的回复,但一个人总比一群人回复问题滞后一些)。

解决思路

思路1

运维升级的时候通知到对操作系统组件敏感的我们,由我们评估是否需要跳过本次升级。这个比较难判断,因为我们项目组也无法精确的判断哪些组件一定会影响到我们,考虑不使用

思路2

将底层可能影响我们的组件进行后置,比如gzip和aes,放在kafka后面的flink去做,而不是在Nginx这里就处理掉。这个思路能避免底层升级带来的大部分影响,但是kafka驱动升级问题无法避免,考虑不使用

思路3

我们还有其它服务都是用Java做的,正式因为有JVM这一层的存在,我们才不怕操作系统的升级,是不是可以用Java实现,从而避免此问题。这个思路能解决上面的担忧,但是性能需要做测试,即使用NIO,想要达到目前的TPS,还是需要一定资源的,因为OpenResty和Java,达到同样的TPS,内存使用量差距还是很大的。这个思路保留,做进一步测试。

思路4

可不可以保持低资源高性能,又用一个中间层屏蔽操作系统组件升级带来的影响呢?这时我想到了golang。这个思路保留,做进一步测试。

思路5

这个项目本来的架构式OpenResty+Apache Flumed,是不是可以还原到这个架构,把OpenResty中的组件后置到Flumed中?这个也被否决的,原因有以下几点:

  1. 如果把OpenResty和Flumed部署到同一个容器中,因为公司标准的监控只能监控其中一个进程,如果某个进程挂了,可能无法监测到,这个问题在之前遇到过,一个容器内起了一个OpenResty和5个Flumed进程,其中某个Flumed进程挂了好久才知道
  2. 如果OpenResty和Flumed分开部署,在不同的容器中,需要挂载网络磁盘,这个网络磁盘并不可靠且会受网路带宽限制,性能较差
  3. 这个思路还有个问题就是Flumed设置多少条数据进行保存读取位点,设置的大了,容器重启会丢数据,设置小了性能不够,找这个平衡点要耗费大量的时间和资源
    这个思路因为OpenResty和Flumed在一个容器和不在一个容器都有一些问题,考虑不使用

尝试

尝试golang实现
go 1.20.10
gin 1.9.1
sarama 1.41.3

我花了几天的时间将其实现,初步性能测试结果如下:
1个CPU核心,1G内存,100并发,每个请求发5个埋点,TPS是731
最终CPU使用率47%,内存使用0.93G
本思路一开始和架构师讨论的时候只是说理论上可行,尝试一下,但谁心里都没底。在收集资料的时候偶然遇到了知乎大佬又拍云的文章【实战分享】使用 Go 重构流式日志网关,有此思路的成功上线的先例,信心大增。

尝试Java实现
Spring Cloud Gateway 3.x
Reactor Kafka 2.x(主要是和kakfa-server对应)

1个CPU核心,2G内存,100并发,每个请求5个埋点,TPS是430
最终CPU使用率60%,内存使用1.2G

结论

OpenResty+lua实现的测试结果是
1个CPU核心,1G内存,100并发,每个请求5个埋点,TPS是421
最终CPU使用率60%,内存使用0.6G

根据OpenResty方案来看,Golang和Java实现差距不是特别大,Golang展现的明显的性能优势,但是公司对Golang项目的配套做的并不好,比如实时监控,基础镜像,Golang工程师等。对Java项目比较齐全。目前初步综合考量两个项目均进入UAT环境使用专用压测机进行压测。

压完我再来补充结果。

以下log一下Sarama向Kafka发消息:

var KafkaProduce sarama.AsyncProducerfunc InitKafkaConfig() error {config := sarama.NewConfig()// 配置// 等待服务器成功后的响应config.Producer.RequiredAcks = sarama.WaitForLocal// 随机向partition发送消息config.Producer.Partitioner = sarama.NewRandomPartitioner// 是否等待成功和失败后的响应,只有上面的RequireAcks设置不是NoReponse这里才有用config.Producer.Return.Successes = trueconfig.Producer.Return.Errors = true// KafkaClientIpList是[]string类型 值为kafka地址+端口号 一般是3个client, err := sarama.NewClient(KafkaClientIpList, config)if err != nil {return err}producer, err := sarama.NewAsyncProducerFromClient(client)if err != nil {return err}//这个一定要有,不然kafka消息发上一定数量直接就发不动了 //原因是你往 KafkaProduce.Input()发消息 会存在本地 不会真正发送到kafka//本地开的内存空间用完了 就卡住了go func(producer sarama.AsyncProducer) {errors := producer.Errors()success := producer.Successes()for {select {case er := <-errors:if er != nil {log.Errorf("Produced message failure: %s", er)}case msg := <-success:log.Infof("Produced message success topic: %s", msg.Topic)}}}(producer)KafkaProduce = producerreturn nil
}func DestroyKafkaProducer() {if KafkaProduce != nil {KafkaProduce.Close()}
}//消息发送
func SendKafkaAsyncMessage(msg string, topic string) {//写入kafkaKafkaProduce.Input() <- &sarama.ProducerMessage{Topic: topic, Key: nil, Value: sarama.StringEncoder(msg)}
}

相关文章:

埋点日志解决方案——Golang+Gin+Sarama VS Java+SpringCloudGateway+ReactorKafka

埋点日志解决方案——GolangGinSarama VS JavaSpringCloudGatewayReactorKafka 之前我就写过几篇OpenRestylua-kafka-client将埋点数据写入Kafka的文章&#xff0c;如下&#xff1a; Lua将Nginx请求数据写入Kafka——埋点日志解决方案 python定时任务执行shell脚本切割Nginx…...

LeetCode 541 反转字符串 II 简单

题目 - 点击直达 1. 541 反转字符串 II 简单1. 题目详情1. 原题链接2. 题目要求3. 基础框架 2. 解题思路1. 思路分析2. 时间复杂度3. 代码实现 1. 541 反转字符串 II 简单 1. 题目详情 给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个…...

从入门到精通:深入了解CSS中的Grid网格布局技巧和应用!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一…...

Android Studio Giraffe 添加 maven { url “https://jitpack.io“ }报错

Android Studio Giraffe 添加 maven { url “https://jitpack.io” }报错 settings.gradle.kts:13:21: Unexpected tokens (use ; to separate expressions on the same line)解决方法 新版maven写法发生了改变&#xff1a; maven { url uri("https://jitpack.io"…...

Linux C/C++ 实现网络流量分析(性能工具)

网络流量分析的原理基于对数据包的捕获、解析和统计分析&#xff0c;通过对网络流量的细致观察和分析&#xff0c;帮助管理员了解和优化网络的性能、提高网络安全性&#xff0c;并快速排查和解决网络故障和问题。 Linux中的网络流量常见类型 在Linux中&#xff0c;网络流量可以…...

python门牌制作,统计某个数字出现的次数

题目&#xff1a; 小蓝要为一条街的住户制作门牌号。 这条街一共有 2022位住户&#xff0c;门牌号从 1 到 2022 编号。 小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符&#xff0c;最后根据需要将字符粘贴到门牌上&#xff0c;例如门牌 1017 需要依次粘贴字符 1、0、1、…...

轻量封装WebGPU渲染系统示例<7>-材质多pass(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/version-1.01/src/voxgpu/sample/MultiMaterialPass.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据和渲染机制分离。 …...

0030Java程序设计-积分管理系统论文

文章目录 摘  要**目  录**系统实现系统功能需求3.2.1 管理员功能3.2.2 柜员功能 开发环境 摘  要 随着计算机和网络的不断革新&#xff0c;世界已经进入了前所未有的电子时代。作为实用性强、应用范围广泛的会员管理系统也正在被越来越多的各类企业用于消费管理领域。然…...

H5游戏源码分享-考眼力游戏猜猜金币在哪

H5游戏源码分享-考眼力游戏猜猜金币在哪 <!DOCTYPE html> <html> <head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><meta charset"UTF-8"><meta name"apple-mobile-web-app-capa…...

2023 年值得关注的国外网络安全初创公司

网络安全初创公司试图解决的问题往往有点超前于主流。他们可以比大多数老牌公司更快地填补空白或新兴需求。初创公司通常可以更快地创新&#xff0c;因为它们不受安装基础的限制。 当然&#xff0c;缺点是初创公司往往缺乏资源和成熟度。公司致力于初创公司的产品或平台是有风…...

搞定蓝牙-第六篇(HID

搞定蓝牙-第六篇&#xff08;HID&#xff09; ble与HIDHOGPGAPP与HID ESP32程序分析 ble与HID HOGP 我们发现&#xff0c;电脑连接了蓝牙键盘就可以直接使用了&#xff0c;不需要配置任何东西&#xff0c;那么&#xff0c;这两者是怎么通讯的呢。我们使用的电脑windows系统内…...

Open3D(C++) 最小二乘拟合平面(直接求解法)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。 一、算法原理 平面方程的一般表达式为: A x + B y + C...

lua移植及使用

编译环境&#xff1a;Ubuntu16.04 64位 交叉编译工具&#xff1a;arm-hisiv500-linux-gcc 文章目录 1. 项目背景2. lua开源版本选择3. 封装代码3.1 源码简介3.2 封装类3.2.1 头文件3.2.2 类的实现3.3.3 sample代码 1. 项目背景 使用lua脚本&#xff0c;读取key对应的值&#x…...

【鸿蒙软件开发】ArkTS基础组件之Select(下拉菜单)、Slider(滑动条)

文章目录 前言一、Select下拉菜单1.1 子组件1.2 接口参数 1.3 属性1.4 事件1.5 示例代码 二、Slider2.1 子组件2.2 接口参数&#xff1a;SliderStyle枚举说明 2.3 属性2.4 事件SliderChangeMode枚举说明 2.5 示例代码 总结 前言 Select组件&#xff1a;提供下拉选择菜单&#…...

linux ssh 免密登录

概述 在大数据测试环境搭建时&#xff0c;经常会用到 ssh 免密登录 &#xff0c;方便机器之间分发文件&#xff0c;从一个机器上登录至其它机器也方便 如何配置 linux 的 ssh 免密登录? 非免密登录 端口是22 [rootKS8P-Test-K8S06 ~]# ssh KS8P-Test-K8S06端口非22 [roo…...

秒级启动的集成测试框架

本文介绍了一种秒级启动的集成测试框架&#xff0c;使用该框架可以方便的修改和完善测试用例&#xff0c;使得测试用例成为测试过程的产物。 背景 传统的单元测试&#xff0c;测试的范围往往非常有限&#xff0c;常常覆盖的是一些工具类、静态方法或者较为底层纯粹的类实现&…...

Redux 数据仓库

Redux 数据仓库 解决React 数据管理&#xff08;状态管理&#xff09; &#xff0c;用于中大型&#xff0c;数据比较庞大&#xff0c;组件之间数据交互多的情况下使用。 作者&#xff1a;如果你不知道是否需要使用Redux,那么你就不需要它&#xff01; 解决组件的数据通信。 …...

[毕设记录]@开题调研:一些产品

我感觉产品能代表落地的一些实际应用&#xff0c;会和研究的角度有些差别&#xff0c;但是需求和兴趣往往是从现实中来的&#xff0c;在上一篇blog里面看外国blog的时候顺着搜搜到了很多国外的智慧校园chatbot解决方案 文章目录 Comm100streebomodern campusUniBuddy Comm100 …...

CSS3中的字体和文本样式

CSS3优化了CSS 2.1的字体和文本属性&#xff0c;同时新增了各种文字特效&#xff0c;使网页文字更具表现力和感染力&#xff0c;丰富了网页设计效果&#xff0c;如自定义字体类型、更多的色彩模式、文本阴影、生态生成内容、各种特殊值、函数等。 1、字体样式 字体样式包括类…...

LVS集群-DR模式【部署高可用LVS-DR集群】

文章目录 2.2 实战&#xff1a;配置LVS-DR集群2.2.1 配置IP&#xff08;Director Server的部署配置&#xff09;2.2.2 生成ens33:1配置文件 &#xff08;Director Server的部署配置&#xff09;2.2.3 配置LVS-DR规则&#xff08;Director Server的部署配置&#xff09;2.2.4 两…...

Win11Debloat:让你的Windows系统告别臃肿,重获极速体验的完整指南

Win11Debloat&#xff1a;让你的Windows系统告别臃肿&#xff0c;重获极速体验的完整指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other chang…...

AI音乐操作手册:从输入提示词到导出发布全流程

现在 AI 写歌工具已经不只是生成一段背景音乐&#xff0c;很多工具都可以从文字描述直接生成带人声的完整歌曲。真正影响体验的不是工具名字有多热&#xff0c;而是它适不适合当前场景&#xff1a;中文歌词、短视频配乐、个人纪念歌、细分曲风或者二次编辑&#xff0c;判断标准…...

Unitree GO2四足机器人ROS2开发终极指南:从零到自主导航的完整教程

Unitree GO2四足机器人ROS2开发终极指南&#xff1a;从零到自主导航的完整教程 【免费下载链接】go2_ros2_sdk Unofficial ROS2 SDK support for Unitree GO2 AIR/PRO/EDU 项目地址: https://gitcode.com/gh_mirrors/go/go2_ros2_sdk 你是否曾经梦想过让四足机器人像真实…...

3分钟快速上手:AutoCAD字体管理终极方案FontCenter完整教程

3分钟快速上手&#xff1a;AutoCAD字体管理终极方案FontCenter完整教程 【免费下载链接】FontCenter AutoCAD自动管理字体插件 项目地址: https://gitcode.com/gh_mirrors/fo/FontCenter 还在为AutoCAD字体缺失问题烦恼吗&#xff1f;每次打开同事的图纸都遇到文字乱码、…...

Files.md:打造私密思考空间,兼具简洁实用与多样同步功能!

Files.md&#xff1a;专注思考的私密空间Files.md 是一款简洁的 .md 文件应用&#xff0c;为用户打造一个私密、安静的思考空间。用户可以用它存储生活中的一切&#xff0c;如笔记、文档、项目、日记、习惯记录、待办清单和任务等&#xff0c;所有内容都以纯 .md 文件形式保存&…...

Suno.cn从工具到生态,AI音乐平台的崛起、挑战与本土化之路

2026年,Suno已从一款“文字生成音乐”的玩具,成长为估值25亿美元、年营收超3亿美元的全球AI音乐巨头。然而,在版权风暴与本土化浪潮中,它的故事远未结束。 🚀 一、市场地位与商业成功:Suno的狂飙突进 Suno在2026年的增长堪称现象级。其首席执行官Mikey Shulman宣布,平…...

蓝牙、Wi-Fi、5G、NB-IoT四大无线技术核心差异与选型指南

1. 无线通信技术全景概览&#xff1a;从身边到万物每天一睁眼&#xff0c;我们就被各种看不见的“波”包围着。手机自动连上家里的Wi-Fi&#xff0c;耳机里传来蓝牙音箱的音乐&#xff0c;出门后手机信号满格&#xff0c;甚至街边的智能路灯、家里的智能电表&#xff0c;都在悄…...

告别手动!用Windows批处理脚本批量重命名MKV音轨(MkvToolnix v73实战)

告别手动&#xff01;用Windows批处理脚本批量重命名MKV音轨&#xff08;MkvToolnix v73实战&#xff09; 每次整理下载的剧集资源时&#xff0c;最让人头疼的莫过于音轨信息错乱——明明视频是国语配音&#xff0c;音轨标签却显示为日语。手动修改不仅效率低下&#xff0c;还容…...

告别SU冲突!雷电模拟器9.0.20+新版Magisk Delta(狐狸面具)保姆级安装避坑指南

雷电模拟器9.0.20Magisk Delta深度适配指南&#xff1a;从冲突根源到完美兼容 当你在雷电模拟器9.0.20及以上版本尝试安装Magisk Delta&#xff08;狐狸面具&#xff09;时&#xff0c;是否遇到过Root权限反复失效、SU冲突提示不断弹出的困境&#xff1f;这背后隐藏着新版模拟器…...

图数据库 TuGraph 基本操作 作业一

一、基础知识介绍(一) 图数据库图数据库以顶点 (Vertex / Node)、边 (Edge / Relationship) 与属性 (Property) 三种元素表达事物及其关联关系。顶点对应实体, 边对应实体之间的关系, 属性以键值对形式附着在顶点或边上。相较关系数据库, 图数据库把 "关系" 提升为存…...