feat: backend service
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
package push
|
||||
|
||||
import (
|
||||
pushv1 "galaxy/backend/proto/push/v1"
|
||||
)
|
||||
|
||||
// subscription is the per-gateway-instance delivery queue. Each
|
||||
// subscription owns a buffered channel; the publisher writes into it
|
||||
// without blocking by dropping the oldest queued event when the buffer
|
||||
// is full. The done channel is closed by the Service when the
|
||||
// subscription is replaced (a new connection arrived for the same
|
||||
// gateway_client_id) or when the Service is shutting down.
|
||||
type subscription struct {
|
||||
clientID string
|
||||
ch chan *pushv1.PushEvent
|
||||
done chan struct{}
|
||||
dropped uint64
|
||||
}
|
||||
|
||||
// deliver enqueues ev into the subscription's buffer. When the buffer
|
||||
// is full, the oldest queued event is dropped to make room and the
|
||||
// dropped counter increments. The bool reports whether a drop occurred,
|
||||
// so the publisher can update its drop metric.
|
||||
//
|
||||
// The Service holds its mutex while calling deliver, which means at
|
||||
// most one publisher writes to ch at a time. The reader goroutine runs
|
||||
// independently and only consumes from ch, so the second send below is
|
||||
// guaranteed not to block: after evicting the head, the channel has at
|
||||
// least one free slot which no other publisher can fill.
|
||||
func (s *subscription) deliver(ev *pushv1.PushEvent) bool {
|
||||
select {
|
||||
case s.ch <- ev:
|
||||
return false
|
||||
default:
|
||||
}
|
||||
select {
|
||||
case <-s.ch:
|
||||
default:
|
||||
}
|
||||
s.ch <- ev
|
||||
s.dropped++
|
||||
return true
|
||||
}
|
||||
Reference in New Issue
Block a user