记录一次遗憾的实习经历
记录本次实习经历
2025年2月-7月,在加和科技ReachMax平台的实习经历,从应届生到技术成长的蜕变之路。
初入职场,从零开始2025年2月,作为一名即将毕业的应届生,我怀着忐忑又期待的心情加入了加和科技,负责公司核心平台ReachMax系统的研发工作。那时的我,对广告技术行业几乎一无所知,更别说RTA、DSP、SSP这些专业术语了。
技术成长之路从PHP到Go的跨越入职初期,我主要负责多个PHP模块的移植和重构优化。在这个过程中,我深刻体会到了技术栈迁移的挑战和机遇。从PHP的快速开发特性到Go的高性能并发处理,每一次代码重构都是一次技术能力的提升。
核心工作内容:
负责ReachMax系统核心架构优化,通过引入Redis缓存、消息队列和微服务架构,将系统响应时间从平均800ms优化至200ms,并发处理能力提升5倍,支撑日均千万级请求处理
参与ReachMax-AICR(代码审计服务)的开发,对Gitlab测试分支的提交做自动化评阅,显著提升了项目需求交付的可靠性
素材同步系统的深度开发最让我印象深刻的是素材同步系统的开发工作。这个系统需要对接爱奇艺、哔哩哔哩等7个媒体 ...
Go日志解析-xx科技笔试题解
Go日志解析-笔试题解此次笔试题目要求我们开发一个高性能的日志解析工具,能够从40万行标准Go日志中提取三种关键信息块:
数据竞争问题(Data Race)信息
Panic异常信息
运行时间超过20分钟的goroutine信息
关键挑战点:
需要通过HTTP下载远程日志文件
使用正则表达式精确匹配各类日志块
构建状态机处理复杂的panic日志格式
代码需通过并发测试(10个并发协程同时执行)
仅允许使用Go标准库
结果必须精确通过字符串断言测试
解题思路
解析工作分为三个核心部分:
1. 数据竞争信息提取使用正则表达式匹配以==================开头,包含WARNING: DATA RACE的日志块,一直到下一个==================结束。这些块包含了哪些goroutine之间发生了数据竞争。
2. 长时间运行goroutine提取使用正则表达式匹配包含运行时间信息的goroutine日志,提取出运行超过20分钟的goroutine信息。
3. Panic信息提取这里我实现了一个状态机来处理panic信息:
三个状态标志:isCollecting( ...
2024,成长与短暂的一年:我的技术成长不完全回顾
年末碎碎念又是一年的最后一天,窗外的雪花悄悄落下,伴随着键盘敲击的声音,我的代码和2024一起,都要画上句号了…(想象的)
回望这一整年,竟有些恍惚,仿佛前天还在挂机学习通,昨天在为春招疯狂复习面经,今天已经在为毕设焦头烂额。时间是写代码时最快的存在,不知不觉间,我的大四已经过去一半,我的大学生涯也已临近尾声…
项目中的成长大创IM系统:那些熬夜的痕迹接手这个项目可以说是我的技术转折点,从此知道了什么叫”看上去简单,做起来复杂”。
当我第一次写下new ServerBootstrap()时,完全没想到后面等着我的是:
消息延迟问题( “怎么群里发消息经常隔了好几秒才收到?”)
连接暴增( “怎么新建一个通话就要建立这么多ws链接?!”)
内存爆炸( “压测才一分钟服务器又OOM了…”)
解决这些问题的过程真是一把辛酸泪。但也正因如此,我对消息中间件、异步编程和分布式系统的理解达到了新高度。
最自豪的改进:将消息分发架构从单队列改为多级队列分片处理,吞吐量从320/秒飙升至940/秒,这段代码简直是我的得意之作,每次看到它正常运行都有种”看我的孩子长大了”的感觉。
Aki-RPC:从 ...
从零开始的RPC开发旅程-框架设计与核心协议篇 0x01
从零开始的RPC开发旅程-框架设计与核心协议篇 0x01
“好的开始是成功的一半,而一个优雅的协议设计则是RPC框架的灵魂。” —— 沃兹基索德
万恶之源:为什么需要RPC框架?记得那是一个普通的下午,咱们正在为一个分布式系统设计服务间的通信方案。面对复杂的网络环境和性能要求,我开始思考:为什么现有的RPC框架总是让咱们觉得不够”顺手”呢?要么太重,要么太轻,要么扩展性差,要么性能不够理想。
“为什么不自己设计一个RPC框架呢?一个既轻量又高性能,既易用又可扩展的框架。” —— 海斯涡
就这样,Aki-RPC的旅程开始了。(耶~~
1.第一步:协议设计首先咱们要做的,就是设计一个RPC协议。不过在设计自定义协议前,咱们最最最先需要思考的是:应该如何设计一个既高效又可靠的通信协议?这不得不提起TCP/IP协议的设计理念——分层和模块化。
首先什么是TCP/IP 协议?他的分层和模块化又是什么?TCP/IP协议的设计采用了分层结构,主要分为以下四个层次:
应用层:负责处理应用层协议,例如HTTP、FTP等。在RPC中,这一层是服务提供者和消费者交互的地方,包含了业务逻辑的处理。 ...
从零开始的RPC开发旅程0x00 - 一切的前言————Netty
导语:Netty 一切的开端
RPC(Remote Procedure Call)远程过程调用,简单理解是一个节点请求另一个节点提供的服务,这其中就涉及到了网络通信,Java做网络通信这块,离不开Netty框架。
咱们后端程序员想要进阶,绕不开Netty。如果你想探索更底层的网络模型,同样绕不开Netty。网络通信编程,是通往神级程序员的必经之路,其中涉及到的知识浩渺如海,但同时也能让你得到技术升华。加更多班
那么问题来了,Netty到底是什么?
Netty是一款基于NIO(Nonblocking I/O,非阻塞IO)开发的网络通信框架。它极大地简化了TCP、UDP等网络编程的复杂性,是当前Java网络编程的首选框架。
接下来,咱们一起深入了解Netty背后的核心概念和技术原理!
一、理解IO模型:网络通信的基础想象一下这个场景:应用A向应用B发送一条消息。这个看似简单的过程,背后涉及了哪些步骤呢?
应用A把消息发送到TCP发送缓冲区
TCP发送缓冲区将消息发送出去,经过网络传递
消息到达B服务器的TCP接收缓冲区
应用B从TCP接收缓冲区读取数据
看起来很简单,但问题就出在最后 ...
大数据去重神器:位图与布隆过滤器详解
前言最近总是在各大技术平台刷到这样一个经典面试题:
如何对40亿QQ号进行去重…
嗯?40亿?这个数字有点恐怖啊,按常规思路光存储起来都要占用不少内存,还要在此之上去重,想到这手就忍不住伸向了投降键…
别急,让咱们一起来看看有没有更聪明的解决方案。
在处理海量数据时,如何高效去重是一个常见问题。想象一下,如何对40亿QQ号进行去重?传统方法可能会占用大量内存,今天咱们就来探讨两种高效的数据结构:位图(Bitmap)和布隆过滤器(Bloom Filter)。
传统存储方式的问题首先咱们计算一下:存储40亿QQ号需要多少内存?
使用无符号整数存储时,一个整数需要4个字节(Byte),那么40亿QQ号需要:14 * 4,000,000,000 / 1024 / 1024 / 1024 ≈ 15GB
在实际业务中往往需要更多空间。而且在Java中并不存在无符号整型,只有几个操作无符号的静态方法。
数据单位换算:1GB = 1024MB,1MB = 1024KB,1KB = 1024Byte, 1Byte = 8b
n个小时后…终于存好了,接下来咱们开始计算吧!等等,存好了?真的吗?1 ...