Go在工程实践的错误处理Golang在工程实践中的错误处理 彭友顺 石墨文档 产研负责人 目 录 为什么我们处理错误会这么慢 01 如何完善错误信息 02 优雅处理错误信息 03 分布式错误处理 04 错误信息手册的必要性 05 为什么我们处理错误 会这么慢 第一部分 错误信息不够完善 why 原因 出现 错误 定位 慢 恢复 慢 效率低 为什么我们处理错误会这么慢 错误处理不够优雅 分布式错误难以串联 对接起来会非常麻烦 优雅处理错误信息 第三部分 为什么定位慢?-- 错误处理 不要透传错误 错误码唯一性 记录一次错误 假设用户反馈了无法打开一个文件 我们的程序员非常认真 记录了文件不存在的错误日志 • 同样的错误信息,非常多的杂音 • 每个Error,都去查看一次对应代码,排查效率低 • 占用存储空间 • 最外层入口处只记录一次错误日志 为什么定位慢?-- 错误处理 带来新的问题,无法定位整个代码执行链路 日志分析不出是哪个service 调用了MySQL 为什么定位慢?-- 错误处理 带来新的问题,无法定位整个代码执行链路 不要透传错误 错误码唯一性 记录一次错误 • 不能透传错误,fmt.Errorf • 如果不考虑性能 • 日志开启Stack • 错误追加Stack 为什么定位慢?-- 错误处理 不要透传错误 错误码唯一性 记录一次错误 文件不存在 数据表里不存在0 码力 | 30 页 | 3.11 MB | 1 年前3
Go Web编程的书籍《Go Web编程》《Build Web Application with Golang》。写这本书不表示我能力很强,而是我愿意分享,和大家一起分享Go写Web应用的一些东西。 对于从PHP/Python/Ruby转过来的同学了解Go怎么写Web应用开发的 对于从C/C++转过来的同学了解Web到底是怎么运行起来的 我一直认为知识是用来分享的,让更多的人分享自己拥有的一切知识这个才是人生最大的快乐。 web工作方式 3.2 Go搭建一个简单的web服务 3.3 Go如何使得web工作 3.4 Go的http包详解 3.5 小结 4.表单 4.1 处理表单的输入 4.2 验证表单的输入 4.3 预防跨站脚本 4.4 防止多次递交表单 4.5 处理文件上传 4.6 小结 5.访问数据库 5.1 database/sql接口 5.2 使用MySQL数据库 5.3 使用SQLite数据库 5.4 session和cookie 6.2 Go如何使用session 6.3 session存储 6.4 预防session劫持 6.5 小结 7.文本文件处理 7.1 XML处理 7.2 JSON处理 7.3 正则处理 7.4 模板处理 7.5 文件操作 7.6 字符串处理 7.7 小结 8.Web服务 8.1 Socket编程 8.2 WebSocket 8.3 REST 8.4 RPC 8.5 小结0 码力 | 295 页 | 5.91 MB | 1 年前3
2.5 Go在猎豹移动的应用合并请求; TCP Handshake影响RTT; keepalived&长连接; API动态加速; proxy模式&动态CDN; SOA Web站点是PHP开发的,通过RPC交互; rpc和api都是基于Go开发的服务; 国内DNS->VIP->lvs->tengine->Go; 海外DNS->ELB DNS->ELB->Go; DNS->ELB->Go; Service之间通过Thrift或者net/rpc通讯; 依赖redis sdk访问redis; 直连mysql; 用户的所有业务逻辑基于Go处理; Service 服务应该是无状态的; api服务出现瓶颈的时候,直接scale out; graceful restart依赖健康检测; api质量监控,使用日志来追踪,通过本 Dapper论文,核 心思路是关键库植入代码,因为缺乏 AOP编程支持,我们使用golang blog推 荐的依赖context对象; 服务发现、负载均衡依赖ZK; 弹性调度的支持,降级处理、动态扩容; RPC选型 是否多语言支持?net/rpc不支持 性能如何? thrift num:111324, time:30s, num/s:3710; 0 码力 | 24 页 | 4.26 MB | 1 年前3
2.3 用golang写一个操作系统⼀一个是现有的中国电⼒力系统(电⼚厂+电⺴⽹网) ⼀一个是成本低于电费的个⼈人太阳能加⾃自动组⺴⽹网技术 效率:降低基础设施成本 l 可以⽀支持各种开发语⾔言 php golang java c# js python html5 ⺫⽬目前优先⽀支持html5架构 l 没有前端和后端之分 只需要对编程要求最低的js程序员再加美⼯工,便可以完成所有开发⼯工作 ⼤大量的重复代码 l 最后觉得很合理 写代码的时间很短,测试和查问题的时间很多,相当多的时间是因为某个错误忽 略或处理的缺失。 多加⼏几⾏行代码占位,视觉提醒和后期查问题都很⽅方便 错误处理 l ⼤大道⾄至简 gorou8ne,接口,数据结构,Web0 码力 | 33 页 | 1014.12 KB | 1 年前3
Go vs. GoPlus(Go+)-继承、构造/析构函数、虚函数、函数重载等 • 简化的符号访问权限控制 • 取消隐藏的 this 指针 -改为显式定义的 receiver 对象 • OOP 编程核心价值原来如此简单 -只是多数人都无法看透 惊喜5:错误处理规范 • 函数多返回值 • 内置的 error 类型 • defer • 例子 f, err := os.Open(file) if err != nil { (2014) • Go+ (2020) 大约每 6-8 年会出现一门新的影响力语言 脚本语言发展史 (TOP20) • Visual Basic (1991) • Python (1991) • PHP (1994) • JavaScript (1995) • Ruby (1995) 脚本语言是集中性大爆发的 大概也就是在 Java 出现的那个年代 数据科学语言发展史 (TOP50) • SQL 数据科学的基建时期:大数据的兴起 • Map/Reduce (2004) • Hadoop (2006) • Spark (2009) • 大数据的兴起,是数据科学基础设施化的开始 • 以大规模处理能力为优先 • 功能上相对局限 数据科学的基建时期:深度学习的兴起 • TensorFlow/Python (2015) • Torch/Python (2017) • 迭代的是 y=F(x)0 码力 | 54 页 | 1.82 MB | 1 年前3
如何用GO支撑海外电商的快速发展-吕梦楼混合模式 新增GO商城服务,迁移下单流程中的订单结算、收银台等功能 PC和M站相关功能,请求下发到GO商城服务,页面仍通过PHP服务端渲染 架构演变 06. 前后端分离 核心流程全部迁移到GO商城服务,包括购物车、订单、商品和地址等 页面渲染逻辑全部由前端处理,实现前后端分离 架构演变 07. 微服务化 目前已有部分电商服务接入网关,后续会持续推动电商服务的微服务接入 通过0 码力 | 33 页 | 3.80 MB | 1 年前3
2.7 Golang与高性能DSP竞价系统Reserved 什么是RTB与DSP 专业DSP解决⽅方案 © ⼲⼴广州舜⻜飞信息科技有限公司 All Right ReservedAll Right Reserved • ⾼高并发量请求处理(峰值QPS 20万) • 每天上百亿竞价请求 • 每个竞价请求要在100毫秒内响应(包含⺴⽹网络延迟) • 复杂的出价算法与逻辑 DSP竞价系统的挑战 专业DSP解决⽅方案 © ReservedAll Right Reserved • 应届毕业⽣生 • ⼀一个⼈人 • 三个星期 • 接近⼀一万⾏行代码 • 性能提升7倍 • 部署、维护更⽅方便 Golang重写原来PHP的Transfer 专业DSP解决⽅方案 © ⼲⼴广州舜⻜飞信息科技有限公司 All Right ReservedAll Right Reserved • 写⼊入做⼀一些合并,减少写⼊入的SQL数量0 码力 | 51 页 | 5.09 MB | 1 年前3
Go 入门指南(The way to Go)章)。我们会对 Go 语 言的函数式和面向对象编程进行透彻的讲解,包括如何使用 Go 语言来构造大型项目(第 9 章)。 在本书的第三部分,你将会学习到如何处理不同格式的文件(第 12 章)和如何在 Go 语言中巧妙地使用 错误处理机制(第 13 章)。然后我们会对 Go 语言中最值得称赞的设计 goroutine 和 channel 进行并发 和多核应用的基本技巧的讲解(第 14 章)。最后,我们会讨论如何将 很庆幸 Stroustrup 做了让 C++ 兼容 C 语言以能够让其编译 C 程序这个正确的决定。我们当时需要 C++ 的出 现。” “之后我们学到了更多。我们毫无疑问地接受了垃圾回收,异常处理和虚拟机这些当年人们认为只有疯子 才会想的东西。C++ 的复杂程度(新版的 C++ 甚至更加复杂)极大了影响了软件开发的高效性,这使得 它再也不再适合这个时代。人们不再像过往那样认同在 C++ 中兼容使用 来实现各个 goroutine 之间的通信。他们实现了分段栈增长和 goroutine 在线程基础上多路复用技术的自动化。 这个特性显然是 Go 语言最强有力的部分,不仅支持了日益重要的多核与多处理器计算机,也弥补了现存 编程语言在这方面所存在的不足。 Go 语言中另一个非常重要的特性就是它的构建速度(编译和链接到机器代码的速度),一般情况下构建 一个程序的时间只需要数百毫秒到几秒。作为大量使用0 码力 | 380 页 | 2.97 MB | 1 年前3
Go 入门指南(The way to Go)XML 数据格式 12.11 用 Gob 传输数据 12.12 Go 中的密码学 第13章:错误处理与测试 13.1 错误处理 13.2 运行时异常和 panic 13.3 从 panic 中恢复(Recover) 13.4 自定义包中的错误处理和 panicking 13.5 一种用闭包处理错误的模式 13.6 启动外部命令和程序 13.7 Go 中的单元测试和基准测试 13.8 16.5 不需要将一个指向切片的指针传递给函数 16.6 使用指针指向接口类型 16.7 使用值类型时误用指针 16.8 误用协程和通道 16.9 闭包和协程的使用 16.10 糟糕的错误处理 第 17章 模式 17.1 关于逗号ok模式 第 18章 出于性能考虑的实用代码片段 18.1 字符串 18.2 数组和切片 18.3 映射 18.4 结构体 18.5 接口 18 11 章)。我们会对 Go 语言的函数式和面 向对象编程进行透彻的讲解,包括如何使用 Go 语言来构造大型项目(第 9 章)。 在本书的第三部分,你将会学习到如何处理不同格式的文件(第 12 章)和如何在 Go 语言中巧妙地使用错误处理机 制(第 13 章)。然后我们会对 Go 语言中最值得称赞的设计 goroutine 和 channel 进行并发和多核应用的基 本技巧的讲解(第 14 章)。最后,我们会讨论如何将0 码力 | 466 页 | 4.44 MB | 1 年前3
微服务容灾治理那我们想想,如果我们的服务CPU被打满了,是不是后⾯所有的请求也都被卡住了?等服务处理完请 求的时候,⽤⼾那⾥可能已经超时离开了,结果服务器很忙,但都是做的⽆⽤功。如果这⾥不能理 解,停下来好好思考⼀番,如果还不懂的话,可以来go-zero群⾥讨论讨论。。。 2.1模拟CPU密集型服务 有⼈可能会问CPU密集型服务怎么定义?你的服务CPU会打满吗?处理请求会包含复杂的计算逻辑 吗?你经常需要通过c 上模拟CPU负载的请求处理代码。 模拟CPU计算的代码:https://gist.github.com/kevwan/ccfaf45aa190ac44003d93c094a12c3f benchmarkCPU-103303600743ns/op 从 benchmark 结果可以看出单个请求的逻辑处理需要3.6msCPU资源(不包括服务端中间件处理 消耗 • 可以看到系统总共只处理了⼤概500qps的请求,其中400qps多⼀点是成功的,近100qps是超 时的(返回了503状态码) • 随着请求的堆积,很快就会⼤量请求都超时了,并且p99,甚⾄p90都已经超过1s了 • 这⾥进⼀步解释⼀下,超时的请求意味着对系统资源的浪费,⽐如接受到⼀个请求,花了不少cpu 时间处理完了,然后返回结果时,发现请求已经超0 码力 | 13 页 | 1.68 MB | 1 年前3
共 60 条
- 1
- 2
- 3
- 4
- 5
- 6













