自己动手撸一个支持超时与重试Go HTTP Client

之前写过一篇上下文中断在Go语言中的使用 的文章,简单的介绍了上下文中断在Go语言中使用与原理!那么这篇博客,就来讲讲上下文中断在实际中的使用!大家如果不是很了解的话可以点击前面的链接了解下! 在实际开发过程中,太多故障是因为超时没有设置或者设置的不对而造成的。而这些故障都是因为没有意识到超时设置的重要性而造成的。如果应用不设置超时,则可能会导致请求响应慢,慢请求累积导致连锁反应,甚至应用雪崩。而有些中间件或者框架在超时后会进行重试(如设置超时重试两次),读服务天然适合重试,但写服务大多不能重试,重试次数太多会导致多倍请求流量,即模拟了DDoS攻击,后果可能可想而知! 先看看实现: package httpclient import ( “bytes” “context” “crypto/tls” Continue Reading …

上下文中断在Go语言中的使用

越来越多的小伙伴开始使用Go语言开发应用,大多数情况会使用上下文操作,如进行HTTP调用,或从数据库中获取数据,或与go-routines执行异步操作。 最常见的用途是传递可供所有下游操作使用的常用数据。 为什么我们需要中断操作? 通常情况下我们我们的应该通过HTTP 发起请求,然后查询数据库再通过HTTP请求将数据返回 如果一切都完美的话时序图应该像下面这样: 但是,如果用户在中间取消请求会发生什么? 例如,如果客户端中间请求关闭浏览器,就可能发生这种情况。 如果没有取消,应用服务器和数据库将继续工作资源会被浪费: 理想情况下,如果我们知道进程(在本例中为HTTP请求)停止,我们希望进程的所有下游组件都需要停止: Continue Reading …

阅读hyperledger fabric源码学习Go并发编程

Hyperledger (或 Hyperledger项目)是一个 开放源 的”区块链” 和相关工具的总括项目,[1] 由 Linux基金会在2015年12月发起该项目,[2] 以支持基于区块链技术的去中心化账本的写作开发。 源码地址:https://github.com/hyperledger/fabric Go语言是为并发而生的语言,Go语言是为数不多的在语言层面实现并发的语言;也正是Go语言的并发特性,吸引了全球无数的开发者。那么我们看看hyperledger fabric是怎么实现Go并发编程的呢? 并发(concurrency)和并行(parallellism) 并发(concurrency):两个或两个以上的任务在一段时间内被执行。我们不必care这些任务在某一个时间点是否是同时执行,可能同时执行,也可能不是,我们只关心在一段时间内,哪怕是很短的时间(一秒或者两秒)是否执行解决了两个或两个以上任务。 并行(parallellism):两个或两个以上的任务在同一时刻被同时执行。 并发说的是逻辑上的概念,而并行,强调的是物理运行状态。并发“包含”并行。 Go的CSP并发模型 Go实现了两种并发形式。第一种是大家普遍认知的:多线程共享内存。其实就是Java或者C++等语言中的多线程开发。另外一种是Go语言特有的,也是Go语言推荐的:CSP(communicating Continue Reading …