О мессенджерах и нотификациях

Анатолий 'Ин Ши' Попов bio photo By Анатолий 'Ин Ши' Попов 0 Comments

На днях обсуждали альтернативы различным мессенджерам (например, слаку и вовсе не телеграму или максу, конечно же, товарищ майор), и товарищи справедливо заметили, что в подавляющем большинство self-hosted мессенджеров есть огромная проблема с нотификациями: либо их нет, либо есть, но лучше бы не было - то работают, то не работают. Попробую объяснить почему так.

На самом деле всё просто, если разобраться, что такое push-нотификация. У нас с вами 2 основные платформы для отправки пушей: android и ios. На самом деле больше, но это не важно, потому что этих двух достаточно для иллюстрации, а остальные работают ровно так же. Есть куча агрегаторов, о них позже.

Пуш-нотификация, в 99% случаев (есть ещё intra-app нотификации, но это в моей практике редкость) - это данные, в определённом формате (типов нотификаций много разных, но это здесь иррелевантно) хранит сервер владельца платформы, т.е. гугла в случае дроида и эппла в случае ios, ну а ваш девайс периодически скачивает эти пуши путём запроса на соответствующий сервер. Этим объясняется то, что сервера приложения, например, заблокированы властями или админом вашей рабочей сети, а нотификации всё ещё приходят.

Так как вся коммуникация происходит через открытые каналы, там есть авторизация. Т.е. ваш бэкенд должен обладать каким-то секретом от аппы, чтобы отправить пуш любому пользователю. Как вы понимаете, если у меня селфхост сервер, и у Васи селфхост сервер, вряд ли мы будем обладать одним секретом. Скорее всего мы захотим обладать разными ключами. Обычно делают вайтлейбл приложения: вы берёте опен-сорц приложение, меняете там иконку, название и идентификатор на свои и заливаете в аппсторы вендорам. Там генерируете секреты, втыкаете в свой селфхост и всё работает. Нюанс, безусловно есть: не знаю как щас, но чтобы зарегать приложение на ios, надо аккаунт разработчика, а он стоил $100 в год. У гугля - бесплатно.

Некоторые вендоры опенсорс софта разрешают использовать их аппу (Zulip или Рокетчат, например) и ваш селфхост сервер шлёт пуши через сервер вендора. Как вы догадываетесь, на бесплатных акках там есть лимит обычно: до 10 или 100 тысяч пушей в месяц (смотрите документацию вашего вендора), после чего пуши перестают ходить. Модель монетизации может быть другой, но суть вы уловили, я думаю. Некоторые для некоммерческих приложений могут давать бесплатно бесконечные пуши, но большинство так не делают.

Теперь про агрегаторы. Они никаким волшебным образом не работают, вы им скармливаете секреты от своих апп и верите, что они не начнут рассылать вашим пользователям лишних нотификаций. Нужны они разумеется для сбора с вас денег - их услуги достаточно дороги, агрегации аналитики, в том числе и кроссаппово. При этом, начиная с каких-то объёмов, они обычно начинают стоить настолько дорого, что многие разработчики начинают строить свою аналитику. Основной плюс агрегаторов в том, что разработчикам проще писать ПО: надо отправлять нотификации в одну точку, а не в разные, в зависимости от девайса(-ов) пользователя.