Skip to content

Instantly share code, notes, and snippets.

@manhdaovan
Created November 1, 2019 14:58
Show Gist options
  • Save manhdaovan/284bb7087a04cd0b7974a776669f58ae to your computer and use it in GitHub Desktop.
Save manhdaovan/284bb7087a04cd0b7974a776669f58ae to your computer and use it in GitHub Desktop.
type sequenceIDGenerator struct {
idMgrClient IDManagerClient // client for getting IDPrefix
preGenerateIDs chan string // pre-generated ids
}
// Pre-generate id and send to channel.
// This method should be called once and only once when init generator
func (g *sequenceIDGenerator) preGenIDs() {
var idBase, id string
var seq uint64
for {
if idBase == "" || seq == 0 { // first call or over max uint 64
idBase = g.idMgrClient.GetNewIDPrefix("ServiceA")
}
id = fmt.Sprintf("%s-%d", idBase, strconv.FormatUint(seq, 32))
g.preGenerateIDs <- id
seq++
}
}
// NewSequenceIDGenerator returns new id generator
func NewSequenceIDGenerator(imc IDManagerClient) *sequenceIDGenerator {
g := &sequenceIDGenerator{
idMgrClient: imc,
preGenerateIDs: make(chan string, 10000),
}
go g.preGenIDs()
return g
}
// NextID returns next id.
func (g *sequenceIDGenerator) NextID() string {
return <-g.preGenerateIDs
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment