Очереди и блокировки. Теория и практика / Александр...

Post on 06-Jan-2017

434 views 7 download

Transcript of Очереди и блокировки. Теория и практика / Александр...

Очереди и блокировки

Календарёв Александр

akalend@mail.ru

www.slideshare.net/akalend

О чём речь ...

• Зачем нужна очередь• Где и как она используется• Протоколы • AMQP (на примере RabbitMQ)• Блокировки

WEB

Типовая архитектураJunior проект

WEB

Типовая архитектураJunior проект

WEB

Типовая архитектураJunior проект

WEB

Типовая архитектураJunior проект

WEB

Типовая архитектураJunior проект

HTTP ERROR 504504 Gateway Timeout error

WEB

Типовая архитектураJunior проект

WEB

WEB

Типовая архитектураJunior проект

WEB

WEB

Типовая архитектураJunior проект

WEB

WEB

Типовая архитектураJunior проект

WEBMySQL ERROR 2006MySQL gone away

Типовая архитектурауже не Junior проект

Master

WEB

WEB

Slave

Типовая архитектурауже не Junior проект

Master

WEB

WEB

Slave

HTTP ERROR 502Bad Gaetway

Типовая архитектурауже не Junior проект

Master

WEB

WEB

Slave

Типовая архитектурауже не Junior проект

Master

WEB

WEB

Slave

Типовая архитектурауже не Junior проект

Быстрая часть

Критическая часть

Медленная часть

Не очень важная часть

Типовая архитектурауже не Junior проект

Быстрая часть

Критическая часть

Медленная часть

Не очень важная часть

Типовая архитектурауже не Junior проект

Быстрая часть

Критическая часть

Медленная часть

Не очень важная часть

WEB

Backend

Паттерн: хитрый ученик

Быстрая часть

Критическая часть

Медленная часть

Не очень важная часть

WEB

Backend© СоюзМультФильм

Паттерн: хитрый ученик

© СоюзМультФильм

Сперва скажу, что выучил уроки, а потом сделаю...

Паттерн: хитрый ученикотложенные вычисления

© СоюзМультФильм

Вычисляем по мере необходимости

Использование Backend сервера

BackendWEB

Проблема синхронизации и обмена данными

BackendWEB

WEB Backend

Проблема синхронизации и обмена данными

BackendWEB

WEB Backend

?

Проблема синхронизации и обмена данными

BackendWEB

WEB Backend

Очередь

Очередь – это список

FIFO – First Input First Output

Поговорим о ...

• Зачем нужна очередь• Где и как она используется• Протоколы • AMQP (на примере RabbitMQ)• Блокировки

Взаимодействие частей проекта

ЗагрузкаYML

Сведениев pricelist

ПарсингYML

Загрузкаimg

Взаимодействие частей проекта

ЗагрузкаYML

Сведениев pricelist

ПарсингYML

Загрузкаimg

Очередь через БД

CREAE TABLE queue ( id BIGINT AUTOINCREMENT NOT NULL, data VARCHAR (…), PRIMARYKEY (id))

Очередь через БД

Запись в очередь:

INSERT INTO queue (data) VALUES (...);

Очередь через БД

Чтение из очереди:

SELECT * FROM queue ORDER BY id LIMIT 1 DELETE FROM queue WHERE id = ?

Очередь через БД

Чтение из очереди:

LOCK TABLE queue;SELECT * FROM queue ORDER BY id LIMIT 1 DELETE FROM queue WHERE id = ?UNLOCK TABLE queue;

Очередь через БД

НадежноМедленноМожно хранить историю (UDATE SET deleted=1 вместо DELETE)

Очередь через MongoDb

Вставка: db.queue.insert(...);

Очередь через MongoDb

Вставка: db.queue.insert(...);

Чтение: db.queue.findAndModify({ query : {}, remove:1 })

Очередь через MongoDb

Надежно

Медленно, быстрее, чем БД

Использование Tarantool

Использование Tarantool

WEB

Использование Tarantool

BackendWEB

Использование Tarantool

• Memory Only хранилище •Необходимо следить за памятью•Необходим мониторинг системы

Использование Tarantool

●Репликация из коробки●Возможен шардинг (дополнительный пакет)

●Персистентность данных

Использование Tarantool

Есть специальный пакет Queue$tnt = new Tarantool('localhost', 3301);$tnt->connect(); $tnt->select('q1');

$tnt->call('queue.tube.q1:put', $data);$tnt->call('queue.tube.q1:take', 0.1 ));

Использование Tarantool

Синхронный:while(1) { $data= $tnt->call('queue.tube.q1:take' )); … /* обработка данных */}

Использование Tarantool

Асинхронный:while(1) { $data= $tnt->call('queue.tube.q1:take', 0.1 )); If (!$data) { usleep(1000); continue; } … /* обработка данных */}

Использование TarantoolПакет Queue

●Очереди с приоритетом●Жизнь элемента очереди ttl●Подтверждение доставки●Синхронные / асинхронные запросы●Можно самому менять логику

Использование Redis

Операции со списками

●RPUSH●LPOP

Head

Tail

Использование Redis

Использование Redis

WEB

Использование Redis

WEB

Curl

Использование Redis

WEB Backend

Curl

Использование Redis

Memory Only хранилище●Необходимо следить за памятью, мониторинг●Персистентно

Использование Redis

Операции со списками

● RPUSH {key} {data}

● LPOP {key}, BLPOP (блокирующий)

● COUNT {key}

Использование Redis (часть 2)

Проект загрузки видео

Youtube

Vimeo

Vk

Использование Redis (часть 2)

LoadConvertWEB

CurlКлиентскийскрипт

Использование Redis (часть 2)

LoadConvertWEB

Клиентскийскрипт

Использование Redis (часть 2)

LoadConvertWEB

Клиентскийскрипт

Необходимо проинформировать

Использование Redis (часть 2)

LoadConvertWEB

Клиентскийскрипт

Постоянно Проверяем статус

Способ – I Push

Curl

Использование Redis (часть 2)

LoadConvertWEB

Клиентскийскрипт

устанавливаемстатус: Выполнено

Способ – I Push

Использование Redis (часть 2)

LoadConvertWEB

Клиентскийскрипт

Отдаёт статус: Выполнено

Способ – I Push

Использование Redis (часть 2)

LoadConvertWEB

Клиентскийскрипт

Способ – I Push

Загружаем файл

Использование Redis (часть 2)

LoadConvertWEB

Клиентскийскрипт

WebSocketsПодписываемся на канал SUBRIBE

Способ – II Pull

Curl

Использование Redis (часть 2)

LoadConvertWEB

Клиентскийскрипт

PUSH: Выполнено

Способ – II Pull

Использование Redis (часть 2)

LoadConvertWEB

Клиентскийскрипт

Способ – II Pull

Получаем статусВыполнено

Использование Redis (часть 2)

LoadConvertWEB

Клиентскийскрипт

Способ – II Pull

Загружаем файл

Паттерн Писатель / Читатель Подписка / Публикация

●PUBLISH {channel} {data}

●SUBSCRIBE {channel}

●UNSUBSCRIBE {channel}

Паттерн Писатель / Читатель Подписка / Публикация

Приемникданных

Внешнийисточник

PUBLISH

SUBSCR

MemcachedQ

Протокол memcached●SET {key} {data}●GET {key}

memcached + berkeleyDb

MemcachedQ● Быстро● Работает, пока есть память● Масштабируется в рамках клиента libmemcached● Не возможен мониторинг

Zerro MQ

Это встраиваемое решениеOтсутствует брокер

Очень быстрое решение: - Запрос / Ответ - Подписка / Публикация - Потоковой обмен

Apache Kafka

●Система потоковой обработки сообщений, разрабатывалась для сбора логов●Распределённоe решение●С подтверждением доставки

Apache Kafka

●Очень производителен в кластере●Требует синхронизации кластера через Zookeper

О чём речь ...

• Зачем нужна очередь• Где и как она используется• Протоколы (кратко) • AMQP (на примере RabbitMQ)• Блокировки

Протоколы• STOMP- Simple (or Streaming) Text Oriented Message Protocol

• MQTT - Message Queue Telemetry Transport

• AMQP - Advanced Message Queuing Protocol

Протокол STOMP

• Текстовый (по верх HTTP, Websocket)

• Сообщение имеет тело и заголовок

• Сообщение может быть разделено на фреймы

• Подписка / Публикация

• Подтверждение доставки, Авторизация

Протокол MQTT

• Бинарный

• Сообщение имеет тело и заголовок

• Сообщение может быть разделено на фреймы

• Подписка / Публикация

• Подтверждение доставки, Авторизация

Поддержка протоколов

Реализация Java

Реализация erlang

Реализация Java / C++

Поговорим о ...

• Зачем нужна очередь• Где и как она используется• Протоколы • AMQP (на примере RabbitMQ)• Блокировки

Exchange

AMQP : Exchange (обмен)

● Принимает сообщения

● Имеет имя

● Имеет тип:- fanout- direct- topic

Exchange

Имеет свойства:- autodelete- transit- durable

AMQP : Exchange (обмен)

Exchange

AMQP : Exchange (обмен)

$exchange = new AMQPExchange($channel);$exchange->setName('MyExchange';)$exchange->declare();

● Отдает сообщения адресату по принципу FIFO

● Имеет имя● Имеет свойства:

- autodelete- durable

Queue

AMQP : Queue (очередь)

Queue

AMQP : Queue (очередь)

$queue = new AMQPQueue($channel);$queue->setName('MyQueue');$queue->declare();

● Между Exchange и Queue определяем связь (или маршрут): Bind

● Имеет ключ, в соответствии с которым определяется маршрут сообщения

QueueExchangeBind

AMQP : Bind (связь)

QueueExchangeBind

AMQP : Bind (связь)

$queue = new AMQPQueue($channel);$queue->setName('MyQueue');$queue->bind('MyExchange', $key);

Exchange

Состоит:

● тела

● routing key

● заголовки

● свойства

AMQP : Message

Exchange

В зависимости от типа

Exchange и routingKey

сообщения

определяется маршрут

сообщения

AMQP : Message

Exchange

Fanout – ключ не учитываем

Direct – полное совпадение

Topic – совпадение по маске

AMQP : Message использование Routing key

В зависимости от типа Exchange:

Exchange

AMQP : Message использование Routing key

$exchange = new AMQPExchange($channel);$exchange->setName('MyExchange';)$exchange->publish($message, $key);

● Забывают устанавливать связь Bind:

$queue->bind($exchange, $key);● Забывают объявлять очередь/обмен:

$queue->declare($name);● Если Обмен/Очередь не autodelete,

то достаточно объявить их один раз

AMQP : Типичные ошибки

Rabbit MQ● Довольно сложное решение, требует администрирования

● Требовательно по памяти● Можно объединять в кластер● Возможно расширение plugins

Rabbit MQ

2015 № 11

Кролик в песочнице

Rabbit MQ

2015 № 12

RabbitMQ. Вырастаем из штанишек.

И в заключение

• Зачем нужна очередь• Где и как она используется• Протоколы • AMQP (на примере RabbitMQ)• Блокировки

ЗагрузкаYML

Сведениев pricelist

ПарсингYML

Загрузкаimg

ЗагрузкаYML

Сведениев pricelist

ПарсингYML

Загрузкаimg

Apache Zookeeper

Иерархическое хранилище Основное понятие znode Аналог inode в ФС

•Операции:- GetData / SetData- Create / GetChildren

Apache Zookeeper

znode: •простые •эфемерные•последовательности

Операции: exist / sync

Пример: обновление конфигурации на лету

Процесс 1

Процесс 2a

Процесс 2b

Процесс 2c

192.168.100.1

192.168.100.2

192.168.100.3

Пример: обновление конфигурации на лету

Процесc 1

Процесc 2a

Процесc 2b

Процесc 2c

192.168.100.1

192.168.100.2

192.168.100.3

/config/nodes/n1/config/nodes/n2/config/nodes/n3 config

nodes

n-1 n-2 n-3

/config/nodes/n-1/config/nodes/n-2/config/nodes/n-3

Пример: обновление конфигурации на лету

Процесc 1

Процесс 2a

Процесc 2b

Процесc 2c

192.168.100.1

192.168.100.2

192.168.100.3

Останавливается процесс

Пример: обновление конфигурации на лету

Процесc 1

Процесc 2a

Процесc 2b

Процесc 2c

192.168.100.1

192.168.100.2

192.168.100.3

Рвется соединение

Пример: обновление конфигурации на лету

Процесc 1

Процесc 2a

Процесc 2b

Процесc 2c

192.168.100.1

192.168.100.2

192.168.100.3

Посылаем event

Пример: обновление конфигурации на лету

Процесc 1 Процесc 2b

Процесc 2c

192.168.100.2

192.168.100.3

Пересчитываем конфигурацию

Пример: обновление конфигурации на лету

Процесc 1 Процесc 2b

Процесc 2c

192.168.100.2

192.168.100.3

Процесc 1

/config/nodes/n1/config/nodes/n2/config/nodes/n3 config

nodes

n-2 n-3

/config/nodes/n-2/config/nodes/n-3

Apache Zookeeper

•Используется для синхронизации процессов в кластере

•На последовательностях можно организовать очереди

speed scale memory replika ACL/SSL Prototokol Safety Extend

Kafka критичен

RabbitMQ критичен AMQPSTOMPMQTTActiveMQ ? ?

ZMQ Отсутствует брокер

MemcacheQ Memcached

Tarantool MsgPack

Redis ? ? Redis

MongoDb BSON

Databases ?

Выводы:

1) Не стоит микроскопом забивать гвозди

2) Cкорость * надежность = const

3) Мониторинг – третий глаз админа

Очереди и блокировки

Календарёв Александр

akalend@mail.ru

www.slideshare.net/akalend