Major update to the data service. Added gRPC and socket servers. Switched to using only a single go.mod at the root.
This commit is contained in:
67
services/data_service/internal/router/router.go
Normal file
67
services/data_service/internal/router/router.go
Normal file
@@ -0,0 +1,67 @@
|
||||
package router
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"gitlab.michelsen.id/phillmichelsen/tessera/services/data_service/internal/domain"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Router struct {
|
||||
incoming chan domain.Message
|
||||
routes map[domain.Identifier][]chan<- domain.Message
|
||||
mu sync.RWMutex
|
||||
}
|
||||
|
||||
func NewRouter() *Router {
|
||||
return &Router{
|
||||
incoming: make(chan domain.Message, 64), // Buffered channel for incoming messages
|
||||
routes: make(map[domain.Identifier][]chan<- domain.Message),
|
||||
}
|
||||
}
|
||||
|
||||
func (r *Router) IncomingChannel() chan<- domain.Message {
|
||||
return r.incoming
|
||||
}
|
||||
|
||||
func (r *Router) Run() {
|
||||
for msg := range r.incoming {
|
||||
startTime := time.Now()
|
||||
r.mu.RLock()
|
||||
channels := r.routes[msg.Identifier]
|
||||
|
||||
for _, ch := range channels {
|
||||
select {
|
||||
case ch <- msg:
|
||||
default:
|
||||
fmt.Println("Dropped message, buffer full!!!")
|
||||
}
|
||||
}
|
||||
r.mu.RUnlock()
|
||||
fmt.Printf("Message routed to %d channels in %v\n", len(channels), time.Since(startTime))
|
||||
}
|
||||
}
|
||||
|
||||
func (r *Router) RegisterRoute(id domain.Identifier, ch chan<- domain.Message) {
|
||||
r.mu.Lock()
|
||||
r.routes[id] = append(r.routes[id], ch)
|
||||
r.mu.Unlock()
|
||||
}
|
||||
|
||||
func (r *Router) DeregisterRoute(id domain.Identifier, ch chan<- domain.Message) {
|
||||
r.mu.Lock()
|
||||
slice := r.routes[id]
|
||||
for i := 0; i < len(slice); i++ {
|
||||
if slice[i] == ch {
|
||||
slice[i] = slice[len(slice)-1]
|
||||
slice = slice[:len(slice)-1]
|
||||
i--
|
||||
}
|
||||
}
|
||||
if len(slice) == 0 {
|
||||
delete(r.routes, id)
|
||||
} else {
|
||||
r.routes[id] = slice
|
||||
}
|
||||
r.mu.Unlock()
|
||||
}
|
||||
Reference in New Issue
Block a user