Очереди и
блокировки
Календарёв Александр
akalend@mail.ru
www.slideshare.net/akalend
О чём речь ...
•Зачем нужна очередь
•Где и как она используется
•Протоколы
•AMQP (на примере RabbitMQ)
•Блокировки
WEB
Типовая архитектура
Junior проект
WEB
Типовая архитектура
Junior проект
WEB
Типовая архитектура
Junior проект
WEB
Типовая архитектура
Junior проект
WEB
Типовая архитектура
Junior проект
HTTP ERROR 504
504 Gateway Timeout error
WEB
Типовая архитектура
Junior проект
WEB
WEB
Типовая архитектура
Junior проект
WEB
WEB
Типовая архитектура
Junior проект
WEB
WEB
Типовая архитектура
Junior проект
WEB
MySQL ERROR 2006
MySQL gone away
Типовая архитектура
уже не Junior проект
Master
WEB
WEB
Slave
Типовая архитектура
уже не Junior проект
Master
WEB
WEB
Slave
HTTP ERROR 502
Bad 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)
Load
Convert
WEB
Curl
Клиентский
скрипт
Использование Redis (часть 2)
Load
Convert
WEB
Клиентский
скрипт
Использование Redis (часть 2)
Load
Convert
WEB
Клиентский
скрипт
Необходимо
проинформировать
Использование Redis (часть 2)
Load
Convert
WEB
Клиентский
скрипт
Постоянно
Проверяем статус
Способ – I Push
Curl
Использование Redis (часть 2)
Load
Convert
WEB
Клиентский
скрипт
устанавливаем
статус: Выполнено
Способ – I Push
Использование Redis (часть 2)
Load
Convert
WEB
Клиентский
скрипт
Отдаёт статус:
Выполнено
Способ – I Push
Использование Redis (часть 2)
Load
Convert
WEB
Клиентский
скрипт
Способ – I Push
Загружаем файл
Использование Redis (часть 2)
Load
Convert
WEB
Клиентский
скрипт
WebSockets
Подписываемся
на канал SUBRIBE
Способ – II Pull
Curl
Использование Redis (часть 2)
Load
Convert
WEB
Клиентский
скрипт
PUSH: Выполнено
Способ – II Pull
Использование Redis (часть 2)
Load
Convert
WEB
Клиентский
скрипт
Способ – II Pull
Получаем статус
Выполнено
Использование Redis (часть 2)
Load
Convert
WEB
Клиентский
скрипт
Способ – 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
●
Имеет ключ, в соответствии с которым
определяется маршрут сообщения
QueueExchange
Bind
AMQP : Bind (связь)
QueueExchange
Bind
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 критичен AMQP
STOMP
MQTTActiveMQ ? ?
ZMQ Отсутствует брокер
MemcacheQ Memcached
Tarantool MsgPack
Redis ? ? Redis
MongoDb BSON
Databases ?
Выводы:
1) Не стоит микроскопом забивать гвозди
2) Cкорость * надежность = const
3) Мониторинг – третий глаз админа
Очереди и
блокировки
Календарёв Александр
akalend@mail.ru
www.slideshare.net/akalend

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