awesome-patterns/messaging/fan_out.md

49 lines
1.4 KiB
Markdown
Raw Permalink Normal View History

2020-05-07 07:18:03 +03:00
# Fan-Out Messaging Pattern
2016-04-12 06:25:19 +03:00
=========================
Fan-Out is a messaging pattern used for distributing work amongst workers (producer: source, consumers: destination).
2016-01-18 20:01:39 +03:00
2016-04-12 06:25:19 +03:00
We can model fan-out using the Go channels.
```go
// Split a channel into n channels that receive messages in a round-robin fashion.
func Split(ch <-chan int, n int) []<-chan int {
2020-05-07 07:18:03 +03:00
cs := make([]chan int)
for i := 0; i < n; i++ {
cs = append(cs, make(chan int))
}
// Distributes the work in a round robin fashion among the stated number
// of channels until the main channel has been closed. In that case, close
// all channels and return.
distributeToChannels := func(ch <-chan int, cs []chan<- int) {
// Close every channel when the execution ends.
defer func(cs []chan<- int) {
for _, c := range cs {
close(c)
}
}(cs)
for {
for _, c := range cs {
select {
case val, ok := <-ch:
if !ok {
return
}
c <- val
}
}
}
}
go distributeToChannels(ch, cs)
return cs
2016-01-18 20:01:39 +03:00
}
2016-04-12 06:25:19 +03:00
```
2020-05-07 07:18:03 +03:00
The `Split` function converts a single channel into a list of channels by using
2016-04-12 06:25:19 +03:00
a goroutine to copy received values to channels in the list in a round-robin fashion.