CDN architecture draft
Порядок запуска:
Раз: Бутается основной сервач
- В этот момент у нас нет никакого CDN вообще, и юзер не может ни читать, ни грузить пикчи
Два: Мастер-CDN коннектится к основному сервачу
- Теперь юзер читает и пишет пикчи на мастер-cdn
- Т.к. может быть только один мастер (чтобы иметь single source of truth), то имеет смысл в конфиге основного сервача добавить поле “вот этот user id – master cdn”
Три: Slave-CDN коннектятся к основному сервачу:
- Теперь юзер пишет пикчи на мастера, а читает их со слейвов;
- По-хорошему, неплохо бы раскидывать нагрузку между слейвами в зависимости от региона юзера и текущей нагруженности CDN’ов;
- Но объективно в обозримом будущем у нас или вообще не будет слейвов, или он будет только один (где-нибудь в Мск или Спб?);
- Если slave CDN подцепился раньше мастера – юзер сможет читать пикчи, но не сможет грузить;
Порядок работы:
- Юзер стучится на основной сервач, мол, хочу загрузить пикчу;
- Основной сервач отправляет грант мастеру;
- Основной сервач говорит юзеру “грузи вон туда с таким-то токеном”;
- Юзер грузит пикчу на мастер-сервач;
- Мастер сервач говорит основному серверу “у меня появилась новая пикча”;
- Основной сервач говорит слейвам “на мастере появилась новая пикча”;
- Слейвы скачивают пикчу с мастера;
- Примерно в этот момент юзер отправляет свое сообщение (для которого он грузил пикчи);
- Мастер рассылает сообщение юзерам, подставляя нужный CDN URL для каждого пользака;
- Пользаки ломятся на CDN и запрашивают пикчу;
- CDN проверяет есть ли у него эта пикча;
- Если нет – спрашивает ее у мастера;
- Если есть – дожидается пока будет снят лок с фаила;
- CDN отдает пикчу юзеру;
!!! Ванилла-юзер и загружает, и тягает мелочевку (аватары, стикеры) с захардкоженного CDN