@@ -21,20 +21,13 @@ const (
21
21
22
22
type RedisTransport struct {
23
23
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
38
31
}
39
32
40
33
func NewRedisTransport (
@@ -43,7 +36,6 @@ func NewRedisTransport(
43
36
username string ,
44
37
password string ,
45
38
subscribersSize int ,
46
- dispatcherPoolSize int ,
47
39
redisChannel string ,
48
40
) (* RedisTransport , error ) {
49
41
client := redis .NewClient (& redis.Options {
@@ -56,29 +48,26 @@ func NewRedisTransport(
56
48
return nil , fmt .Errorf ("failed to connect to Redis: %w" , pong .Err ())
57
49
}
58
50
59
- return NewRedisTransportInstance (logger , client , subscribersSize , dispatcherPoolSize , redisChannel )
51
+ return NewRedisTransportInstance (logger , client , subscribersSize , redisChannel )
60
52
}
61
53
62
54
func NewRedisTransportInstance (
63
55
logger Logger ,
64
56
client * redis.Client ,
65
57
subscribersSize int ,
66
- dispatcherPoolSize int ,
67
58
redisChannel string ,
68
59
) (* RedisTransport , error ) {
69
60
subscriber := client .PSubscribe (context .Background (), redisChannel )
70
61
71
62
subscribeCtx , subscribeCancel := context .WithCancel (context .Background ())
72
63
73
64
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 ,
82
71
}
83
72
84
73
go func () {
@@ -103,19 +92,6 @@ func NewRedisTransportInstance(
103
92
transport .subscribe (subscribeCtx , subscribeCancel , subscriber )
104
93
}()
105
94
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
-
119
95
return transport , nil
120
96
}
121
97
@@ -154,10 +130,13 @@ func (t *RedisTransport) AddSubscriber(s *LocalSubscriber) error {
154
130
return ErrClosedTransport
155
131
default :
156
132
}
133
+
157
134
t .Lock ()
158
135
t .subscribers .Add (s )
159
136
t .Unlock ()
160
-
137
+ if s .RequestLastEventID != "" {
138
+ s .HistoryDispatched (EarliestLastEventID )
139
+ }
161
140
s .Ready ()
162
141
163
142
return nil
@@ -232,24 +211,12 @@ func (t *RedisTransport) subscribe(ctx context.Context, cancel context.CancelFun
232
211
t .Lock ()
233
212
for _ , subscriber := range t .subscribers .MatchAny (& update ) {
234
213
update .Topics = topics
235
- t . dispatcher <- SubscriberPayload { subscriber , update }
214
+ subscriber . Dispatch ( & update , false )
236
215
}
237
216
t .Unlock ()
238
217
}
239
218
}
240
219
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
-
253
220
var (
254
221
_ Transport = (* RedisTransport )(nil )
255
222
_ TransportSubscribers = (* RedisTransport )(nil )
0 commit comments