One more Go library oriented towards building distributed systems hot off the presses: govclock. This one offers full vector clock support for the Go language. Vector clocks allow recording and analyzing the inherent partial ordering of events in a distributed system in a comfortable way.
The following features are offered by govclock, in addition to basic event tracking:
- Compact serialization and deserialization
- Flexible truncation (min/max entries, min/max update time)
- Unit-independent update times
- Traditional merging
- Fast and memory efficient
If you’d like to know more about vector clocks, the Basho guys did a great job in the following pair of blog posts:
The following sample program demonstrates some sequential and concurrent events, dumping and loading, as well as merging of clocks. For more details, please look at the web page. The project is available under a BSD license.
package main import ( "launchpad.net/govclock" "fmt" ) func main() { vc1 := govclock.New() vc1.Update([]byte("A"), 1) vc2 := vc1.Copy() vc2.Update([]byte("B"), 0) fmt.Println(vc2.Compare(vc1, govclock.Ancestor)) // => true fmt.Println(vc1.Compare(vc2, govclock.Descendant)) // => true vc1.Update([]byte("C"), 5) fmt.Println(vc1.Compare(vc2, govclock.Descendant)) // => false fmt.Println(vc1.Compare(vc2, govclock.Concurrent)) // => true vc2.Merge(vc1) fmt.Println(vc1.Compare(vc2, govclock.Descendant)) // => true data := vc2.Bytes() fmt.Printf("%#vn", string(data)) // => "x01x01x01x01Ax01x01x01Bx01x00x01C" vc3, err := govclock.FromBytes(data) if err != nil { panic(err.String()) } fmt.Println(vc3.Compare(vc2, govclock.Equal)) // => true }