package service import "context" // ProcessPendingOutbox 把待投递事件补偿性地推送给异步消费者。 func (s *Service) ProcessPendingOutbox(ctx context.Context, limit int) error { // 补偿 worker 从 repository 扫描 pending 事件;同步 room->im 失败不会回滚房间状态。 records, err := s.repository.ListPendingOutbox(ctx, limit) if err != nil { return err } for _, record := range records { if err := s.outboxPublisher.PublishOutboxEvent(ctx, record.Envelope); err != nil { // 投递失败保持 pending,并记录错误和重试次数,等待下一轮 worker 再试。 if markErr := s.repository.MarkOutboxFailed(ctx, record.EventID, err.Error()); markErr != nil { return markErr } continue } // 只有外部发布成功后才能标记 published。 if err := s.repository.MarkOutboxPublished(ctx, record.EventID); err != nil { return err } } return nil }