Главная » Хабрахабр » Уменьшаем количество слоёв архитектуры с 5 до 2

Уменьшаем количество слоёв архитектуры с 5 до 2

Работая над несколькими open-source проектами, в один прекрасный день я решил упростить себе жизнь и разработал Upstream-модуль для nginx, который помог мне убрать громоздкие слои многослойной архитектуры. Это был забавный опыт, которым я хочу поделиться в этой статье. Мой код лежит в открытом доступе тут: github.com/tarantool/nginx_upstream_module. Его можно поднять с нуля или скачать Docker-образ по этой ссылке: hub.docker.com/r/tarantool/tarantool-nginx.

На повестке дня:

  • Введение и теория.
  • Как использовать эти технологии.
  • Оценка производительности.
  • Полезные ссылки.

Введение и теория

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

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

Разобьем это на слои:

Этот прокси необходим для обеспечения отказоустойчивости и поддержания постоянного подключения к базе данных.
5-й слой — сервер базы данных. 1-й слой — nginx.
2-й слой — сервер приложений.
3-й слой — кэш.
4-й слой — прокси базы данных.

Зачем? Раздумывая об этих слоях, я придумал, как исключить некоторые из них. Мне нравятся простые понятные вещи; я не люблю поддерживать большое количество разных систем в prodution; и последнее, но не по значимости — чем меньше слоев, тем меньше точек отказа. Много причин. В результате я сделал модуль Tarantool Upstream под nginx, который помог сократить количество слоёв до двух.

Первый слой — nginx, второй, третий и пятый слои заменяет Tarantool. Как Tarantool помогает уменьшить количество слоёв? Фишка в том, что Tarantool — это база данных, кэш и сервер приложений, три в одном. Четвертый слой — прокси базы данных — теперь в nginx. Мой upstream-модуль связывает nginx и Tarantool друг с другом и позволяет им слаженно работать без других трёх слоёв.

Пользователь отправляет запрос к REST или JSON RPC в nginx с модулем Tarantool Upstream. Вот так выглядит новый микросервис. Между nginx и Tarantool мы используем эффективный протокол, в основе которого лежит MSGPack. Модуль может быть подключен напрямую к Tarantool, или нагрузка может быть сбалансирована на несколько серверов Tarantool. Дополнительную информацию вы найдете в этой статье.

Но я бы посоветовал установить их через пакетный менеджер вашего дистрибутива или воспользоваться Docker-образом (docker pull tarantool/tarantool-nginx). Еще можете перейти по этим ссылкам, чтобы загрузить Tarantool и модуль nginx.

Docker-образы: hub.docker.com/r/tarantool/tarantool

Tarantool NginX upstream module

Бинарные пакеты: Tarantool — Download

Исходный код: Tarantool

tarantool/nginx_upstream_module

Как использовать эти технологии

Вот пример файла nginx.conf. Как видите, это обычный upstream nginx. Тут у нас есть tnt_pass, прямо указывающий nginx, по какому пути расположить upstream tarantool.

nginx-tnt.conf

http server { listen 8081; # gateway location /api/do { tnt_pass_http_request parse_args; tnt_pass tnt; } }
}

Вот ссылки на документацию:

nginx.org/en/docs/http/ngx_http_upstream_module.html
github.com/tarantool/nginx_upstream_module/blob/master/README.md

Теперь нужно прописать функцию обработчика для нашего сервиса и разместить ее в файле. Сконфигурировали связку nginx и Tarantool, что потом? Я положил её в файл “app.lua”.

9/book/box/data_model/#index Вот ссылка на документацию Tarantool: tarantool.io/ru/doc/1.

-- Bootstrap Tarantool
box.cfg { listen='*:3301' }
-- Grants
box.once('grants', function() box.schema.user.grant('guest', 'read,write,execute', 'universe')
end)
-- Global variable
hello_str = 'Hello'
-- function
function api(http_request) local str = hello_str if http_request.method == 'GET' then str = 'Goodbye' end return 'first', 2, { str .. 'world!' }, http_request.args
end

Теперь рассмотрим код Lua.

Наш Box.cfg {} говорит Tarantool начать слушать порт 3301, но он может принимать и другие параметры.

Box.once говорит Tarantool вызывать какую-то функцию один раз.

Она принимает HTTP-запрос в качестве первого аргумента и возвращает массив значений. function api () — это функция, которую я скоро буду вызывать.

Выполнить его можно, просто запустив Tarantool-приложение. Я сохранил этот код в файл и назвал его “app.lua”.

$> tarantool app.lua

Я для этого использую “wget”. Вызовем нашу функцию с помощью GET-запроса. И для чтения данных из файла я использую “cat”. По умолчанию, “wget” сохраняет ответ в файл.

$ wget '0.0.0.0:8081/api/do?arg_1=1&arg_2=2'
$ cat do*
{ “id”:0, # — unique identifier of the request “result”: [ # — is what our Tarantool function returns [“first”], [2], [{ “request”:{“arg_2”:”2",”arg_1":”1"} “1”:”Goodbye world!” }] ]}

Оценка производительности

Оценка проводилась на данных из production. Входные данные — это большой JSON-объект. Средний размер такого объекта 2 Кб. Один сервер, 4-ядерный CPU, 90 Гб RAM, OS Ubuntu 14.04.1 LTS.

Этот worker — балансировщик с простым алгоритмом ROUND-ROBIN. Для этого теста мы используем только один nginx worker. Нагрузка масштабируется с помощью шардинга. Он балансирует нагрузку между двумя узлами Tarantool.

Верхний график показывает задержки (в миллисекундах). Эти графики показывают количество операций чтения в секунду.

Верхний график показывает задержки (в миллисекундах) А эти графики показывают количество операций записи в секунду.

Впечатляюще!

В следующей статье я подробно расскажу про REST и JSON RPC.

Англоязычная версия статьи: hackernoon.com/shrink-the-number-of-tiers-in-a-multitier-architecture-from-5-to-2-c59b7bf46c86


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

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

Спустя пять лет вышла очередная версия DOSBox под номером 0.74-2

К сожалению, пока внимание толп людей было приковано к анонсам таких гигантов индустрии как Apple, релиз одной некоммерческой, но довольно популярной игровой ретро-платформы, прошел почти незаметно. Вышел DOSBox 0.74-2. Это позволяет играть в такие игры во множестве операционных систем, не ...

Данные пользователей Windows на ПК с поддержкой сенсорного ввода пишутся в отдельный файл

Это сделано для удобства пользователя и ускорения процесса его работы. Большое количество моделей ноутбуков и all-in-one рабочих станций в наше время имеют поддержку сенсорного ввода. Но, как оказалось, у компьютерных систем с активированной поддержкой тач-ввода есть одна малоизвестная функция, которая ...