1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-30 00:32:21 +00:00
2018-07-08 23:10:46 +08:00

3.4 KiB
Raw Blame History

6.7. 分布式 id 生成器

有时我们需要能够生成类似 MySQL 自增 ID 这样不断增大,同时又不会重复的 id。以支持业务中的高并发场景。比较典型的电商促销时短时间内会有大量的订单涌入到系统比如每秒 10w+。明星出轨时,会有大量热情的粉丝发微薄以表心意,同样产生短时间大量的消息。

在插入数据库之前,我们需要给这些消息/订单先打上一个 ID然后再插入到我们的数据库。对这个 id 的要求是希望其中能带有一些时间信息,这样即使我们后端的系统对消息进行了分库分表,也能够以时间顺序对这些消息进行排序。

Twitter 的 snowflake 算法是这种场景下的一个典型解法。先来看看 snowflake 是怎么一回事:

                                                                                                     
                                                               datacenter_id          sequence_id    
    unused                                                                                           
                                                                      │                     │        
       │                                                              │                     │        
       │                                                              │                     │        
       │  │                                                      │    │                     │        
       │  │                                                      │    │                     │        
       ▼  │◀──────────────────    41 bits   ────────────────────▶│    ▼                     ▼        
    ┌─────┼──────────────────────────────────────────────────────┼────────┬────────┬────────────────┐
    │  0  │ 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0  │ 00000  │ 00000  │ 0000 0000 0000 │
    └─────┴──────────────────────────────────────────────────────┴────────┴────────┴────────────────┘
                                      ▲                                        ▲                     
                                      │                                        │                     
                                      │                                        │                     
                                      │                                        │                     
                                      │                                        │                     
                                      │                                        │                     
                                      │                                        │                     
                                                                                                     
                            time in milliseconds                          worker_id