Skip to content

Repository files navigation

AtomicGo



AtomicGo | robin

DownloadsLatest ReleaseTestsCoverageUnit test countLicense: MITGo report


Documentation | Contributing | Code of Conduct


go get atomicgo.dev/robin

robin

import"atomicgo.dev/robin"

Package robin is a simple, generic and thread-safe round-robin load balancer for Go.

It can be used to load balance any type of data. It is not limited to HTTP requests.

Robin takes any slice as an input and returns the next item in the slice. When the end of the slice is reached, it starts again from the beginning.

Thread-safety is achieved by using atomic operations amd guarantees that two concurrent calls to Loadbalancer.Next will not return the same item, if the slice contains more than one item.

Benchmark:

BenchmarkLoadbalancer_Next 252151534 4.746 ns/op 0 B/op 0 allocs/op
BenchmarkLoadbalancer_Next-2 254281032 4.758 ns/op 0 B/op 0 allocs/op
BenchmarkLoadbalancer_Next-4 253424396 4.738 ns/op 0 B/op 0 allocs/op
BenchmarkLoadbalancer_Next-8 254842484 4.752 ns/op 0 B/op 0 allocs/op
BenchmarkLoadbalancer_Next-16 247016046 4.785 ns/op 0 B/op 0 allocs/op
BenchmarkLoadbalancer_Next-32 250539441 4.774 ns/op 0 B/op 0 allocs/op

Index

Loadbalancer is a simple, generic and thread-safe round-robin load balancer for Go.

typeLoadbalancer[Tany] struct {
Items []T// contains filtered or unexported fields
}
package main
import (
"fmt""atomicgo.dev/robin"
)
typePersonstruct {
Namestring
}
funcmain() {
people:= []Person{
{Name: "person1"},
{Name: "person2"},
{Name: "person3"},
{Name: "person4"},
{Name: "person5"},
}
lb:=robin.NewLoadbalancer(people)
fori:=0; i<10; i++ {
fmt.Println(lb.Next().Name)
}
}

Output

person1
person2
person3
person4
person5
person1
person2
person3
person4
person5

funcNewLoadbalancer[Tany](items []T) *Loadbalancer[T]

NewLoadbalancer creates a new Loadbalancer. It is guaranteed that two concurrent calls to Loadbalancer.Next will not return the same item, if the slice contains more than one item.

package main
import (
"fmt""atomicgo.dev/robin"
)
funcmain() {
set:= []string{"object1", "object2", "object3"}
lb:=robin.NewLoadbalancer(set)
fmt.Println(lb.Current())
}

Output

object1

func (*Loadbalancer[T]) AddItems

func (l*Loadbalancer[T]) AddItems(items...T)

AddItems adds items to the Loadbalancer.

package main
import (
"fmt""atomicgo.dev/robin"
)
funcmain() {
set:= []int{1, 2, 3}
lb:=robin.NewLoadbalancer(set)
lb.AddItems(4, 5, 6)
fmt.Println(lb.Items)
}

Output

[1 2 3 4 5 6]

func (*Loadbalancer[T]) Current

func (l*Loadbalancer[T]) Current() T

Current returns the current item in the slice, without advancing the Loadbalancer.

package main
import (
"fmt""atomicgo.dev/robin"
)
funcmain() {
set:= []int{1, 2, 3}
lb:=robin.NewLoadbalancer(set)
fmt.Println(lb.Current())
}

Output

1

func (*Loadbalancer[T]) Next

func (l*Loadbalancer[T]) Next() T

Next returns the next item in the slice. When the end of the slice is reached, it starts again from the beginning.

package main
import (
"fmt""atomicgo.dev/robin"
)
funcmain() {
set:= []int{1, 2, 3}
lb:=robin.NewLoadbalancer(set)
fori:=0; i<10; i++ {
fmt.Println(lb.Next())
}
}

Output

1
2
3
1
2
3
1
2
3
1

func (*Loadbalancer[T]) Reset

func (l*Loadbalancer[T]) Reset()

Reset resets the Loadbalancer to its initial state.

package main
import (
"fmt""atomicgo.dev/robin"
)
funcmain() {
set:= []int{1, 2, 3, 4, 5, 6}
lb:=robin.NewLoadbalancer(set)
lb.Next()
lb.Next()
lb.Next()
lb.Reset()
fmt.Println(lb.Current())
}

Output

1

Generated by gomarkdoc


AtomicGo.dev · with ❤️ by @MarvinJWendt | mjw.dev

About

🔄 Generic, fast and thread-safe round-robin loadbalancer library

Topics

Resources

Code of conduct

Stars

18 stars

Watchers

1 watching

Forks

Releases

Sponsor this project

Packages

Used by

Contributors

Languages

Generated from atomicgo/template