Pub/Sub система
Условие
Реализуйте простую систему Pub/Sub (publish/subscribe) с использованием каналов.
Интерфейс
type PubSub struct {
// ваши поля
}
func NewPubSub() *PubSub
func (ps *PubSub) Subscribe(topic string) <-chan string
func (ps *PubSub) Publish(topic, message string)
func (ps *PubSub) Unsubscribe(topic string, ch <-chan string)
func (ps *PubSub) Close()
Требования
- Несколько подписчиков на одну тему
- Публикация сообщений всем подписчикам темы
- Возможность отписки
- Корректное закрытие всех каналов
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Pub/Sub система
Построим систему publish/subscribe с каналами.
Реализация
Основные компоненты:
- RWMutex для синхронизации
- map[string][]chan string для подписчиков по темам
- Buffered каналы для неблокирующей отправки
Алгоритм Subscribe:
- Создаем новый канал размера 10
- Добавляем в список подписчиков темы
- Возвращаем канал клиенту
Алгоритм Publish:
- Получаем список подписчиков для темы
- Отправляем сообщение каждому с таймаутом
- Пропускаем медленных подписчиков
Алгоритм Unsubscribe:
- Ищем канал в списке подписчиков
- Удаляем из списка
- Закрываем канал
Алгоритм Close:
- Закрываем все каналы во всех темах
- Очищаем структуру данных
Сложность
- Subscribe: O(1) - добавление в конец массива
- Publish: O(n) где n - количество подписчиков
- Unsubscribe: O(n) - поиск в массиве
- Close: O(n*m) где n темы, m подписчики
Ключевые особенности
Buffered каналы: каждый канал размера 10 позволяет избежать блокировки издателя при отправке 10 сообщений
Non-blocking sends: используем select с таймаутом чтобы не блокировать если подписчик медлительный
RWMutex: используем для синхронизации доступа к структуре данных
Graceful close: при Close закрываем все каналы корректно
Потенциальные проблемы
Рace conditions: без RWMutex возможны race conditions при одновременных Subscribe и Publish
Memory leak: если забыть отписать, остаток в памяти
Deadlock: если не использовать select с таймаутом, медленный подписчик может заблокировать издателя
Panic на отправке в закрытый канал: нужно быть осторожным при Unsubscribe