4 月 GopherChina 大会上 Marcel 首次公开了Go2 的错误处理改进的初步想法, 最近官方发布了 Go2 草案, 要改善错误处理, 给了多种社区和官方的设计方案, GoCN 分享的每日新闻中讨论 Go 语言的错误处理文章也多了起来:
1. handling-more-than-just-errors-in-go
2. error-handling-go
3. exploring-error-handling
...
我也来分享下我对 Go 错误处理的理解和实践经验, 实用为主, 目标是看到错误日志能快速定位问题, 减轻错误处理的负担, 使用效果不错. 代码是去年写的, 博客是 7 月写的...
文章: https://hanjm.github.io/2018/07/08/Go%E5%A6%82%E4%BD%95%E4%BC%98%E9%9B%85%E5%9C%B0%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86(Error%20handling%20and%20Go%201)/
1
janxin 2018-09-01 11:26:59 +08:00 via iPad
lz 你们在生产上用 nats 了?
|
4
freestyle OP @janxin nats 是网络和内存 buffer, 不落盘, 消费者处理不过来就丢, topic 没有消费者消费就丢. nats streaming 则是累积到服务端设置最大消息数量 /大小就丢. 吞吐很好, 实际应用中单机达到上限了, 可以拆分 topic 或者集群, nats 的通配符订阅很赞 具体的性能可以用 bench 在你的机器上分别测一下 https://github.com/nats-io/go-nats/blob/master/examples/nats-bench.go https://github.com/nats-io/go-nats-streaming/blob/master/examples/stan-bench/main.go
|
5
azzwacb9001 2018-09-01 17:53:03 +08:00
感谢分享!想跟楼主交流一个事情,我看到 Go 的 code style 建议里说,不要在错误返回的 else 块里做“正常情况下的功能代码”
e.g. ``` if err != nil { xxx } else { // 如果没有报错的情况下要执行的代码 } ``` 而是应该把 else 中的代码给抽出来,直接放在外边。 为什么要这么做呢?道理是什么呢? |
7
miniliuke 2018-09-01 18:33:49 +08:00 via Android 1
@azzwacb9001 我感觉是这样一整个正常流程走下来很流畅,另外如果有几十个错误这样嵌套起来这代码没法写也没法看 ̄  ̄)σ
|
8
freestyle OP @azzwacb9001 及时 return, 免得面条式代码, 提高可读性
|
9
freestyle OP @janxin 1. 客户端设置 client_id 的坑. 2. Unsubscribe 和 Close 的坑: Unsubscribe 会在 server 端移除该 subject 的持久化, Close 不会. 集群方面的坑暂时没遇到, 这个 readme 一定要看 https://github.com/nats-io/nats-streaming-server/blob/master/README.md
|