Рубрики
Без рубрики

‘ Это Build-A-Loadbalancer Day

ВВЕДЕНИЕ Нагрузка, балансируя способ эффективного распространения входящего сетевого трафика Acro … Tagged с Python, WebDev, начинающие.

Вступление

LoadBalancing Способ эффективного распространения входящего сетевого трафика по группе серверов бэкэнд, так что обычно в услугах у вас есть клиенты, и у вас есть сервер, который обрабатывает запрос вашего клиента, и когда мы хотим масштабировать, мы просто добавляем больше серверов для клиентов, чтобы получить обслуживание Из, балансировщик нагрузки находится в середине этого процесса, принимая запросы от клиентов и направляя его на сервер, он также делает это таким образом, чтобы оптимизировать для скорости, эффективное использование и гарантирует, что все работает, даже когда один из серверов уходит вниз.

Очень классная аналогия, которую я прочитал для этого, – это центр поддержки, мы являемся клиентами, тогда как персонал поддержки является сервером, и когда мы называем их, телефонная линия по сути является погрузочным бакалом, потому что он должен направить наш звонок к одному из доступных сотрудников поддержки Анкет

Итак, теперь, когда мы знаем, что балансировщик нагрузки распределяет нагрузку, давайте поговорим о том, как он это делает

По-круговой

Здесь мы последовательно распределяем нагрузку между серверами. В этой стратегии мы можем либо предположить, что все бэкэнды имеют одинаковую мощность обработки или используют веса, установленные относительно мощности обработки

Наименьшие связи

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

Наименьшее время

Отправляет запросы на сервер, выбранную формулой, которая объединяет самое быстрое время отклика и наименьшее количество активных соединений.

Мы также можем определить пользовательские стратегии, все зависит от того, что мы хотим сделать, что для меня в основном возвращается к по умолчанию.

Исполнение

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

https://hub.docker.com/r/strm/helloworld-http/

Это файл с композитом Docker с серверами Hello World и Nginx LoadBalancer для распространения запросов, поэтому нам просто нужно заменить это на тот, который мы новым.

Давайте определим шаги, прежде чем на самом деле его построить

  • Наш сервис управляет Huzzah !!
  • Хуманы начинают называть нашу сервис, иногда много, а иногда и одновременно
  • Для каждого человека этот запрос использовать нашу службу, мы сначала получаем начало запроса, чтобы определить сервер, которому необходимо обслуживать запрос, мы делаем несколько Magic () Чтобы получить сервер, которому необходимо обслуживать трафик (мы обсудили некоторые из этих магов во введении)
  • Затем мы обслуживаем трафик через этот сервер, Хуман теперь счастлив !!

Давайте на самом деле назову наш Loadbalancer, я настоящим объявляю тебя Anubis , потому что Бог хорошо уравновешивает души и их ценность

Теперь, когда церемония именования окончена, чтобы иметь возможность сделать это «магию», мы обсуждали ранее, нам нужны метаданные на всех серверах, которые на самом деле обслуживают запросы, например, если он жив, вычислительная способность, количество соединений с клиентом и, возможно, даже даже более.

# Servers have the same computing capacity
class Server:
    url: str # localhost:8080
    alive: bool # Dead or Alive

В конце концов у нас будет список серверов, которые могут обслуживать клиента.

[Server1, Server2, Server3] <=======> ✨ Magic✨ <========> Маршрут до сервера1

Давайте напишем эту магию, Ну, назову это Стратегия для здравомыслия

class Strategy:
    servers = [Server1, Server2, Server3]
    alive_servers = get_alive_servers(servers)
    def round_robin(self):
        robin_goes_round(self.alive_servers)

Таким образом, последний шаг состоит в том, чтобы использовать клиент на сервере, возвращаемом выводом, чтобы сделать это, мы будем использовать простой обратный прокси, вроде как нагрузка, в том смысле, что он в основном принимает запрос от клиента, вперед Это на сервер, который может выполнить его, и возвращает ответ сервера на клиент. Часто имеет смысл развернуть обратный прокси, когда у вас есть только один сервер, потому что у вас нет необходимости распределения запросов.

What is a Reverse Proxy vs. Load Balancer?

Мы можем написать простой обратный прокси с Запросы

"""Reverse Proxy."""
import http.server  
import socketserver
from requests import Session
class Handler(http.server.BaseHTTPRequestHandler):
  session = Session()
  def do_GET(self):
    resp = session.get("www.google.com", allow_redirects=True)
    self.send_response(resp.status_code)
    self.send_header('Content-Length', len(resp.content))
    self.end_headers()
    self.wfile.write(resp.content)
# Fetches content from localhost:8000
httpd = socketserver.TCPServer(('', 9000), Handler)
httpd.serve_forever()

Запустите это, и когда вы Gote Localhost: 8080, вы перенаправляете на Google, наконец -то !! Google работает на моем Localhost. Привинчить Интернет. Но это очень глупый обратный прокси, который работает только по запросу Get и на страницах без динамических элементов

Но тогда у меня был вопрос, почему бы нам просто не сделать перенаправление, чем он отличается от обратного прокси. Я посмотрел онлайн и нашел объяснение на Stackoverflow (очевидно). Таким образом, с перенаправлением сервер говорит клиенту искать в другом месте ресурс. Клиент будет знать об этом новом месте. Новое место должно быть доступно от клиента. Вместо этого обратный прокси пересылает запрос клиента в какое -то другое местоположение и отправляет ответ из этого места обратно клиенту. Это означает, что клиент не знает о новом местоположении и что новое место не должно быть напрямую доступным для клиента

Код встал на https://github.com/sangarshanan/anubis

Я немедленно заметил, что Http.serve Python – это Hella Slow, и когда я попытался открыть несколько вкладок, он прямо у меня умер, что довольно плохо, когда я узнал о ThreadedHttpserver и Workingmixin . Таким образом, мы можем либо породить несколько потоков или процессов для обработки запросов https://pymotw.com/2/basehttpserver/index.html#module-basehttpserver

Ну, сейчас лучше, но не круто, нам нужно что -то вроде https://github.com/http-party/http-server Чтобы в полной мере воспользоваться асинхронным IO для одновременного обработки запросов. Мы можем масштабировать столько запросов на сериализацию, и с Python мы всегда будем заблокировать GIL, поэтому не идеальный кандидат для этого, но, тем не менее, забавные упражнения.

Шваба

Оригинал: “https://dev.to/sangarshanan/tis-build-a-loadbalancer-day-5bd7”