@@ -21,20 +21,13 @@ const (
2121
2222type RedisTransport struct {
2323 sync.RWMutex
24- logger Logger
25- client * redis.Client
26- subscribers * SubscriberList
27- dispatcherPoolSize int
28- dispatcher chan SubscriberPayload
29- closed chan any
30- publishScript * redis.Script
31- closedOnce sync.Once
32- redisChannel string
33- }
34-
35- type SubscriberPayload struct {
36- subscriber * LocalSubscriber
37- payload Update
24+ logger Logger
25+ client * redis.Client
26+ subscribers * SubscriberList
27+ closed chan any
28+ publishScript * redis.Script
29+ closedOnce sync.Once
30+ redisChannel string
3831}
3932
4033func NewRedisTransport (
@@ -43,7 +36,6 @@ func NewRedisTransport(
4336 username string ,
4437 password string ,
4538 subscribersSize int ,
46- dispatcherPoolSize int ,
4739 redisChannel string ,
4840) (* RedisTransport , error ) {
4941 client := redis .NewClient (& redis.Options {
@@ -56,29 +48,26 @@ func NewRedisTransport(
5648 return nil , fmt .Errorf ("failed to connect to Redis: %w" , pong .Err ())
5749 }
5850
59- return NewRedisTransportInstance (logger , client , subscribersSize , dispatcherPoolSize , redisChannel )
51+ return NewRedisTransportInstance (logger , client , subscribersSize , redisChannel )
6052}
6153
6254func NewRedisTransportInstance (
6355 logger Logger ,
6456 client * redis.Client ,
6557 subscribersSize int ,
66- dispatcherPoolSize int ,
6758 redisChannel string ,
6859) (* RedisTransport , error ) {
6960 subscriber := client .PSubscribe (context .Background (), redisChannel )
7061
7162 subscribeCtx , subscribeCancel := context .WithCancel (context .Background ())
7263
7364 transport := & RedisTransport {
74- logger : logger ,
75- client : client ,
76- subscribers : NewSubscriberList (subscribersSize ),
77- dispatcherPoolSize : dispatcherPoolSize ,
78- publishScript : redis .NewScript (publishScript ),
79- dispatcher : make (chan SubscriberPayload ),
80- closed : make (chan any ),
81- redisChannel : redisChannel ,
65+ logger : logger ,
66+ client : client ,
67+ subscribers : NewSubscriberList (subscribersSize ),
68+ publishScript : redis .NewScript (publishScript ),
69+ closed : make (chan any ),
70+ redisChannel : redisChannel ,
8271 }
8372
8473 go func () {
@@ -103,19 +92,6 @@ func NewRedisTransportInstance(
10392 transport .subscribe (subscribeCtx , subscribeCancel , subscriber )
10493 }()
10594
106- wg .Add (dispatcherPoolSize )
107- for range dispatcherPoolSize {
108- go func () {
109- defer wg .Done ()
110- transport .dispatch ()
111- }()
112- }
113-
114- go func () {
115- wg .Wait ()
116- close (transport .dispatcher )
117- }()
118-
11995 return transport , nil
12096}
12197
@@ -154,10 +130,13 @@ func (t *RedisTransport) AddSubscriber(s *LocalSubscriber) error {
154130 return ErrClosedTransport
155131 default :
156132 }
133+
157134 t .Lock ()
158135 t .subscribers .Add (s )
159136 t .Unlock ()
160-
137+ if s .RequestLastEventID != "" {
138+ s .HistoryDispatched (EarliestLastEventID )
139+ }
161140 s .Ready ()
162141
163142 return nil
@@ -232,24 +211,12 @@ func (t *RedisTransport) subscribe(ctx context.Context, cancel context.CancelFun
232211 t .Lock ()
233212 for _ , subscriber := range t .subscribers .MatchAny (& update ) {
234213 update .Topics = topics
235- t . dispatcher <- SubscriberPayload { subscriber , update }
214+ subscriber . Dispatch ( & update , false )
236215 }
237216 t .Unlock ()
238217 }
239218}
240219
241- func (t * RedisTransport ) dispatch () {
242- for {
243- select {
244- case message := <- t .dispatcher :
245- message .subscriber .Dispatch (& message .payload , false )
246- case <- t .closed :
247-
248- return
249- }
250- }
251- }
252-
253220var (
254221 _ Transport = (* RedisTransport )(nil )
255222 _ TransportSubscribers = (* RedisTransport )(nil )
0 commit comments