Upload
ontico
View
433
Download
7
Embed Size (px)
Citation preview
О чём речь ...
• Зачем нужна очередь• Где и как она используется• Протоколы • 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) Мониторинг – третий глаз админа