5

00后程序员,2023年终总结 - 是你晨曦哥呀

 8 months ago
source link: https://www.cnblogs.com/chenxi001/p/17934081.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

00后程序员,2023年终总结

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

1808958-20231222004826007-1338447613.jpg

工作的三年#

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点才想起来自己还没吃晚饭。那一天,我真的很开心,也很激动。

1808958-20231222005818040-462405424.jpg

买房&装修#

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

1808958-20231222005941432-1491893569.png

1808958-20231222004734435-471741753.jpg

买房#

我一直关注着长沙的房价,平均价格在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把房子的事情弄好了。

幸福时刻#

1808958-20231222010049691-899110297.jpg

1808958-20231222010043247-1147495112.jpg

1808958-20231222010108097-1081815310.jpg

1808958-20231222010120457-438908633.jpg

1808958-20231222010126811-352051598.jpg

1808958-20231222010132070-1253518246.jpg

1808958-20231222010139168-868410644.jpg

1808958-20231222010146933-1849203035.jpg

1808958-20231222010150573-1294352441.jpg

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

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

1808958-20231222010624351-2049929624.png

技术栈(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不可用,支付通知将永远无法收到。

1808958-20231228101530527-1512082409.png

参考地址

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 协议就好了

1808958-20231227154806445-1097171006.png

官方解决方案

ApiSix 无法使用Https协议

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

展望未来工作的第六年#

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

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

三年后的自己立下Flag

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK