《Go 语言并发之道》读后感-第五章

大规模并发

这一章我或许没有办法写出一些实例代码,由于经验有限。我会结合以往运维的一些系统举出部分例子共读者参考,详情力荐阅读原文。linux

异常传递

异常时什么,何时发生,提供哪些好处?咱们须要明确如下信息:git

  • 发生了什么,例如:磁盘已满,证书过时,连接超时,不存在的路径
  • 发生在什么时间,什么位置,优秀的 Golang 第三方日志库能够帮助到咱们
  • 对用于友好的信息,例如:给与相似的提示信息,参考 linux 命令行提示
  • 告诉用户如何得到更多的信息,例如:man 手册

异常一般被咱们分为两类:github

  • Bug 未知,未发现的错误
  • 已知信息。例如:用户传入错误参数,网络断开,证书过时

正如上一章错误处理中所说咱们须要将错误视为一等公民存在,我的认为 Golang 错误处理机制的特立独行,让我从新审视系统中可能存在的错误。数据库

超时和取消

超时:对于建立一个已于理解的系统是相当重要的,例如:TCP 连接中,咱们能够利用超时避免连接占用太久;etcd 中利用超时,规避全局时钟一致性问题缓存

咱们为何但愿并发程序支持超时呢?这里有几个缘由:安全

  • 系统饱和
    • 请求在超时时不太可能重复
    • 没有资源来存储请求,例如:内存队列的内存;持久队列的磁盘空间;消息队列阻塞
    • 若是对系统响应或请求发送数据有时效性要求,例如:访问网页
  • 陈旧数据
    • Kafka log 清理机制,默认2小时前的数据被清理
    • Redis 中的缓存
  • 试图防止死锁
    • 在关键的并发操做中增长超时处理

并发进程可能被取消的缘由有不少:服务器

  • 超时,隐式取消
  • 用户干预,例如:正在执行某个命令,等了过久,你按了 Ctr + c
  • 父进程取消,例如:ppid 被 kill ,那么所属 pid 也会被 kill
  • 复制请求,例如:同时有多个请求,哪一个最早返回用哪一个的

心跳

在分布式系统中很是常见的,心跳是并发进程向外界发出信号的一种方式。书中讨论了两种心跳:网络

  • 在一段时间间隔内发出的心跳,例如:Server 和 Agent 之间的通讯;分布式系统中个节点的心跳,确保领导者存活的心跳;
  • 在工做单元开始时发出的心跳,例如:分布式计算任务,确认计算单元是否完成任务,或宕机

复制请求

当一个请求到达咱们的服务,咱们可使用 Nginx ,HAproxy 等分发到多个节点上,但这会消耗过多的计算资源,空间资源(服务器机柜),维护成本。若是咱们都在进程内,或进程间通讯,咱们仅仅多消耗了一部份内存资源。最为典型的案例就是利用 Golang 重写了负载层的中间件,例如:并发

速率限制

笔者最近刚刚到一家网络安全公司就任运维工程师,了解到不少关于网络攻击的信息,最为明显的就是 DDoS,CC攻击。DDoS 的攻击多是利用 udp服务反射, 或残缺报文形成流量洪峰,可能比较已于识别。可是 CC 攻击,就是正常的访问,大量的正常访问,致使网站不可用。对于这样的场景咱们不仅仅须要在负载层添加速率限制,在后台内部调用层也须要添加。运维

特别是在容器化的环境中,弹性扩缩虽然美好。可是有一句至理名言,同样东西有多光鲜,背后就有多阴暗。我曾经经历过,服务疯狂扩容致使运行在小机上的 Oracle 数据库不堪重负的场景。在访问 Oracke 也须要速率限制。

治愈异常的 goroutine

做者最后又再次强调了,治愈异常的 goroutine ,看来并发安全一直是一个很是值得关注的问题。

结束语

本次连载到此就要画上句号了。至于原书的最后一章 goroutine 和 Go 语言进行时,我相信中文集里面没有人比刘丹冰讲的更加透彻,但愿各位给与做者三连支持。附上 B 站连接 GPM 模型

2021 让咱们共同启航,在十四五开局之年,金牛聚福,身体健康,驱疫避害。

相关文章
相关标签/搜索