У меня есть веб-сайт, который разработан с использованием ASP.NET, и МОЯ БД - MySQL. В настоящее время он размещен на серверах США. Но когда я пытаюсь получить доступ к нему около Индии, динамическое содержимое загружается слишком медленно. Это приемлемо, так как запрос должен идти в другую сторону мира. В США это действительно быстро. Я уже связал этот сайт с CDN cloudflare. Но CDN полезен для статического содержимого. Каждые мои страницы почти имеют динамическое содержание.
Поэтому я хочу масштабировать этот сайт. Поэтому, если запрос пришел из Америки, я хочу обработать этот запрос с сервера США, а если запрос пришел из Азии, я хочу, чтобы он обработал с сервера ASIAN. Но имейте в виду, независимо от того, куда они были перенаправлены, контент должен быть одинаковым на двух серверах. (Два сервера должны быть синхронизированы)
Так как же добиться этой архитектуры?
Как Google, Facebook, Yahoo это сделать? Как они служат во всем мире? Я думаю, что у них есть центры обработки данных на каждом континенте. Как они синхронизируются друг с другом?
Есть ситуации, когда вы хотели бы иметь:
К сожалению, комбинация всего вышеперечисленного физически невозможна. Вы будете ограничены скоростью света.
Вместо этого вам нужно учитывать ваши точные требования. Для некоторых данных ограниченная точность достаточно хороша. Рассмотрим счетчик просмотров на видео YouTube. Большинству людей все равно, временно ли отключен счетчик просмотров. Если представления, которые произошли 10 секунд назад на другой стороне мира, еще не включены, но включены виды, которые произошли 5 секунд назад ближе, это все еще достаточно точно. Если вы настолько расслаблены целостностью счетчика просмотров, вы рискуете, что два разных человека могут подумать, что они просмотрели номер 100 этого конкретного видео. Но большинство людей сочли бы вред, нанесенный этим, незначительным.
В других случаях целостность данных важнее. Рассмотрим двух человек, одновременно пытающихся зарегистрироваться с одним и тем же именем пользователя. Сказать обоим людям, что они получили имя пользователя, недопустимо, поэтому в такой ситуации вы бы выбрали более медленный подход с большей честностью. Допустимо сообщить обоим лицам, что имя пользователя было взято, поэтому возможный подход состоит в том, чтобы попытаться зарезервировать имя пользователя на каждой реплике и сообщать об успехе только в том случае, если вам удалось более чем на 50% реплик. Весьма вероятно, что при таком подходе пользователь будет ждать полсекунды, чтобы получить ответ. Но пользователи не проходят этот процесс достаточно часто, чтобы беспокоиться о такой задержке.
В других случаях вам может потребоваться хорошая целостность и быстрые обновления, но только один человек может обновить этот конкретный фрагмент данных. В этом случае вы можете поместить достоверную копию данных на сервер, который, по вашему мнению, близок к этому пользователю, и позволить другим серверам иметь кэшированную версию, которая в основном обновлена.
источник