1
0
mirror of https://github.com/redis/go-redis.git synced 2025-07-28 06:42:00 +03:00

feat: add proactive push notification processing to WithReader

- Add push notification processing to Conn.WithReader method
- Process notifications immediately before every read operation
- Provides proactive notification handling vs reactive processing
- Add proper error handling with internal.Logger
- Non-blocking implementation that doesn't break Redis operations
- Complements existing processing in Pool.Put and isHealthyConn

Benefits:
- Immediate processing when notifications arrive
- Called before every read operation for optimal timing
- Prevents notification backlog accumulation
- More responsive to Redis cluster changes
- Better user experience during migrations
- Optimal placement for catching asynchronous notifications

Implementation:
- Type-safe interface assertion for processor
- Context-aware error handling with logging
- Maintains backward compatibility
- Consistent with existing pool patterns
- Three-layer processing strategy: WithReader (proactive) + Pool.Put + isHealthyConn (reactive)

Use cases:
- MOVING/MIGRATING/MIGRATED notifications for slot migrations
- FAILING_OVER/FAILED_OVER notifications for failover scenarios
- Real-time cluster topology change awareness
- Improved connection utilization efficiency
This commit is contained in:
Nedyalko Dyakov
2025-06-27 22:49:39 +03:00
parent d820ade9e4
commit b6e712b41a
3 changed files with 21 additions and 14 deletions

View File

@ -433,7 +433,7 @@ func NewFailoverClient(failoverOpt *FailoverOptions) *Client {
// Initialize push notification processor using shared helper
// Use void processor by default for failover clients (typically don't need push notifications)
rdb.pushProcessor = initializePushProcessor(opt, true)
rdb.pushProcessor = initializePushProcessor(opt)
connPool = newConnPool(opt, rdb.dialHook)
rdb.connPool = connPool
@ -503,7 +503,7 @@ func NewSentinelClient(opt *Options) *SentinelClient {
// Initialize push notification processor using shared helper
// Use void processor by default for sentinel clients (typically don't need push notifications)
c.pushProcessor = initializePushProcessor(opt, true)
c.pushProcessor = initializePushProcessor(opt)
c.initHooks(hooks{
dial: c.baseClient.dial,