房間號生成器

在寫遊戲服務器中, 特別是卡牌一類的遊戲, 常常須要讓用戶手動輸入房間號加入一個房間, 爲了用戶友好, 這個房間號一般須要限定長度, 好比4位或者6位數字. 所以用數據庫的auto_increment對用戶不太友好, 其一是長度不固定, 其二是後期房間號會很長, 因此專門寫了一個房間號生成器服務器, 其知足如下需求:git

  1. 指定生成的的房間號範圍: 好比[100000, 1000000)
  2. 租借過時: 當一個房間號被生成後, 若超時未續期, 則自動釋放(凍結)
  3. 房間號凍結: 當一個房間號被歸還後, 在指定時間範圍內不會被從新分配

安裝

項目地址: https://github.com/acrazing/unogithub

安裝:數據庫

go get -u github.com/acrazing/uno

使用

接口很簡單:bash

import "github.com/acrazing/uno"
import "context"

// 建立一個worker
w := uno.NewWorker()

// 配置
w.Init(&uno.Options{
    MinValue: 1e5,
    MaxValue: 1e6,
})
// 啓動服務
go w.Run(context.Background())
// 生成ID
no := w.Rent()
if no == 0 {
    // 若是返回0, 則表示生成房間號失敗
    panic("")
}
// 釋放ID
w.Return(no)
// 續租ID
ok := w.Relet(no)
if ok {
    // 若是返回false, 表示續租失敗
}

gRPC

gRPC的服務和消息都已經定義好, 能夠直接取用:服務器

addr := "127.0.0.1:1234"

    // server
    listener, err := net.Listen("tcp", addr)
    if err != nil {
        panic(err)
    }
    server := grpc.NewServer()
    uno.RegisterUnoServer(server, uno.Service)
    uno.Service.Init(&uno.Options{
        MinValue: 2,
        MaxValue: 5,
        TTF:      time.Second,
        TTL:      time.Second,
    })
    go uno.Service.Run(context.Background())
    go server.Serve(listener)

    // client
    conn, _ := grpc.Dial(addr, grpc.WithInsecure())
    client := uno.NewUnoClient(conn)
    no, err := client.Rent(context.Background(), &uno.Empty{})
    log.Printf("rent: %v, err: %v", no, err)
相關文章
相關標籤/搜索