00后程序员,2023年终总结

作为一个00后程序员,我回顾了过去三年的工作经历。我来自湖南衡阳,虽然互联网上常常开玩笑说我们00后炒主管、炒老板,但实际上我们也在不断努力变得更强。最近两年我没有写博客,不是因为懒,而是我荣升为了一位爸爸,肩上的责任更重了,工作上也需要积极主动承担自己的职责,顺便开发一个练手的物联网项目。

工作的三年

2020年中旬,我还在深圳的一家公司从事机房环境动力监控的工作。当时我在翻看手机时偶然看见了深圳房价,这让我望而却步,经过长时间的思考和斟酌,最后还是决定回长沙买房定居。长沙之前需要有两年的社保缴纳才有资格进行购房,在2023年9月之后政策放宽了(而且现在首付只需用20%,无需社保就可以进行购房)。在深圳的这几年中我也感受到了城市带来的热血和快节奏的生活,工资相对来说也比较高(但我记得自己当时在深圳实习时的工资也只有3.5k),经过一次跳槽,我的工资涨到了以w为单位。我第一时间给妈妈打电话,颠覆了她对我的认知。

开始打工
刚开始工作时,我经常浏览博客园,渴望获取知识。我盲目地追求技术,经常看到大佬们在群里讨论某个技术,我就立即去学习,但只是学会了如何使用,对技术原理一无所知。我像一只无头苍蝇一样,刚刚毕业时看到别人在讨论微服务网关(Ocelot),就参考别人的博客写了一个Demo,觉得自己可以了。现在回想起来,我当时有点幼稚。实习半年后,我意识到高大上的东西并不实用,工作中更需要关注业务理解和编码基础。于是我在B站学习了C#的基础知识,才发现学校没有教过的特性、反射、拦截器、委托、表达式目录树等等。实习后半年,我一直在加强基础知识,每学会一个知识点,都感到非常清爽。原来这才是我渴望的知识。在工作中遇到一些技术难题时,我也能游刃有余。后来,我开始学习C#内置方法和一些优秀的项目的源码。我将学到的知识点写成博客,以防忘记,并养成了编写博客的良好习惯。

我跳槽
在那里实习了一年结束实现期。我还记得技术总监找我谈话,说我表现很好,公司对我的能力非常认可,将我的工资从之前的3.2k涨到了6k。但是告诉我实习期结束后会有三个月的试用期,工资只有80%。我对此感到不高兴,但没有说出来,而是去外面面试。在准备简历的这几天里,公司突然提前给我转正了,但已经晚了,我的简历都已经准备好了。于是我出去面试,当时我拿到了4个offer,最低的工资都达到了8k,我还干个毛,上午签完转正合同,下午提离职 光速离职进行中,南山西丽报道去。

新公司
在新的公司,我结识了新朋友,至今我们仍保持联系。我的领导非常好,经常与我保持联系,帮助我解答困惑。我们使用的技术非常新颖,我第一次接触到了微服务。我们为XX银行开发了一套机房环境动力监控系统,学习了很多新技术,如Redis、CAP、Kafka等微服务架构。我们编写了xshell脚本,实现了一键部署,因为我们需要将系统部署到全国各地的XX银行机房,这样实施人员只需要拷贝安装包,执行安装脚本,就可以下班了。在这里,我学到了很多东西,特别感谢我的领导。说实话,我也不清楚为什么最后离职了。公司在西丽有宿舍,不用支付水电费,基本上只需要自己负责吃饭,基本上没有什么花销。领导对我也非常好,现在回想起来还有点迷茫。最后,我只能归结为我想回长沙买房,本来我计划买房后回深圳,但现在有了孩子,所以不舍得哈哈。

回长沙打工
回到长沙后,我加入了一家加班很严重的公司。基本上每天工作时间都在11个小时左右,整个部门的开发人员都是如此。由于与直接领导 理念不合,我在这家公司工作了8个月后最终选择离开。实际上,我理解大家都想向上爬,追求更高的收入。我们很多人也知道这种加班的状态不可持续,但没有人能够改变这种环境,最后大家都随波逐流,被加班文化卷走。

结婚&生子

2022年6月23日和我老婆办理了结婚手续,2022年11月19日迎接了可爱的女儿的诞生

是的,我是奉子成婚的。实话实说,当我得知自己即将成为父亲时,我真的很迷茫。我曾经想过要不要做人流,因为我担心自己无法承担起一个家庭的重任。但是,经过深思熟虑,我决定承担起这份责任,成为一个父亲。在2022年11月19号,我迎来了自己的小棉袄。那天,我一直守在老婆的床边,看着她和孩子睡觉,直到凌晨4点才想起来自己还没吃晚饭。那一天,我真的很开心,也很激动。

买房&装修

因为我买的是二手房,装修我是自己找人装修的,就结合我自身理解,讲一些个人建议。

买房

我一直关注着长沙的房价,平均价格在1w左右,我自己回长沙租住在荣盛的一个小区,三房两卫一厅一车位每月2330元,居住了一年多对这个小区还是比较满意的。我在安居客上查看小区均价在8.5k左右,当时我觉得这个价格还算低的,我原本计划着存30w首付,买一个100平的房子,看到这个价格我就有提前买房的冲动了(首付还没有存够)。我联系了一位中介带我去看房,我们小区的房子有的人挂8k/8.5k/1w/1.1w,其实这些价格都是他们自己高估值,都可以砍价。开始时我这个房子113平90w,挂了几个月都没有成交,后来减少到85w,但是卖家想尽快回款,让我使用商贷少一万,就是84w,当时我们就去中介公司谈了一下,我觉得这个价格还可以再少一些,我就直接说83w,如果可以就现在签合同(房子的户型是我和我老婆很喜欢的),从看房子到签合同只用了一周时间就成功上车了。

我们小区我经常看法拍房有一次我没有钱97平 65w被别人一拍拿下了。买二手房需要关注房子是不是满五唯一,满五唯一不需要个税,可以省1w多。
不过现在看来我卖这个房子并没有优惠多少,买的还是比较急了,现在长沙放开了房产证满4年就可以交易,我们小区最近120+多套挂牌销售,之前只有一期的房子满五年了。买完房之后也听我老婆说小区有人因为缺钱,把自己装修好的房子按照购房时候的价格出售了,现在我们小区挂牌价也到了8k左右了,说明小区急卖的多了,卖方着急用钱,就不会对自己的房子抱有一个高估值。可以看看法拍房的估值价格,知道这个小区市场低价是多少,根据自己谈判增加金额,我感觉我这个房子当时说80w也可以买到,因为房东缺钱,急需回款。房子成交价格是83w 中介公司收取2%手续费,还想收我金融手续费就是帮忙贷款的费用2%,我当时就不愿意了,我们可以自己找银行进行贷款,为啥你帮我贷款还要收我1w多,中介一直说防止征信最后贷款下不来,定金就收不回了,我的征信这么好,我发泡反正就是不听。最后就是我自己在招商银行进行贷款的,省了1w多,其实中介收取的2%手续费也可以谈,我不懂吃了亏,因为这个房子其实在很多中介都挂了,那家给我更低找那家签就好了,还有就是其实如果可以自己找到一手卖方,就不要走中介公司省掉手续费,如果你足够勤快,中介其实都不用,中介只是利用信息差赚钱。一开始我自己找了一手卖家相同的户型110平二期送车位,房产证满4年,没有满5年不能过户,只需要83.8w,我不敢买,但是最近放开正常房产证满4年就可以过户了,不然我自己找的才是最好的选择。

为什么大家都是买房买房,没说要装修呀(装修花费可以再付一套首付了)
我刚刚买完房子,也是想找装修公司,装修但是报价全包都是20W+ ,本来想半包给装修公司但是一般别人不愿意接半包利润太少,不愿意做,我就自己就没日没夜的在抖音,B站查看清包(自己找装修工人),周末的时候就和老婆在小区溜达,留意别人装修工人信息,最后磕磕绊绊的花了17w把房子的事情弄好了。

幸福时刻

日请求量1亿+的物联网项目

这个已经是已经很成熟的行业了,我只是因为朋友自己的公司不喜欢用别人公司系统,而开发的。2022年正式立项一共开发了两个版本V1版本,V2版本。从一开始投入100个用户进行测试,到现在100w用户,30w+在线用户,前端&后端都是我一个人编写,两年的时间我呼吸过无数个凌晨的空气,在不同用户体量级别,我也遇到过多次挑战。

技术栈(Mysql & ES & Redis & Minio 都是自建服务)

1.前端: Uniapp 编写H5 Vue3 编写管理后端
2.后端: .Net 6 .Net 7 Java
3.数据库: Mysql + FreeSql
4.网关: ApiSix + Nginx
5.缓存: Redis + FreeRedis
6.大数据存储: Elasticsearch
7.APM:Skywalking
8.消息中间件:Kafka
9.部署环境:Linux + Docker
10.自动发布:Shell 脚本
11.定时任务:Quartz
12.设备交互协议:Mqtt Http
13.文件存储:Minio

遇到过的问题

Http协议设备通讯5秒一次交互击溃服务

一开始我们上线的设备是http 协议进行设备信息交互,这个厂家默认心跳是5秒一次,一开始上线10,100,1000个用户就发现问题,服务假死,Swagger 页面都打不开。这个问题差点的就击溃了我的道心,解决方案是控制设备心跳时间设置为3分钟,但是厂家的程序员有点傻,自己的文档写了设置心跳指令,最后自己居然没有实现,最后使用MemoryCache 缓存针对设备进行限流,3分钟之内只能通过一个请求,最后这家厂商上线5k设备,我就要商家换厂家了哈哈。换成支持Mqtt协议的厂家

MQTT设备流量服务内存激增

当用户日活体量到W级别的时候,出现服务器内存报警,我发现32G内存占用99%,我所有服务全部容器化了,使用docker stats命令查看到设备流量服务占用20G内存,我直接重启了该服务内存占用马上就下来了,但是过了一个晚上,我再看设备流量服务 内存又到13G了,之前在园子里也经常看,别人定位某个服务假死&内存&CPU飙升案例。
Dockerfile文件 添加安装 dotnet-dump&dotnet-trace

RUN dotnet tool install -g dotnet-dump \
    && dotnet tool install -g dotnet-trace

进入容器内部docker exec -it {容器Id} /bin/bash
查看容器内部运行进程Id dotnet-dump ps
通过指定的进程id创建dump文件 dotnet-dump collect --type heap --process-id <ProcessId>
我将dump 包放在本地,直接使用VS 打开分析,发现MQTT消息持有了10G占用,也就是说我的内存都是被MQTT 消息吃掉了,查看kibana面板发现设备消息消费出现了延迟了几个小时。
优化之前的代码:

          _mqttClient.ApplicationMessageReceivedAsync += arg =>
          {
            // .....消息消费代码....
          }

单个线程排队消费消息,那我肯定是加线程呀,直接冲就完了。
优化之后的代码:

        _mqttClient.ApplicationMessageReceivedAsync += async arg =>
        {
            await semaphore.WaitAsync();
            _ = Task.Run(async () =>
            {
                  // .....消息消费代码....
            }).ConfigureAwait(false);
            return;
        };

确实在这一段时间内,解决了内存激增的问题了。

学习链接:https://www.cnblogs.com/huangxincheng/p/17865096.html

Redis 服务不可用

好景不长,我看商家一天几千单的卖,日活用户很快突破10w大关,端午节的一个中午,我收到了系统服务告警通知,设备流量服务挂了,服务心跳接口访问卡死,kibana面板没有日志输出了,我进入docker 容器内部一直提示
【XXX】Next recovery time: 05/20/2023 15:14:41 (Connect to redis-server(XXX) timeout)
【XXX】Next recovery time: 05/20/2023 15:15:06 (Connect to redis-server(XXX) timeout)
【XXX】Next recovery time: 05/20/2023 15:15:31 (Connect to redis-server(XXX) timeout)
【XXX】Next recovery time: 05/20/2023 15:14:56 (Connect to redis-server(XXX) timeout)

直接痛苦面具出来了,重启服务都没有用,进行了很多测试,一直怀疑是Csredis 的问题,各种连接参数调整,都没有作用,后面讲CsRedis全部换成FreeRedis,还是不行裂开(StackExchange.Redis 也尝试过),最后删除Task.Run(()=>{})单线程执行,启动多个设备流量服务 ,修改设备上送时间为10分钟一次。这个问题尝试了半个月的测试,最后定位为线程开启过多了,最后代码修改为

        // 开始一个80个线程信号量,控制可以进入多少个线程
        var semaphore = new SemaphoreSlim(80);
        _mqttClient.ApplicationMessageReceivedAsync += async arg =>
        {
            await semaphore.WaitAsync();
            _ = Task.Run(async () =>
            {
                try
                {
                   // 处理代码
                }
                catch (Exception e)
                {
                  // 处理代码
                }
                finally
                {
                    // 归还线程
                    semaphore.Release();
                }
            }).ConfigureAwait(false);
            return;
        };

Csredis Issues
FreeRedis Issues

支付回调失效(查单补偿)

我们需要开启一个定时任务异步查询微信订单接口进行补偿。V1 版本系统主要依赖微信异步回调请求,接收到支付成功信息。但短板在于,如果微信没有支付成功的异步回调,订单就无法正常完成。之前客服反馈过,V1 版本过于依赖微信支付成功主动通知,如果异步回调通知notify_url不可用,支付通知将永远无法收到。

参考地址

Mysql 数据库连接耗尽

这个问题也是最开始自建mysql,当体量剧增出现的问题Too many connections mysql 默认最大链接数是151,允许的最大连接数是 16384,问题就是当前系统运行需要占用更多的链接数,处理这个问题我们只需要调整Mysql 最大链接数数量,设置服务链接字符串Max pool size

max_connections 设置多少合适?

理想公式:

服务器响应的最大连接数值占服务器上限连接数值的比例值在10%以上,如果在10%以下,说明mysql服务器最大连接上限值设置过高。
查看服务器响应最大连接数
show global status like 'Max_used_connections';

验证最大连接数值是否合理
Max_used_connections / max_connections = 215/1000 ≈ 21.5%

Mysql 主从模式延迟过高【未解决】

我使用的是binglog 订阅进行主从同步的,目前这个问题没有解决,暂时先挖一个坑

Uniapp H5 提示网络不可用请刷新

当系统用户越来越多了,就有客服反馈h5出现,如下的错误页面,一般让客户刷新页面就可以正常显示,但也有客户死活不行,最后压力给到我这边。最后根据官方给出解释,我将前端协议改成Https 协议就好了

官方解决方案

ApiSix 无法使用Https协议

这个真的很坑人,因为之前的问题,我必须让前端使用https协议,但是我的网关协议是http,而且走的是9080端口。我按照官方文档尝试了很多方法,但都不行。后来我发现ApiSix的9443端口是https协议,我就配置了证书,但是一直不生效,这个问题困扰了我好几天。最后我在GitHub上提问,有个建议让我升级到最新版本,这样就解决好了。
Issues

展望未来工作的第六年

回想工作的这三年,从行业窥探者转变为行业前行者,从行业小白到行业大白,刚工作时曾经也幻想过,三年后的自己,技术是不是很厉害了,自己有没有买车,自己有没有买房,自己有没有月薪过W,自己有没有女朋友,自己有没有一夜暴富。

三年前的自己,看现在的自己,一定会感到自豪吧,从两袖清风,到裤带空空也是一种幸福,在这里我想对三年后的自己说,希望能够一直保持着热情&积极且主动,保持着一颗学习的心,对于技术保持一颗追求原理精神,自己也需要多学习关于技术以外的知识,自己多抽出一些时间陪伴家人。

三年后的自己立下Flag

  • 报考驾照
  • 买车
  • 看20本书(技术或者软实力)
  • 自己的技术更有深度
  • 保持运动(目前是每天自行车通勤)
  • 物联网卡系统能够盈利