月度归档:2019年04月

Docker Management

Update restart policy

docker update --restart=always my-container
Flag Desc
no Do not automatically restart the container. (the default)
on-failure Restart the container if it exits due to an error, which manifests as a non-zero exit code.
always Always restart the container if it stops. If it is manually stopped, it is restarted only when Docker daemon restarts or the container itself is manually restarted. (See the second bullet listed in restart policy details)
unless-stopped Similar to always, except that when the container is stopped (manually or otherwise), it is not restarted even after Docker daemon restarts.

Golang Rate Limit流控

通常一个稳健的系统需要有一定的熔断或流控机制,用来防止突发或异常请求造成系统过高占用, 致使系统无法正常运作.
Go中无需使用第三方库,就可以很容易就可以做到流控.

QPS控制,10 QPS

通过Ticker触发消息,达到流控目的

import "time"

rate := time.Second / 10
throttle := time.Tick(rate)
for req := range requests {
  <-throttle  // rate limit our Service.Method RPCs
  go client.Call("Service.Method", req, ...)
}
import "time"

rate := time.Second / 10
burstLimit := 100
tick := time.NewTicker(rate)
defer tick.Stop()
throttle := make(chan time.Time, burstLimit)
go func() {
  for t := range tick.C {
    select {
      case throttle <- t:
      default:
    }
  }  // does not exit after tick.Stop()
}()
for req := range requests {
  <-throttle  // rate limit our Service.Method RPCs
  go client.Call("Service.Method", req, ...)
}

Aliyun 支持IPv6

启用 IPv6 的主要有四步:

  • 注册并创建 IPv6 通道
  • 配置 ECS 使其支持 IPv6
  • 配置 Nginx 使其监听 IPv6 端口
  • 配置 DNS 使其支持 IPv6 解析

第一步:注册并创建 IPv6 通道

注册 https://www.tunnelbroker.net/ (需要邮箱验证)
点击 Create Regular Tunnel
在IPv4 Endpoint (Your side)处填上 ECS 的 IPv4 地址
在Available Tunnel Servers中选择Hong Kong, HK(如果你面向海外用户,可以选择更接近目标用户的地区)
点击Create Tunnel后,通道就创建完成了

第二步:配置 ECS 使其支持 IPv6

编辑/etc/sysctl.conf,将以下三项的配置改成0

  net.ipv6.conf.all.disable_ipv6 = 0
  net.ipv6.conf.default.disable_ipv6 = 0
  net.ipv6.conf.lo.disable_ipv6 = 0

在/etc/network/interfaces底部加上以下内容(注:下面大写的处,需要替换成你在 HE 得到的Server IPv6 Address,但不包括最后的::1/64,如:

2001:470:100:100
  auto he-ipv6
  iface he-ipv6 inet6 v4tunnel
  address <IPV6>::2
  netmask 64
  remote <HE 的 Server IPv4 Address>
  local <阿里云的 IPv4 地址(内网IP)>
  endpoint any
  ttl 255
  gateway <IPv6>::1
  up ip -6 route add 2000::/3 via ::<HE 的 Server IPv4 Address> dev he-ipv6
  up ip -6 addr add <IPv6>::1:1/128 dev he-ipv6
  up ip -6 addr add <IPv6>::2:1/128 dev he-ipv6
  down ip -6 route flush dev he-ipv6

重启服务器
执行ifup he-ipv6确认 IPv6 已启用

第三步:配置 Nginx 使其监听 IPv6 端口

server {
  listen 80; // 监听 IPv4 的 80 端口
  listen [::]:80; // 监听 IPv6 的 80 端口
}

server {
  listen 443 ssl http2; // 监听 IPv4 的 443 端口
  listen [::]:443 ssl http2; // 监听 IPv6 的 443 端口
}

第四步:配置 DNS 使其支持 IPv6 解析

这步最简单,只需给相应的域名加上AAAA解析,值填 HE 里的Client IPv6 Address,去掉最后的/64即可,如

2001:470:100:100::2