关于2017的一些预测——认真你就输了

关于2017的一些预测——认真你就输了

  • AR/VR 概念红利强弩之末,如当年的 3D 概念一样,逐渐恢复平静。但是 AR/VR 的软硬件产品会渗透到日常,如同今天看 3D 电影一般平常。
  • AI 会/已经成为下一个概念红利点。这条赛道不属于一般创业公司,却是一条短期被高估,长期被低估的赛道。
  • 无人驾驶被国人玩烂,成为继我国电动汽车后的下一个笑话。
  • 互联网基础设施会加速完善与加速,墙越建越高。
  • 苹果「全线产品」丧失加速,但会投资出一两个全垒打。
  • 比特币市场开始下一轮不低于一年的低迷。
  • 百度名义上从中国三大巨头中剔除,入口优势出现转折点;并被少量专注垂直搜索/内容市场的创业公司持续瓜分。
  • 以滴滴为代表出行行业涌现一批专注垂直细分市场的创业公司,如当年的团购,O2O 一般惨烈。
  • 微信继续蚕食其他 APP 的打开率和使用时间,小程序雷声大雨点小。
  • 视频直播在政策加持下,迅速降温,成为标配。
  • 雾霾更加严重。

深入理解 Golang HTTP Timeout

深入理解 Golang HTTP Timeout

背景

前段时间,线上服务器因为部分微服务提供的 HTTP API 响应慢,而我们没有用正确的姿势来处理 HTTP 超时(当然,还有少量 RPC 超时), 同时我们也没有服务降级策略和容灾机制,导致服务相继挂掉?。服务降级和容灾需要一段时间的架构改造,但是以正确的姿势使用 HTTP 超时确是马上可以习得的。

超时的本质

所有的 Timeout 都构建于 Golang 提供的 Set[Read|Write]Deadline 原语之上。

服务器超时

server timeout

  • ReadTimout 包括了TCP 消耗的时间,可以一定程度预防慢客户端和意外断开的客户端占用文件描述符
  • 对于 https请求,ReadTimeout 包括了 TLS 握手的时间;WriteTimeout 包括了 TLS握手、读取 Header 的时间(虚线部分), 而 http 请求只包括读取 body 和写 response 的时间。

此外,http.ListenAndServe, http.ListenAndServeTLS and http.Serve 等方法都没有设置超时,且无法设置超时。因此不适合直接用来提供公网服务。正确的姿势是:

客户端超时

client timeout

  • http.Client 会自动跟随重定向(301, 302), 重定向时间也会记入 http.Client.Timeout, 这点一定要注意。

取消一个 http request 有两种方式:

  1. Request.Cancel
  2. Context (Golang >= 1.7.0)

后一种因为可以传递 parent context, 因此可以做级联 cancel, 效果更佳。代码示例:

Credits

  1. The complete guide to Go net/http timeouts
  2. Go middleware for net.Conn tracking (Prometheus/trace)