Рейтинг:0

AWS – Как обрабатывать глобальное «время туда и обратно»?

флаг aw

Эй, люди с ошибкой сервера,

Представьте себе обычную компанию «Программное обеспечение как услуга», предлагающую услугу, работающую на AWS (эй, это мы). Здесь нет ничего сложного, стандартное веб-приложение делает свое дело, как обычно, и приложение для смартфона конечного пользователя. Поскольку клиенты из Европа, естественно, регион AWS eu-central-1 содержит все для нескольких арендаторов.

Теперь отделу продаж удается привлечь клиента из Австралия - Пока все хорошо, так как веб-приложение уже может работать с разными часовыми поясами, валютами и локалями. Но: Австралия так далеко, как вы можете добраться от Европы (по крайней мере, на Земле), и поэтому теперь требуется довольно много времени на поездку туда и обратно. На запрос мы видим примерно 300–400 мс дополнительно в каждом направлении. (EDIT: это неправильно, когда речь идет о RTT, как указано в рекомендациях, мы видим 2x400 мс = 800 мс дополнительно для первого HTTPS запрос).

Для упомянутого веб-приложения, которое используется заказчиком для целей управления, это вполне нормально.Визуализированный HTML появится чуть позже, но благодаря CDN (CloudFront) активы не будут проблемой.

Но затронуто приложение для смартфонов конечного пользователя, которое выполняет меньше, но больше запросов JSON. Там он чувствует себя на грани «нормального», но определенно не мгновенный.

Теперь вопрос: как улучшить тайминги с точки зрения конечного пользователя? Здесь мы уже рассмотрели несколько вариантов:

  1. Клонируйте полное программное обеспечение и также разместите его в AWS ap-southeast-2.

    Преимущество: потрясающая производительность, простота настройки, CI/CD позволили бы развернуть один и тот же код одновременно в Европе и Австралии.

    Недостатки: мы должны поддерживать и платить за два идентичных набора инфраструктуры, данные не могут быть легко разделены, много дублирования во всех терминах.

  2. Переместите только вычислительные экземпляры в AWS ap-southeast-2.

    Нет, не будет работать, так как запросы к базе данных или Redis будут еще больше зависеть от времени прохождения туда и обратно.

  3. Иметь реплику только для чтения в AWS ap-southeast-2 и выполнять запись в eu-central-1.

    Лучше, чем вариант 2, но добавляет много сложности в код, плюс количество операций записи обычно не так уж и мало.

  4. Разверните балансировщик нагрузки в AWS ap-southeast-2 и подключите VPC через одноранговые соединения.

    Идея: пользователи подключаются к конечной точке AU, а трафик идет через мощное соединение с инстансами EU. Однако мы, очевидно, не уменьшим расстояние, и мы не уверены в потенциальном улучшении (если оно есть?)

Кто-нибудь сталкивался с подобной проблемой и готов поделиться некоторыми мыслями?

Обновление: кажется, что только первый запрос HTTPS кажется очень медленным. Изучая параметры AWS Load Balancer, я также заметил, что Глобальный акселератор AWS может помочь, поэтому мы провели несколько тестов.

Из локальной системы (в ЕС):

curl -w "dns_resolution: %{time_namelookup}, tcp_installed: %{time_connect}, ssl_handshake_done: %{time_appconnect}, TTFB: %{time_starttransfer}\n" -o /dev/null -s "https://saas.example .com/ping" "https://saas.example.com/ping"
dns_resolution: 0,019074, tcp_installed: 0,041330, ssl_handshake_done: 0,081763, TTFB: 0,103270
dns_resolution: 0,000071, tcp_installed: 0,000075, ssl_handshake_done: 0,000075, TTFB: 0,017285

Из AU (экземпляр EC2):

curl -w "dns_resolution: %{time_namelookup}, tcp_installed: %{time_connect}, ssl_handshake_done: %{time_appconnect}, TTFB: %{time_starttransfer}\n" -o /dev/null -s "https://saas.example .com/ping" "https://saas.example.com/ping"
dns_resolution: 0,004180, tcp_installed: 0,288959, ssl_handshake_done: 0,867298, TTFB: 1,161823
dns_resolution: 0,000030, tcp_installed: 0,000032, ssl_handshake_done: 0,000033, TTFB: 0,296621

От AU до AWS Global Accelerator (экземпляр EC2):

curl -w "dns_resolution: %{time_namelookup}, tcp_installed: %{time_connect}, ssl_handshake_done: %{time_appconnect}, TTFB: %{time_starttransfer}\n" -o /dev/null -s "https://saas-with -global-accelerator.example.com/ping" "https://saas-with-global-accelerator.example.com/ping"
dns_resolution: 0,004176, tcp_installed: 0,004913, ssl_handshake_done: 0,869347, TTFB: 1,163484
dns_resolution: 0,000025, tcp_installed: 0,000027, ssl_handshake_done: 0,000028, TTFB: 0,294524

В двух словах: кажется, что рукопожатие TLS вызывает наибольшую начальную задержку. Однако, если его можно использовать повторно, дополнительное время для AU в EU кажется действительно «всего» ~ 277 мс (0,294524 с - 0,017285 с) для времени до первого байта.

Привет!

флаг cn
Что касается *300 мс - 400 мс дополнительно в каждом направлении*, это звучит странно. Я ожидаю, что полный RTT будет в этом диапазоне (ну, я вижу 250-300 мс RTT для хостов в Сиднее, но в зависимости от того, где в Австралии, он, очевидно, будет варьироваться ... но не удвоится, как вы указали). Что касается варианта 4, если речь идет о задержке, это не будет иметь большого значения (хотя маршрутизация будет немного отличаться, большая часть этого расстояния присуща, и, как вы заметили, это действительно расстояние, которое увеличивает задержку).
Tim avatar
флаг gp
Tim
Чтобы уменьшить задержку, вам нужно приложение и база данных в Сиднее. Мне нравится № 3, измените свое приложение, чтобы использовать реплику чтения для чтения и отправки записи в основную базу данных ЕС, если это действительно будет иметь преимущества. В противном случае вам понадобится полный стек в Сиднее.
флаг aw
@HÃ¥kanLindqvist, ты абсолютно прав! Я измерил полный запрос HTTPS и решил, что это 2, это не RTT.
anx avatar
флаг fr
anx
Часть *слишком много записей* вполне может быть незначительной по сравнению со способностью современных браузеров сбрасывать круговые поездки. Вы можете *измерить* HTTP/1.1, HTTP/2, HTTP/3, 0-RTT и полное рукопожатие отдельно, чтобы подтвердить, что вам действительно нужна база данных ближе к вашим пользователям, а не, скажем, ждать старых смартфоны и MSIE должны быть заменены.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.