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:
2025-06-27 18:24:10 +08:00
parent b017291a5a
commit b9cd25e9b4
32 changed files with 1532 additions and 276 deletions

View 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()
}