Создайте один общий поток соединения, разбирайте JSON один раз и раздавайте типизированные события подписчикам. Иначе каждый collector холодного Flow может открыть собственное соединение.
Эффективная модель обработки серверных событий
Создайте один общий поток соединения, разбирайте JSON один раз и раздавайте типизированные события подписчикам. Иначе каждый collector холодного Flow может открыть собственное соединение.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Имеется абстракция соединения с сервером, через которую сервер передаёт поток событий в виде JSON‑сообщений. Различные модули приложения подписываются на определённые типы событий. Требуется спроектировать и реализовать эффективный механизм, позволяющий разным частям системы получать только интересующие их события, минимизировать накладные расходы и обеспечить удобный способ подписки/отписки.
interface ServerConnection {
// Emits events in JSON format
fun event(): Flow<String>
}
Ответ
Создайте один общий поток соединения, разбирайте JSON один раз и раздавайте типизированные события подписчикам. Иначе каждый collector холодного Flow может открыть собственное соединение.
Парсер преобразует сообщения в sealed Event; некорректный JSON обрабатывается на уровне отдельного сообщения. Затем shareIn в scope соединения создаёт общую подписку, а потребители выбирают тип через filterIsInstance. replay и буфер задайте по контракту: события можно пропускать или требуется восстановление по ID. Для очень большого числа подписчиков добавляют маршрутизацию по типу, а не фильтруют весь поток каждым модулем. Отписка происходит отменой collector; переподключение и повторная доставка требуют дедупликации.