1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-24 12:32:21 +00:00

update gl

This commit is contained in:
Xargin 2018-06-10 18:19:09 +08:00
parent a26ef362f3
commit e78f14ed86

View File

@ -117,6 +117,77 @@ func isTrue(phone string) bool {
## 如何实现一套灰度发布系统 ## 如何实现一套灰度发布系统
前面也提到了,提供给用户的接口大概可以分为和业务绑定的简单灰度判断逻辑。以及输入稍微复杂一些的哈希灰度。我们来分别看看怎么实现这样的灰度系统(函数)。
### 业务相关的简单灰度
公司内一般都会有公共的城市名字和 id 的映射关系,如果业务只涉及中国国内,那么城市数量不会特别多,且 id 可能都在 10000 范围以内。那么我们只要开辟一个一万大小左右的 bool 数组,就可以满足需求了:
```go
var cityID2Open = [12000]bool{}
func init() {
readConfig()
for i:=0;i<len(cityID2Open);i++ {
if city i is opened in configs {
cityID2Open = true
}
}
}
func isPassed(cityID int) bool {
return cityID2Open[cityID]
}
```
如果公司给 cityID 赋的值比较大,那么我们可以考虑用 map 来存储映射关系map 的查询比数组稍慢,但扩展会灵活一些:
```go
var cityID2Open = map[int]struct{}{}
func init() {
readConfig()
for _, city := range openCities {
cityID2Open[city] = struct{}{}
}
}
func isPassed(cityID int) bool {
if _, ok := cityID2Open[cityID]; ok {
return true
}
return false
}
```
按白名单、按业务线、按 UA、按分发渠道发布本质上和按城市发布是一样的这里就不再赘述了。
按概率发布稍微特殊一些,不过不考虑输入实现起来也很简单:
```go
func init() {
rand.Seed(time.Now().UnixNano())
}
// rate 为 0~100
func isPassed(rate int) bool {
if rate >= 100 {
return true
}
if rate > 0 && rand.Int(100) > rate {
return true
}
return false
}
```
注意初始化种子。
### 哈希算法 ### 哈希算法
求哈希可用的算法非常多,比如 md5crc32sha1 等等,但我们这里的目的只是为了给这些数据做个映射,并不想要因为计算哈希消耗过多的 cpu所以现在业界使用较多的算法是 murmurhash下面是我们对这些常见的 hash 算法的简单 benchmark可见 murmurhash 的优势很大: 求哈希可用的算法非常多,比如 md5crc32sha1 等等,但我们这里的目的只是为了给这些数据做个映射,并不想要因为计算哈希消耗过多的 cpu所以现在业界使用较多的算法是 murmurhash下面是我们对这些常见的 hash 算法的简单 benchmark可见 murmurhash 的优势很大:
@ -124,4 +195,6 @@ func isTrue(phone string) bool {
```go ```go
``` ```
### 分布是否均匀 #### 分布是否均匀
对于哈希算法来说,最重要的就是在真实业务场景下是否分布均匀的问题。