美文网首页
作为社交平台的程序员,你知道他们最担心什么吗?

作为社交平台的程序员,你知道他们最担心什么吗?

作者: 柏链教育 | 来源:发表于2019-12-19 11:12 被阅读0次

大家没事经常刷微博,头条等社交媒体app。作为运营者,你知道他们最欢迎什么吗?他们最欢迎的就是明星有事情发生,比如结婚呀,出轨呀,这样势必会带来超级大的点击量。但是作为这类app的开发者们,思考的角度则是相反,他们最怕的就是出现这样的事情。如果产品扛不住点击率的压力,那么他们就要被迫加班了,这个时候也就没有节假日了! 【找个明星劲爆消息的图片】 当大量的数据请求时,压力最大的无疑是数据库!并发数据到来时,要保证数据新增没有问题,而新增数据的时候,我们通常会面临一个最大的问题,那就是主键冲突以及唯一性索引性问题。在oracle中,我们可以使用sequence(递增序列)解决该问题,mysql中可以使用主键自增来控制,但很多时候这一类自增都毫无意义,而且太依赖数据也未必是好事。尤其是分布式系统中,数据库就可能有多个,这种方式问题更多。

很多时候,要解决主键冲突的问题,我们可能需要自己实现一个分布式ID。每次要使用主键时,去取对应的分布式ID,这样可以极大的保证数据冲突问题,说白了就是提供主键ID的生成规则。我们来介绍一下Twitter的分布式ID框架snowflake,它的设计结构如下:

image.png
  • 第1位 未使用
  • 第2-42位 精确到毫秒的时间戳
  • 第43-47位 数据中心ID
  • 第48-52位 工作机器ID
  • 第53-64位 12位自增序列

时间戳这里可以参考系统上线时或者重新部署时的一个时间点,41位长度可以表达一个接近70年的时间范围。数据中心ID和工作机器ID,可以在启动时进行设置,代表分布式集群中数据中心以及工作机器的编号,最后的12位自增序列则是在本机器范围内自增即可,这样就可以有效的生成一个分布式ID。

接下来我们介绍一个关于snowflake的go语言版实现,该实现简化了数据中心与工作中心的设置,统一采用NODEID。

4-1ZRQ3110KJ.gif

在使用时,我们需要先下载第三方库:

go get -u github.com/bwmarrin/snowflake

我们来简单实践一下,这个库用起来很简单,我们只需填写一个nodeid就可以构造一个实例,然后就可以源源不断的获取分布式ID了。

/*
   author:Yekai
   company:Pdj
   filename:flake.go
*/
package main
import (
    "fmt"
    "os"
    "github.com/bwmarrin/snowflake"
)
func main() {
    //通过nodeid设置
    n, err := snowflake.NewNode(1)
    if err != nil {
        println(err)
        os.Exit(1)
    }
    for i := 0; i < 3; i++ {
        //产生分布式ID-同一毫秒内产生3个
        id := n.Generate()
        fmt.Println("id", id)
        fmt.Println(
            "node: ", id.Node(),
            "step: ", id.Step(),
            "time: ", id.Time(),
            "\n",
        )
    }
}

来看看执行结果:

localhost:did yekai$ go run flake.go 
id 1172059930367102976
node:  1 step:  0 time:  1568275837877 

id 1172059930367102977
node:  1 step:  1 time:  1568275837877 

id 1172059930367102978
node:  1 step:  2 time:  1568275837877 

现在,你知道如何在自己的项目中构建分布式ID了吧?

相关文章

网友评论

      本文标题:作为社交平台的程序员,你知道他们最担心什么吗?

      本文链接:https://www.haomeiwen.com/subject/wslmnctx.html