The Power of Two Random Choices
Метод, который многие упомянули в комментариях к предыдущему посту, который я узнал относительно недавно, и который неожиданно (для меня) очень хорошо работает.
В идеальной ситуации, мы бы хотели узнать нагрузку на всех серверах, и отправить запрос в самый менее нагруженный. Но такой возможности нет — серверов слишком много, если спрашивать их все на каждый наш запрос, то это сгенерирует слишком много дополнительной нагрузки. Поэтому, давайте выберем два случайных сервера, узнаем у них их нагрузку, а потом отправим запрос в наименее нагруженный из двух.
Интуитивно кажется, что этот метод почти не отличается от посылания запроса в случайный сервер. Условно, часто мы будем выбирать два уже нагруженных сервера, и добавлять нагрузку к ним. Но в реальности оказывается, что нагрузка на сервера становится очень равномерной. Например, в случае с 1М запросов и 1000 серверами, максимально нагруженный сервер обработает ~1002 запроса.
Если нужно еще поддерживать добавление серверов "на лету", можно использовать consistent hashing из предыдущего поста + идею с выбором одного из двух серверов. И это приводит к максимальной нагрузке в ~1007 запросов в симуляции, которую я написал.
Понятно, что в реальной жизни все сложнее, и в некоторых ситуациях мы не можем себе позволить отправить два дополнительных запроса на каждый существующий запрос. Но, если пользовательские запросы тяжелые, то такой метод работает неожиданно хорошо.
Метод, который многие упомянули в комментариях к предыдущему посту, который я узнал относительно недавно, и который неожиданно (для меня) очень хорошо работает.
В идеальной ситуации, мы бы хотели узнать нагрузку на всех серверах, и отправить запрос в самый менее нагруженный. Но такой возможности нет — серверов слишком много, если спрашивать их все на каждый наш запрос, то это сгенерирует слишком много дополнительной нагрузки. Поэтому, давайте выберем два случайных сервера, узнаем у них их нагрузку, а потом отправим запрос в наименее нагруженный из двух.
Интуитивно кажется, что этот метод почти не отличается от посылания запроса в случайный сервер. Условно, часто мы будем выбирать два уже нагруженных сервера, и добавлять нагрузку к ним. Но в реальности оказывается, что нагрузка на сервера становится очень равномерной. Например, в случае с 1М запросов и 1000 серверами, максимально нагруженный сервер обработает ~1002 запроса.
Если нужно еще поддерживать добавление серверов "на лету", можно использовать consistent hashing из предыдущего поста + идею с выбором одного из двух серверов. И это приводит к максимальной нагрузке в ~1007 запросов в симуляции, которую я написал.
Понятно, что в реальной жизни все сложнее, и в некоторых ситуациях мы не можем себе позволить отправить два дополнительных запроса на каждый существующий запрос. Но, если пользовательские запросы тяжелые, то такой метод работает неожиданно хорошо.