跨服务错误处理

简介: 跨服务错误处理

无论使用什么语言,错误处理都是系统中很关键的一个点。优雅的错误处理能够极大的提高代码的整洁度,而代码整洁度又直接影响可维护性,但是要实现优雅的错误处理却并非易事。那究竟难在哪里呢?

  1. 重复的错误处理代码
_, err = fd.Write(p2[e:f])
if err != nil {
    fmt.Println(err, ...)
    return err
}

在分层系统中(例如:Controller、Service、DAO),每一层都会重复以上代码

  1. 原始错误的上下文
func AuthenticateRequest(r *Request) error {
  return authenticate(r.User)
}

如果 authenticate 返回错误,那么 AuthenticateRequest 会将错误返回给调用者,调用者也可能会这样做,依此类推。 在程序的顶部,程序的主体将错误打印到屏幕或日志文件,所有打印的都会是: No such file or directory

  1. 原始错误 vs 错误码错误
errors.New("connection error")
// vs 
var errno uint32 = 10001
errors.New(errno, "connection error")

标准库或第三方应用库返回的是一般是上一种错误,然而H5或APP不可能根据字符串进行错误判断。因此在业务中需要把所有的错误进行统一封状为错误码错误返回,那么错误码错误中需要保存原始错误么?

  1. RPC错误 vs 业务错误
  • 一方面,与业务层的错误相似,RPC框架也会自己的错误。而RPC框架往往也会集成一些包括过载处理、异常节点剔除的功能,依赖于对两种错误的识别能力。该如何设计错误才能让两者区分开来呢?
  • 另一方面,无论是RPC框架错误和业务错误,调用端都需要进行统一解码(decode)。该如何设计错误才能让两者融合起来呢?

从简单来看,所有问题是相互独立的,但是透过现象来看本质。以上问题又都有关联,在于进行错误模型设计。从业界各种框架的设计情况来看,可以把错误分为以下三种:

  • Error codes model

从网络故障到未经验证的连接,各种情况下都会引发错误,每种错误都可以都与特定错误码关联。

  • Standard error model

如果发生错误,则返回错误代码以及一条可选的字符串错误信息,该信息提供有关所发生事件的详细信息。

  • Richer error model

允许服务器和客户端返回、使用额外的错误详细信息。它进一步指定了一组标准的错误消息类型,以满足最常见的需求(例如无效参数、配额冲突和堆栈跟踪)

三种类型的错误,层层递进,能够囊括的信息也越来越多。当然,信息越是丰富,框架实现难度越高,对使用者也越友好。在微信,svrkit 选择的模型是Error codes model;开源框架 grpc 选择的模型则是 Standard error model ,但是本身支持Richer error model,参考:googleapis

想清楚了问题,再看解决问题的方案:

  • 根据错误的类型,进行针对性的处理
  • 错误原因追踪
  • 前者可以使用错误码来代替,后者可以简化为message。即,毋需保留错误本身,只需要将错误转化为错误码和message。
  • 难点 4:即根据需要选择合适的错误模型,统一业务错误和框架错误。区分业务错误和框架错误,可以将 code 分段,框架优先占有指定的号段。

更进一步,code 号段可以融合到服务治理中,在服务申请阶段分配对应的号段

本文作者 : cyningsun

本文地址https://www.cyningsun.com/06-07-2020/unified-error-handling.html

版权声明 :本博客所有文章除特别声明外,均采用 CC BY-NC-ND 3.0 CN 许可协议。转载请注明出处!

# Error handling

  1. 译|Don’t just check errors, handle them gracefully
  2. 译|Errors are values
目录
相关文章
|
8月前
|
人工智能 数据可视化 IDE
AI编程:cursor使用教程
这是小卷对AI编程工具学习的首篇文章,以Cursor为例,介绍其安装与基本功能。Cursor分为狭义和广义两类,前者辅助程序员高效编程,后者让无基础用户也能创建应用。文章详细讲解了Cursor的安装、快捷键、代码生成、修改、补全及项目理解等功能,并展示了如何通过提示词实现需求,帮助小白轻松上手编程。
1738 77
|
10月前
|
负载均衡 监控 算法
论负载均衡技术在Web系统中的应用
【11月更文挑战第4天】在当今高并发的互联网环境中,负载均衡技术已经成为提升Web系统性能不可或缺的一环。通过有效地将请求分发到多个服务器上,负载均衡不仅能够提高系统的响应速度和处理能力,还能增强系统的可扩展性和稳定性。本文将结合我参与的一个实际软件项目,从项目概述、负载均衡算法原理以及实际应用三个方面,深入探讨负载均衡技术在Web系统中的应用。
334 2
|
存储 监控 安全
系统安全深度探索:构建坚不可摧的防御体系
系统安全是数字化时代的重要课题。面对外部威胁、内部漏洞与人为失误以及更新与升级的滞后性等挑战,我们需要构建一套坚不可摧的防御体系。通过强化访问控制与身份验证、定期更新与补丁管理、实施安全审计与监控、加强数据加密与备份、提升用户安全意识与培训以及采用先进的安全技术与工具等关键策略,我们可以有效地提升系统的整体安全性
|
11月前
|
缓存 监控 负载均衡
提高服务器CPU使用率
提高服务器CPU使用率
1057 8
|
11月前
|
数据采集 存储 NoSQL
提高爬虫性能的 5 个关键技巧:从并发到异步执行
本文介绍了提高网络爬虫性能的五个关键技巧:并发请求、异步执行、使用代理IP、限制请求频率与休眠时间、优化数据提取与存储。结合拼多多的实际案例,展示了如何通过这些技术优化爬虫效率,确保数据采集的高效性和稳定性。
757 0
|
计算机视觉
Echarts饼图,自定义饼图图例的排列方式, formatter使用语法
Echarts饼图,自定义饼图图例的排列方式, formatter使用语法
|
存储 Java 编译器
VBA的变量的类型和作用域
VBA|变量的类型、声明、作用域
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的美食分享系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的美食分享系统附带文章和源代码部署视频讲解等
84 0
|
Java
java操作fastdfs包括文件上传、下载、删除
java操作fastdfs包括文件上传、下载、删除
561 0
java操作fastdfs包括文件上传、下载、删除