Documentation
¶
Index ¶
- type DisconnectionBatcher
- type ErrorStatsBatcher
- type ErrorStatsItem
- type HeartbeatStatsEntry
- type HeartbeatStatsUpdater
- type Host
- type Manager
- func (m *Manager) DisconnectionBatcher() *DisconnectionBatcher
- func (m *Manager) ErrorStats() *ErrorStatsBatcher
- func (m *Manager) HeartbeatStats() *HeartbeatStatsUpdater
- func (m *Manager) MessageStats() *MessageStatsBatcher
- func (m *Manager) ObserverNotify() *ObserverNotificationBatcher
- func (m *Manager) RecordOutbox() *MessageRecordOutbox
- func (m *Manager) StatusUpdater() *MessageStatusUpdater
- func (m *Manager) StopRecords()
- func (m *Manager) StopTracking()
- type MessageRecordOutbox
- func (o *MessageRecordOutbox) DroppedCount() int64
- func (o *MessageRecordOutbox) OnFlushed(fn func(keys []models.MessageRecordKey))
- func (o *MessageRecordOutbox) Stop()
- func (o *MessageRecordOutbox) Submit(record *models.MessageSendRecord) bool
- func (o *MessageRecordOutbox) UpdateStatusIfPending(key models.MessageRecordKey, status models.MessageSendStatus, ...) bool
- type MessageRecordSinkProvider
- type MessageStatsBatcher
- type MessageStatusUpdater
- type ObserverNotificationBatcher
- func (b *ObserverNotificationBatcher) DroppedCount() int64
- func (b *ObserverNotificationBatcher) Flush(items []*ObserverNotifyItem)
- func (b *ObserverNotificationBatcher) Hub() ObserverNotifier
- func (b *ObserverNotificationBatcher) Processor() *syncx.BatchProcessor[*ObserverNotifyItem]
- func (b *ObserverNotificationBatcher) Stop()
- func (b *ObserverNotificationBatcher) Submit(msg *models.HubMessage, namespace string, groupIDs []string) bool
- type ObserverNotifier
- type ObserverNotifyItem
- type StatsIncrementItem
- type StatusUpdateItem
- type StorageBatchWriter
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type DisconnectionBatcher ¶
type DisconnectionBatcher struct {
// contains filtered or unexported fields
}
DisconnectionBatcher 断连终态批量更新器
func NewDisconnectionBatcher ¶
func NewDisconnectionBatcher(hub StorageBatchWriter) *DisconnectionBatcher
NewDisconnectionBatcher 创建断连终态批量更新器
func (*DisconnectionBatcher) Submit ¶
func (b *DisconnectionBatcher) Submit(entry *models.DisconnectionEntry) bool
Submit 非阻塞提交断连终态条目 队列满时返回 false(上层记录池本就是可丢弃语义,风暴极端场景下 丢弃终态只影响审计统计精度,不影响连接清理与消息投递主流程)
type ErrorStatsBatcher ¶
type ErrorStatsBatcher struct {
// contains filtered or unexported fields
}
ErrorStatsBatcher 连接错误统计批量更新器
func NewErrorStatsBatcher ¶
func NewErrorStatsBatcher(hub StorageBatchWriter, queueSize, batchSize int, flushInterval time.Duration) *ErrorStatsBatcher
NewErrorStatsBatcher 创建连接错误统计批量更新器
func (*ErrorStatsBatcher) Submit ¶
func (u *ErrorStatsBatcher) Submit(item *ErrorStatsItem) bool
Submit 非阻塞提交连接错误 队列满时返回 false(错误统计可丢弃,非核心路径)
type ErrorStatsItem ¶
ErrorStatsItem 连接错误条目(Hub 侧构造)
type HeartbeatStatsEntry ¶
HeartbeatStatsEntry 心跳统计条目
type HeartbeatStatsUpdater ¶
type HeartbeatStatsUpdater struct {
// contains filtered or unexported fields
}
HeartbeatStatsUpdater 心跳统计批量更新器
func NewHeartbeatStatsUpdater ¶
func NewHeartbeatStatsUpdater(hub StorageBatchWriter, queueSize, batchSize int, flushInterval time.Duration) *HeartbeatStatsUpdater
NewHeartbeatStatsUpdater 创建心跳统计批量更新器
func (*HeartbeatStatsUpdater) Stop ¶
func (u *HeartbeatStatsUpdater) Stop()
Stop 停止更新器,flush 剩余数据后退出
func (*HeartbeatStatsUpdater) Submit ¶
func (u *HeartbeatStatsUpdater) Submit(entry *HeartbeatStatsEntry) bool
Submit 非阻塞提交心跳统计 队列满时返回 false(心跳数据可丢弃,下次心跳会补上)
type Host ¶
type Host interface {
StorageBatchWriter
GetMessageSink() spi.MessageSink
}
Host 批处理器域宿主端口(Manager 聚合构造五个批处理器所需的能力面)
由 hub 编排层实现:StorageBatchWriter 覆盖状态/消息统计/心跳统计三个更新器, GetMessageSink 覆盖记录 outbox(MessageRecordSinkProvider 能力面); 观察者直投(ObserverNotifier)由消息域 Manager 实现并单独注入—— 观察者投递语义归 messaging 域,batcher flush 直连域组件不再绕编排层
type Manager ¶
type Manager struct {
// contains filtered or unexported fields
}
Manager 批处理器域管理器:持有七个攒批组件并提供域内访问器
func NewManager ¶
func NewManager(host Host, observerNotify ObserverNotifier, cfg *wscconfig.BatcherConfig) *Manager
NewManager 构造全部批处理器并启动后台 flush 协程 observerNotify 为观察者直投端口(消息域 Manager 实现,flush 回调直连域组件); cfg 为 nil 或子项零值时,各组件内部使用默认参数兜底(Get*Params 已处理)
func (*Manager) DisconnectionBatcher ¶
func (m *Manager) DisconnectionBatcher() *DisconnectionBatcher
DisconnectionBatcher 断连终态批量更新器
func (*Manager) ErrorStats ¶
func (m *Manager) ErrorStats() *ErrorStatsBatcher
ErrorStats 连接错误统计批量更新器
func (*Manager) HeartbeatStats ¶
func (m *Manager) HeartbeatStats() *HeartbeatStatsUpdater
HeartbeatStats 心跳统计批量更新器
func (*Manager) MessageStats ¶
func (m *Manager) MessageStats() *MessageStatsBatcher
MessageStats 消息统计批量聚合器
func (*Manager) ObserverNotify ¶
func (m *Manager) ObserverNotify() *ObserverNotificationBatcher
ObserverNotify 观察者通知批量处理器
func (*Manager) RecordOutbox ¶
func (m *Manager) RecordOutbox() *MessageRecordOutbox
RecordOutbox 消息记录攒批 outbox
func (*Manager) StatusUpdater ¶
func (m *Manager) StatusUpdater() *MessageStatusUpdater
StatusUpdater 消息状态批量更新器
func (*Manager) StopRecords ¶
func (m *Manager) StopRecords()
StopRecords 停止断连终态 / 记录 outbox 与状态更新器(连接清理后调用) 断连终态须待本段:unregister 风暴的 Submit 发生在连接清理期间(StopTracking 之后); 先 outbox 后 statusUpdater:保 INSERT→UPDATE 落库顺序,避免 UPDATE 扑空; 在 Hub cancel 之前调用,确保 flush 时 h.ctx 仍然有效
func (*Manager) StopTracking ¶
func (m *Manager) StopTracking()
StopTracking 停止心跳统计 / 消息统计 / 错误统计 / 观察者通知批处理器 连接清理前调用,Stop 内部 flush 剩余数据并等待完成
type MessageRecordOutbox ¶
type MessageRecordOutbox struct {
// contains filtered or unexported fields
}
MessageRecordOutbox 消息发送记录攒批 outbox
func NewMessageRecordOutbox ¶
func NewMessageRecordOutbox(provider MessageRecordSinkProvider, queueSize, batchSize int, flushInterval time.Duration) *MessageRecordOutbox
NewMessageRecordOutbox 创建消息记录攒批 outbox 并启动后台 flush 协程
func (*MessageRecordOutbox) DroppedCount ¶
func (o *MessageRecordOutbox) DroppedCount() int64
DroppedCount 返回累计丢弃条目数(队列满时丢弃,监控背压用)
func (*MessageRecordOutbox) OnFlushed ¶
func (o *MessageRecordOutbox) OnFlushed(fn func(keys []models.MessageRecordKey))
OnFlushed 注册 flush 成功回调(每批仅对状态仍为 sending 的记录回调,供 ACK 超时注册)
func (*MessageRecordOutbox) Stop ¶
func (o *MessageRecordOutbox) Stop()
Stop 停止后台协程并 flush 剩余记录(SafeShutdown 在 Hub cancel 前调用)
func (*MessageRecordOutbox) Submit ¶
func (o *MessageRecordOutbox) Submit(record *models.MessageSendRecord) bool
Submit 提交一条待落库记录(同 key 重复提交以最新为准:重试路径复用同一 messageID) 队列满时该条丢弃并告警(极端背压下的最终一致性语义,与 statusUpdater 对齐)
func (*MessageRecordOutbox) UpdateStatusIfPending ¶
func (o *MessageRecordOutbox) UpdateStatusIfPending(key models.MessageRecordKey, status models.MessageSendStatus, reason models.FailureReason, errMsg string) bool
UpdateStatusIfPending 记录尚未落库时直接合并状态更新(消除攒批竞态) 返回 true 表示已合并(调用方跳过 statusUpdater 的 UPDATE 提交)
type MessageRecordSinkProvider ¶
type MessageRecordSinkProvider interface {
GetMessageSink() spi.MessageSink
GetLogger() spi.Logger
}
MessageRecordSinkProvider outbox 依赖端口(窄接口:sink + logger,hub 与测试桩均可实现)
type MessageStatsBatcher ¶
type MessageStatsBatcher struct {
// contains filtered or unexported fields
}
MessageStatsBatcher 消息统计批量更新器
func NewMessageStatsBatcher ¶
func NewMessageStatsBatcher(hub StorageBatchWriter, queueSize, batchSize int, flushInterval time.Duration) *MessageStatsBatcher
NewMessageStatsBatcher 创建消息统计批量更新器
func (*MessageStatsBatcher) Acquire ¶
func (u *MessageStatsBatcher) Acquire() *StatsIncrementItem
Acquire 获取池化统计条目(已清零,填充字段后经 Submit 入队) 高频路径(广播扇出逐接收者统计)以 Acquire+Submit 替代字面量构造,消除逐条堆分配; 清零在 Acquire 时执行(归还时不触碰字段),防上一轮残留计数串扰 所有权契约:Submit 后条目归批量器所有(flush 后回池复用),调用方不得继续持有使用, 同一指针仅可 Submit 一次(重复入队会破坏池内唯一性)
func (*MessageStatsBatcher) Submit ¶
func (u *MessageStatsBatcher) Submit(item *StatsIncrementItem) bool
Submit 非阻塞提交统计增量 队列满时返回 false(统计数据可丢失,非核心路径),条目即时归还池
type MessageStatusUpdater ¶
type MessageStatusUpdater struct {
// contains filtered or unexported fields
}
MessageStatusUpdater 消息状态批量更新器
func NewMessageStatusUpdater ¶
func NewMessageStatusUpdater(hub StorageBatchWriter, queueSize, batchSize int, flushInterval time.Duration) *MessageStatusUpdater
NewMessageStatusUpdater 创建消息状态批量更新器
func (*MessageStatusUpdater) Submit ¶
func (u *MessageStatusUpdater) Submit(item *StatusUpdateItem) bool
Submit 非阻塞提交状态更新 队列满时返回 false(调用方可记 metric 或降级处理)
type ObserverNotificationBatcher ¶
type ObserverNotificationBatcher struct {
// contains filtered or unexported fields
}
ObserverNotificationBatcher 观察者通知批量处理器
func NewObserverNotificationBatcher ¶
func NewObserverNotificationBatcher(hub ObserverNotifier, queueSize, batchSize int, flushInterval time.Duration) *ObserverNotificationBatcher
NewObserverNotificationBatcher 创建观察者通知批量处理器
func (*ObserverNotificationBatcher) DroppedCount ¶
func (b *ObserverNotificationBatcher) DroppedCount() int64
DroppedCount 返回累计丢弃的观察者通知数(队列满时丢弃)
func (*ObserverNotificationBatcher) Flush ¶
func (b *ObserverNotificationBatcher) Flush(items []*ObserverNotifyItem)
Flush 批量处理观察者通知 逐条执行本地观察者投递 + 跨节点广播,消除 per-message goroutine
func (*ObserverNotificationBatcher) Hub ¶
func (b *ObserverNotificationBatcher) Hub() ObserverNotifier
Hub 返回本批处理器绑定的通知端口(观测/测试断言用)
func (*ObserverNotificationBatcher) Processor ¶
func (b *ObserverNotificationBatcher) Processor() *syncx.BatchProcessor[*ObserverNotifyItem]
Processor 返回底层批处理器(观测/测试断言用)
func (*ObserverNotificationBatcher) Stop ¶
func (b *ObserverNotificationBatcher) Stop()
Stop 停止处理器,flush 剩余数据后退出
func (*ObserverNotificationBatcher) Submit ¶
func (b *ObserverNotificationBatcher) Submit(msg *models.HubMessage, namespace string, groupIDs []string) bool
Submit 非阻塞提交观察者通知 msg 由 BatchProcessor.WithClone 自动深拷贝,调用方无需关心数据隔离 队列满时返回 false(观察者通知可丢失,非核心路径)
type ObserverNotifier ¶
type ObserverNotifier interface {
// NotifyObserversDirect 直接通知观察者(不经批处理队列,避免递归入队)
NotifyObserversDirect(msg *models.HubMessage, namespace string, groupIDs []string)
}
ObserverNotifier 观察者通知能力(ObserverNotificationBatcher 所需)
type ObserverNotifyItem ¶
type ObserverNotifyItem struct {
Msg *models.HubMessage
Namespace string
GroupIDs []string
}
ObserverNotifyItem 观察者通知条目(内部使用) ObserverNotifyItem 观察者通知条目
type StatsIncrementItem ¶
type StatsIncrementItem struct {
ConnectionID string
MessagesSent int64
MessagesReceived int64
BytesSent int64
BytesReceived int64
}
StatsIncrementItem 统计增量条目(Hub 侧构造)
type StatusUpdateItem ¶
type StatusUpdateItem struct {
MessageID string
Receiver string // 接收者ID(广播类记录为空串)
Status models.MessageSendStatus // 消息发送状态
Reason models.FailureReason // 失败原因
ErrMsg string // 错误信息
}
StatusUpdateItem 消息状态更新项(Hub 侧构造) Receiver 参与 MessageSink 复合键定位:P2P 场景下同一 message_id 为每个 receiver 各建一条记录,缺少 receiver 会造成多 receiver 状态相互覆盖
type StorageBatchWriter ¶
type StorageBatchWriter interface {
// Context 返回 Hub 生命周期上下文(仅用于日志关联)
Context() context.Context
// GetLogger 日志器
GetLogger() spi.Logger
// GetConnectionRecordRepo 连接记录仓储(心跳时间戳落 connect 表)
GetConnectionRecordRepo() spi.ConnectionStore
// GetConnectionQualityRepository 连接质量仓储(心跳统计 / 消息统计)
GetConnectionQualityRepository() spi.ConnectionQualityStore
// GetMessageRecordRepo 消息记录仓储(消息状态更新)
GetMessageRecordRepo() spi.MessageSink
}
StorageBatchWriter 存储批量写入能力 (HeartbeatStatsUpdater / MessageStatsBatcher / MessageStatusUpdater 共同所需)
三者都是「攒批 → 单事务落库」的写放大抑制剂,能力面完全一致,故共用一个端口。
flush 刻意不使用 Context():三个更新器都用 context.WithTimeout(context.Background(), 5s),避免 Hub 关闭时最后一批 落库被 cancel 截断。Context() 仅供日志关联。