<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SEQSVRGo + MySQL 實(shí)現(xiàn)的 ID 生成服務(wù)

          聯(lián)合創(chuàng)作 · 2023-10-01 07:11

          SEQSVR

          Go + MySQL 實(shí)現(xiàn)的 ID 生成服務(wù)

          特性

          • 分布式:可任意橫向擴(kuò)展

          • 高性能:分配 ID 只訪問內(nèi)存(到達(dá)上限會(huì)請(qǐng)求數(shù)據(jù)庫一次)

          • 易用性:對(duì)外提供 HTTP 服務(wù)

          • 唯一性:MySQL 自增 ID,永不重復(fù)

          • 高可靠:MySQL 持久化

          依賴項(xiàng)

          本項(xiàng)目使用下列優(yōu)秀的項(xiàng)目作為必要組件。

          • gopkg.in/yaml.v2

          • github.com/go-sql-driver/mysql

          • github.com/satori/go.uuid

          安裝

          注意:需要在啟動(dòng)之前創(chuàng)建數(shù)據(jù)庫并修改配置文件中數(shù)據(jù)庫的配置。

          go get 方式:

          需保證 $GOPATH/bin 在系統(tǒng) PATH 中。

          go get github.com/qichengzx/seqsvr
          seqsvr

          單獨(dú)編譯:

          git clone [email protected]:qichengzx/seqsvr.git
          cd seqsvr
          go build .
          ./seqsvr

          Docker 方式:

          Dockerfile 使用了 Docker 多階段構(gòu)建功能,需保證 Docker 版本在 17.05 及以上。詳見:Use multi-stage builds

          git clone [email protected]:qichengzx/seqsvr.git
          cd seqsvr
          docker build seqsvr:latest .
          docker run -p 8000:8000 seqsvr:latest

          初始化數(shù)據(jù)庫

          數(shù)據(jù)庫名稱可以自定義,修改 config.yml 即可。

          然后導(dǎo)入以下 SQL 生成數(shù)據(jù)表。

          CREATE TABLE `generator_table` (
            `id` int(11) NOT NULL AUTO_INCREMENT,
            `uuid` char(36) NOT NULL COMMENT '機(jī)器識(shí)別碼',
            PRIMARY KEY (`id`),
            UNIQUE KEY `id_UNIQUE` (`id`),
            UNIQUE KEY `stub_UNIQUE` (`uuid`) USING BTREE
          ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

          修改配置

          配置文件使用 YAML 格式。

          #app
          port: ':8000'
          
          #service
          step: 100
          
          #db
          mysql:
            user: 'root'
            password: ''
            host: 'tcp(localhost:3306)'
            database: 'sequence'

          可修改端口號(hào)及 MySQL 的配置。

          使用

          curl http://localhost:8000/new{"code":0,"msg":"ok","data":{"id":101}}

          原理

          本項(xiàng)目設(shè)計(jì)原理來自 攜程技術(shù)中心 的干貨 | 分布式架構(gòu)系統(tǒng)生成全局唯一序列號(hào)的一個(gè)思路

          服務(wù)初始化后第一次請(qǐng)求會(huì)在 MySQL 數(shù)據(jù)庫中插入一條數(shù)據(jù),以生成初始 ID。

          后續(xù)的請(qǐng)求,都會(huì)在內(nèi)存中進(jìn)行自增返回,并且保證返回的 ID 不會(huì)超過設(shè)置的上限,到達(dá)上限后會(huì)再次從 MySQL 中更新數(shù)據(jù),返回新的初始 ID 。

          核心SQL

          REPLACE INTO `generator_table` (uuid) VALUES ("54f5a3e2-e04c-4664-81db-d7f6a1259d01");
          瀏覽 17
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          編輯 分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日日操天天操 | 久久急费看黄A毛片 | 大香蕉av在线观看 | 亚洲日韩在线观看网站 | 翔田千里菊门无码 |