Архив рубрики: О программировании

Создаём RabbitMQ кластер

RabbitMQ кластер

Как и обещал в прошлый раз, сегодня мы попробуем какую-нибудь из продвинутых фич RabbitMQ. Например, кластеризацию.

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

Кластеризация — это не то же самое, что репликация и high availability. В первом и втором случае уход одного из узлов в оффлайн никак не повлияет на доступность данных и работу сервиса в принципе. В кластере же узлы не взаимозаменяемы. Да, пользователи и настройки действительно будут дублироваться на каждом их них, где бы тех не создавали. Но очереди сообщений — нет. Так что если какой-то хост ушёл в оффлайн, то его очереди пойдут следом.

Читать далее Создаём RabbitMQ кластер

Краткое введение в RabbitMQ

Краткое введение в RabbitMQ

RabbitMQ — это полноценная и щедро удобренная фичами очередь сообщений. В отличие от ZeroMQ, который встраивается в приложения, RabbitMQ — сервис-посредник. Он разграничивает права доступа, поддерживает шифрование, сохранение сообщений на диск (чтобы пережить плановое отключение электричества), работу в кластерах и даже дублирование сервисов для повышенной живучести. К тому же он написан на Erlang, за что автоматически становится неубиваемым и поддерживаемым на большинстве популярных ОС.

В этом посте мы посмотрим, насколько тяжело отправлять и получать сообщения с RabbitMQ, да и вообще, на что он похож вблизи. В качестве платформы будет Убунта (запертая внутри Docker контейнера), но сгодился бы и Mac, и Windows. Читать далее Краткое введение в RabbitMQ

Краткое введение в Windows контейнеры

Windows контейнеры

Свершилось! То ли молитвы помогли, то ли жертвоприношения, но теперь можно запускать Docker контейнеры с Windows внутри. Прекрасная новость пришла одновременно с релизом Windows Server 2016. И речь не идёт о какой-нибудь хитро-спрятанной виртуальной машине, или эмуляции Windows на Linux ядре — запускается настоящая Windows в настоящем Docker, с работающими Dockerfile, docker-compose и прочими docker-приблудами.
Читать далее Краткое введение в Windows контейнеры

Как использовать ZeroMQ с Docker

Как использовать ZeroMQ с Docker

В прошлый раз мы написали аж три примера клиент-сервер Node.js приложений, в которых компоненты общаются между собой через ZeroMQ. Примеры простые, показывают основную идею, но работают всё-таки на localhost, и поэтому слабо пересекаются с реальностью, в которой ZeroMQ обычно работает. И тогда я подумал, а почему бы не раскидать клиента и сервера по Docker-контейнерам? В задачу добавятся новые вопросы, она станет больше похожа на правду, и главное, это отличный шанс откатать сразу несколько инструментов, которые обычно используются вместе.

Итак, задача на сегодня: взять fire-and-forget паттерн из прошлого поста и доработать его до контейнерного приложения. Читать далее Как использовать ZeroMQ с Docker

Обмен сообщениями между сервисами с ZeroMQ и Node.js

ZeroMQ

ZeroMQ это небольшая и шустрая библиотека для обмена сообщениями, которая одинаково хорошо работает как между процессами на одном хосте, так и по сети. Хотя она написана на C++, очень добрые люди создали адаптеры для всего: хоть для Node.js, хоть для Haskell.

Работа с ZeroMQ напоминает работу с TCP/UDP сокетами. Один процесс создаёт сокет и привязывает его к адресу, второй — подключается к первому, и понеслась, родная. Правда, сокеты в ZMQ весьма необычные. Но, наверное, стоит начать с примеров, и по ходу дела уже вдаваться в детали. Читать далее Обмен сообщениями между сервисами с ZeroMQ и Node.js

Очередь сообщений и асинхронное взаимодействие

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

Так как контейнеры изолированы друг от друга, то выбор транспорта для сообщений сильно ограничен, и, скорее всего, это будет сеть и TCP/UDP протоколы. Но при этом есть уйма вариантов, как этой сетью пользоваться, и об этом мы сейчас и поговорим. Читать далее Очередь сообщений и асинхронное взаимодействие

Сложности с микросервисами

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

На случай, если кто забыл, микросервисы — это паттерн проектирования приложения, в котором оно существует как набор независимых сервисов. Каждый из них выполняет определенный круг задач и общается с соседями по какому-нибудь легковесному протоколу. При такой архитектуре приложение получается  более живучее, его проще масштабировать, можно чаще обновлять, и легко раздавать на задачи командам разработчиков.

Но, Читать далее Сложности с микросервисами

Краткое введение в docker-compose

Что такое docker-compose

docker-composeКак docker может управлять отдельно взятым контейнером, так docker-compose помогает управлять не просто одним, а всеми контейнерами, которые составляют распределенное приложение. Причём, не только контейнерами, но и сетями, подключёнными папками и всеми связанными с этим настройками.

Ведь даже чтобы запустить простое вэб-приложение, состоящее всего из двух контейнеров (например, «web» с контентом и «db» с данными), нужно как минимум:

Читать далее Краткое введение в docker-compose

Взаимодействие Docker контейнеров

Запустить приложение в контейнере это, конечно, интересно, но еще интереснее запустить сразу несколько и разрешить им между собой взаимодействовать. Допустим, вдоволь наигравшись с микросервисами, я решил разделить своё настоящее вэб-приложение на:

  1. контейнер со статическим контентом и вэб-сервером и
  2. контейнер с данными и RESTful сервисом.

Первый контейнер открывает 80й порт, самостоятельно раздаёт html/css/js и обращается ко второму контейнеру, когда приходит запрос на данные.

Схема приложения

Схема простая, кроме одного «но». Как первому контейнеру найти и достучаться до второго?

Читать далее Взаимодействие Docker контейнеров

3 способа перенести Node.js приложение в Docker контейнер

dockerizeДопустим, у нас есть Node.js приложение, которое по каким-то причинам нужно перенести в Docker контейнер и запустить. Может, просто хочется проверить, как оно поведет себя на ‘чистой’ машине. Или выпендриться перед заказчиком. Причины ведь разные бывают.

Для определенности, пускай это будет вэб сервер hello.js, который всем отвечает «Hello World». Такой вот он приветливый.

Localhost: hello

Итак, как перенести его в Docker контейнер и запустить?

Дисклаймер: всё написанное ниже предполагает базовое понимание того, что такое Docker, и зачем он может кому-то пригодиться. Где-то даже была статья про это.

Читать далее 3 способа перенести Node.js приложение в Docker контейнер