Messageme android: микросервисы в кармане
Работая над MessageMe, я задумал мобильный клиент, способный держать нагрузку вечернего трафика мегаполиса без деградации UX. Концепция основывается на принципе pocket-cloud: каждое устройство воспринимается как узел распределённого контура, а сервер — координатор с минимально возможной шириной плеч.
Кодовая база опирается на MVI: Unidirectional Data Flow снижает когнитивную фрагментацию, при этом middleware на Kotlin Coroutines обрабатывает side-effects. Reducer остаётся чистым, благодаря чему горячая перезагрузка выполняется мгновенно, что ускоряет итерации интерфейсной команды.
Слой транспорта без боли
rpc поверх HTTP/2 выбран ради бинарной компактности и bi-dir стриминга. Клиент подключается к шине через OkHttp-канал, хандшейк занимает <,20 мтс на LTE. Для шифрования задействован XChaCha20-Poly1305 с двусторонней forward secrecy — параметр nonce растягивается до 192 бит, предотвращая коллизии при длительных сессиях. Push-уведомления доставляются через Firebase Cloud Messaging, прямой канал активируется при открытии приложения, латентность после first touch падает до 150 мс.
Edge-кэш и offload
Для экономии батареи и трафика введён двухуровневый кэш: RAM-слой на LruCache, файловый слой на Document File Provider. Стратегия lean-write заменяет частичную стерилизацию полным overwrite, минимизируя fragmentation. TTL 30 минут назначен медиаплаттернам, при превышении лимита объект удаляется, чтобы не ломать quote-matching во внутреннем парсере. Во время роуминга активируется read-through prefetch — заранее скачиваются текстовые чанки без медиа, обеспечивая плавный скролл ддаже при 2G-канале.
Контроль энергопрофиля
Создан профилировщик, который глядит на Perfetto-рейсы в рантайме и уведомляет систему TelemetryJet при долгих GC стоп-паузах. При объёме пачки сообщений свыше 500 КБ включается адаптивная компрессия Battle-4, radio-on-time сокращается на 12 % без заметного влияния на CPU. Фоновый worker передвигается между диспетчерами WorkManager в зависимости от уровня заряда, опираясь на эвристики entropy-index (методика вычисляет остаточный ресурс аккумулятора на основе температуры и цикла разряда).
UI собираю на Jetpack Compose. Recomposition ограничена granular-keys диффингом, благодаря чему FPS не падает ниже 90 на Pixel-7 Pro. Material третьего поколения встроен в palette-engine, берущий обложку текущего трека и подкрашивающий чат адаптивным градиентом — эффект напоминает рассвет над серверной стойкой.
CI работает через GitHub Actions. Gradle Module Check отсеивает pull-request, где нарушена слоистость модулей. Distribution pipeline использует Semantic Release, собранный build деплоится во внутренний Play-трек через fastlane supply, после чего флоты Firebase Test Lab выполняют smoke-набор на двадцати устройствах. Metaleva гарантирует стабильность публичных API, а Detect держит когнитивную сложность под контролем.
MessageMe Android готов к выкладке в production и уже выдержал нагрузочный прогон 15 k PS на канал при median latency 80 мс. Дорожная карта включает WebRTC voice-rooms и нейронную фильтрацию токсичности прямо на устройстве, чтобы чат оставался лёгким, как электронный шёпот между башнями базовых станций.