Предыстория: я создал типичный веб-сайт, который позволяет пользователям загружать фотографии и видео (ничего слишком большого, заметьте). В настоящее время я размещаю этот веб-сайт в одной капле DigitalOcean (Nginx, PHP, MySQL, Memcached для сеансов / кеша), расположенной в Лондоне, Великобритания. У меня есть корзина S3, расположенная в Ирландии, в которую я загружаю файлы с сервера.
Проблема: проблема заключается в том, что для пользователей, находящихся за пределами Великобритании и Европы, скорость загрузки ниже, иногда намного медленнее (например, из США или Австралии). Это оставляет их разочарованными.
У AWS есть довольно интересные вещи, например S3 Ускорение передачи и S3 Предписанные сообщения POST (позволяя пользователям загружать данные непосредственно в корзину без учетных данных AWS). Но последний не очень дружелюбен к AJAX - вы можете попросить S3 вернуть ответ XML, но, поскольку это междоменный, он не читается с помощью JS. Таким образом, нет возможности узнать имя ключа (файла). НАСКОЛЬКО МНЕ ИЗВЕСТНО.
Я также пробовал загружать файлы напрямую в корзину S3 с помощью AWS JavaScript SDK, но это будет означать, что мне придется заставить своих пользователей повторно проходить аутентификацию, я думаю (и я хочу этого избежать).
Я думал о добавлении сервера, например, в США и разделении сервисов, так что два веб-сервера, сервер сеанса и сервер базы данных. Затем используйте маршрутизацию на основе задержки с Route 53 для маршрутизации на веб-сервер с наименьшей задержкой. Но тогда у меня проблема с высокой задержкой с серверами сеанса и БД в разных местах веб-серверов. И проблема липких сессий.
Мне было интересно, есть ли у кого-нибудь предложения по этому поводу, может быть, я слишком усложняю его, и есть более простое решение. Любые советы высоко ценится!
У вас есть несколько вариантов.
Вы можете настроить CloudFront для обслуживания всего вашего контента (включая страницы и загрузки) и посмотреть, ускорит ли это работу. Весь трафик, в том числе динамический, может проходить через CloudFront, и это высокооптимизированная сеть с высокой пропускной способностью, которая сама по себе может немного уменьшить задержку. Одного этого может быть достаточно, чтобы сделать его достаточно удобным для ваших пользователей. На ваших серверах нет AWS, поэтому это может не сработать, но CloudFront поддерживает любое происхождение. CloudFlare имеют аналогичную технологию, они проксируют весь ваш трафик и будут иметь частные сети, так что это тоже стоит попробовать - у них есть бесплатный уровень.
Если вы хотите добавить еще один сервер в США, стоит просто добавить веб-сервер. Задержка между этими точками примерно 70 - 110 мс. Я бы установил тестовый сервер в США, разговаривающий с лондонской базой данных, и посмотрел, как он работает. Это будет проходить через общедоступный Интернет, поэтому, когда вы пройдете тестирование, я бы предложил использовать шифрование - либо собственную базу данных, либо VPN.
Вы можете разместить реплику для чтения в США и направить трафик записи в основную базу данных, при этом чтение будет происходить из реплики для чтения. Это означает, что большая часть трафика действительно быстрая, но случайная запись будет немного медленнее. Поскольку вы не используете серверы AWS, вам, вероятно, придется использовать собственную репликацию базы данных, а не простую настройку реплики чтения AWS. Я не уверен, легко ли делать реплики чтения с помощью собственной базы данных или вам нужно перейти к реплике для чтения / записи.
Вы можете использовать конфигурацию двойной главной базы данных с репликацией между ними. Это может сработать, если пользователи вряд ли будут изменять существующие данные в двух местах одновременно или если схема такова, что изменения происходят редко. Задержка реплики может составлять несколько секунд, поэтому это может вызвать некоторые проблемы с состоянием, поэтому я, вероятно, не буду пробовать это сначала.
Это несколько идей, пришедших мне в голову. Выскажи мне свои мысли, может, мне в голову придет еще что-нибудь. У кого-то может быть лучшее решение.