在一开始我仅仅对 Node.js 这个技术栈比较感兴趣,但是随着项目的进行,我发现 Node.js 也仅仅是后台服务开发的冰山一角,你需要考虑的更多,需要对很多的技术领域进行学习,它们可能并不是你感兴趣的,例如 CICD、日志传输、火焰图分析、分布式架构设计,但是只要坚持下去,你会发现很多有趣的 idea,本文也是希望将自己的探索之路分享给大家,亦作参考。
Node.js 目前已经诞生了 11 年,相信各位前端爱好者或多或少已经学习或者实践过了。一般当 Node.js 项目成长到一定阶段后,就不可避免要遇到许许多多的事故,例如服务器无故宕机,线上逻辑出现问题,其中的排查手段多种多样,但是我认为最好的还是拥有细致的上报,是排查这些问题的利器。
本文会涉及一些内部系统,大家理解思路即可,不用过分纠结具体的系统。
根据业内比较标准的日志服务场景,主要有以下四种场景:
本文会针对这些常见给出一些解决方案的选择经验,也会配合一些事故案例来和大家一起讨论。
首先给大家描述下后台服务所面临的日志背景,这里以我所开发的系统架构为例:
涉及到前端调用、服务器调用、调用第三方服务、存储,在项目初期的时候,由于缺乏完善的日志服务,在面临线上请求错误路径排查、业务故障定位,几乎只能全靠程序员的技术第六感来猜测可能的事故点,因此每次上线新功能都是极其紧张的,也就逼迫着自己去探索和设计完善的日志上报体系。
虽然日志设计很复杂,但是得益于 Node.js 社区生态已经逐渐完善,你可以去根据业务场景也进行灵活选择上报技术、日志分析技术和日志报表技术,本文将在这里对常规日志技术选型进行下简单分类。
上图则展示常见日志技术选型时应当考虑的技术因素。
这里给大家介绍下本项目的分梯度的日志存储结构,以供参考。
本项目采用团队内部框架(IMServer)集成的日志能力,将数据库日志、请求日志、POD 运行日志等细节日志存储到本地 dist/log 文件夹下,一个 Worker 一个单独的文件且标明时间和 Worker 索引,每 24h 清空一次日志文件。
本地日志是最详细的日志了,往往会占用比较大的内存空间、CPU、IO 读写,因此本地日志不可以无脑全部写入,还是希望开发者能够做区分,保留核心日志,减少内存和 CPU 的占用,这是降低服务器成本、提升服务载荷的一个关键手段。
本地日志相对于远程日志来说具有更好的稳定性,但是日志由于占据服务器宝贵的内存而无法长期保存,因此可以定期转存到腾讯云日志服务等稳定且长期保存的服务中。在本项目中是使用内部容器平台(TKEx-CSIG),该平台使用了腾讯云日志服务(CLS)的日志上报方案,可以将日志文件定期上传到 CLS 即星迹平台上。具体如何使用呢?
首先在内部容器平台(TKEx-CSIG)的日志规则中,增加日志集、日志主题、日志文件目录的配置,如下图:
最终我们在 CLS 平台进行日志的常规检索和分析。
相对成熟的容器平台都是会有比较成熟且好用的运维日志系统,Node.js 开发者只需要能够充分利用这些能力就可以满足自己的日常运营需要。例如本项目中使用的内部容器平台(TKEx-CSIG),提供基于 Grafana 的监控面板,如下图:
可以实时的去观察 Pod 状态、CPU、内存、磁盘、HPA 等,方便开发者快速解决问题,这个是和 Node.js 无关,大多数平台都是支持的,如果想抓取 Node.js 运行时的堆栈、内存使用、火焰图、内存快照,则可以使用更加定制化的 Node.js 服务监控控件。其中在排查或者优化服务运行性能时,如下图所示的火焰图是个很好的参照。
关于 Node.js 的日志开发主要是集中在全链路的日志开发设计上,前面的本地日志和运维日志一般只需要少量开发或者配置就可以完成,全链路日志则需要我们去用心设计了。
这里首先介绍了什么是全链路日志?
这是典型的业务调用链示意图,所谓全链路就是把 0-6 个环节串连起来。在进行链路分析时,需要为每次请求定义一个唯一标识 traceid,这样就可以根据 trace_id 查出本次请求调用的所有服务,更进一步可以形成类似下面的调用链静态拓扑:
相信有了这套机制,就不在害怕线上问题的定位了。
在大多数场景下,Node.js 服务都是要为前端提供接口服务,因此全链路日志也要将前端日志也要一起纳入全链路流程中,这也是其他后台服务相对比较少考虑的。
首先要和调用方约定通用 TraceId 的协议,例如本项目在前端和后台服务中都是采用了内部上报 SDK(IMLOG SDK),因此约定前端会在请求中带上前端日志的 TraceId 放到 http/request/header/X-Request-Id 属性,这个 TraceId 的生成都是采用 uuid 来生成唯一性的 ID。
假如你的日志上报是走的自定义日志上报,则需要在 Node.js 的 MiddleWare 中对所有请求和第三方调用进行统一的 TraceId 进行覆盖和传递,类似下面的方式。
本项目采用的是 imserver-monitor 集成 SDK 进行了自动化上报,它集成了这部分设计:
针对第三方调用,也是需要对调用函数进行封装,使其自动上报 ctx 上挂载的 trace_id,例如本项目的异步上报封装的 axios 组件,则是封装了异步请求调用、队列管理、日志上报和返回监控等能力。
最终是将前端日志、服务器日志、第三方调用通过唯一的 trace_id 进行全链路串联起来,方便开发快速定位问题。
当然日志的用途不仅仅是应用于问题排查,它还具有业务分析、日志报警等功能,例如在内部容器平台(TKEx-CSIG)上配置容器状态报警:
方便快速预警和响应线上故障。
本项目中使用的内部上报 SDK(IMLOG SDK),它兼顾了日志检索 Kabana:
日志分析 Grafana:兼顾可视化分析和报警。
业务开发过程中必然存在大量自定义日志开发,首先关于上报字段的选择,这里我建议尽量按照成熟的上报平台的字段约定来上报,这样减少你在日志分析过程的沟通成本,因为分析工作大部分是由数据组的专业同事支持,日志不规范,同事两行泪,血的教训。这里给大家介绍下我们团队内部约定的一些核心字段,仅供参考。
{
"mapping": {
"k12": {
"properties": {
"additional": {
"type": "text"
},
"cmd": {
"type": "keyword"
},
"cost_time": {
"type": "integer"
},
"error_msg": {
"type": "text"
},
"ext": {
"type": "keyword"
},
"geoip": {
"properties": {
"location": {
"type": "geo_point"
}
}
},
"log_level": {
"type": "keyword"
},
"log_timestamp": {
"type": "date",
"format": "epoch_millis"
},
"parent_span_id": {
"type": "keyword"
},
"project": {
"type": "keyword"
},
"request_ip": {
"type": "ip"
},
"return_code": {
"type": "integer"
},
"return_code_2": {
"type": "keyword"
},
"server_ip": {
"type": "ip"
},
"source": {
"type": "keyword"
},
"span_id": {
"type": "keyword"
},
"trace_id": {
"type": "keyword"
},
"uin": {
"type": "long"
},
"url": {
"type": "keyword"
},
"wns_code": {
"type": "keyword"
}
}
},
"_default_": {
"properties": {
"additional": {
"type": "text"
},
"cmd": {
"type": "keyword"
},
"cost_time": {
"type": "integer"
},
"error_msg": {
"type": "text"
},
"ext": {
"type": "keyword"
},
"geoip": {
"properties": {
"location": {
"type": "geo_point"
}
}
},
"log_timestamp": {
"type": "date",
"format": "epoch_millis"
},
"project": {
"type": "keyword"
},
"request_ip": {
"type": "ip"
},
"return_code": {
"type": "integer"
},
"return_code_2": {
"type": "keyword"
},
"server_ip": {
"type": "ip"
},
"trace_id": {
"type": "keyword"
},
"uin": {
"type": "long"
},
"url": {
"type": "keyword"
},
"wns_code": {
"type": "keyword"
}
}
}
}
}
自定义日志开发一定要注意性能的优化,在项目的初期,大量使用了 JSON.stringify 对 DB 查询实例、request 实例进行了格式化,导致压测性能指标一直上不去,后来发现是由于 JSON.stringify 性能不佳和对复杂对象进行了错误格式化。后续就替换了 fast-json-stringify 工具,将数据库查询实例通过 toJSON 方法转化成单纯的 JSON 之后再进行格式化,提升日志处理的性能。
到这里本人探索 Node.js 后台服务开发过程中的日志开发经验分享就结束了,但是这并不是日志开发的全部,也有很多领域需要继续探索,例如如何实现常规日志中的部分核心日志进行持久化存储、数据导出和数据分析。
希望本文能够为大家探索 Node.js 开发提供有益的参考,也可以在评论区中沟通交流分享经验哈。
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/-TXvfxpz1vhSRSwQ0WKooA
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。