Использование ØMQ для
построения распределенных
систем
Андрей Охлопков
Алексей Ермаков
План доклада
• Разработка распределенных систем
• ØMQ: краткий обзор
• Case study: GH ATP
Распределенные системы
Распределенные системы
• Более гибкие в разработке
• Проще масштабировать
• Надежнее
Масштабируемость
Отказоустойчивость
Гетерогенность
Взаимодействие
• HTTP
• TCP/IP
• Message-Oriented Middleware (MOM)
MOM
• Асинхронное взаимодействие через прием
и отправку сообщений
• Очереди и маршрутизация
Распространенные MOM
• Amazon SQS
• MSMQ
• JMS
• AMQP (RabbitMQ, Apache Qpid)
Использование 0MQ для построения low latency распределёных систем, Андрей Охлопков, Алексей Ермаков
ØMQ
• Разработан компанией iMatix (AMQP)
• LGPL
• Поддерживает C/C++, C#, Java, Python, PHP,
Ruby, Erlang и другие языки
• “Sockets on steroids”
Отличия от других MOM
• Отсутствие брокера
• API, похожий на BSD sockets API
• Произвольный формат сообщений
• Различные модели взаимодействия
Отличия от обычных сокетов
• N:M взаимодействие
• bind()/connect() могут быть вызваны в
любом порядке на любой стороне
• Поток сообщений а не байтов
• Автоматическое переподключение
Модели взаимодействия
• Request/reply
• Publish/subscribe
• Pipeline
Request/reply
Request/reply: сервер
import zmq
context = zmq.Context(1)
s = context.socket(zmq.REP)
s.bind("tcp://*:5000")
while True:
request = s.recv()
s.send(request.upper())
Request/reply: клиент
import zmq, sys
context = zmq.Context(1)
s = context.socket(zmq.REQ)
s.connect("tcp://localhost:5000")
s.send(sys.argv[1])
print socket.recv(),
Request/reply
$ python server.py &
[1] 79259
$ python client.py foo
FOO
$ python client.py bar
BAR
Request/reply: сервер
import zmq
context = zmq.Context(1)
s = context.socket(zmq.REP)
s.bind("tcp://*:5000")
while True:
request = s.recv()
s.send(request.upper())
Request/reply: клиент
import zmq, sys
context = zmq.Context(1)
s = context.socket(zmq.REQ)
s.connect("tcp://localhost:5000")
s.send(sys.argv[1])
print socket.recv(),
Проблема с масштабируемостью
Решение: queue device
Queue = XREQ + XREP + device
Queue = XREQ + XREP + device
import zmq, random, time
context = zmq.Context(1)
xrep = context.socket(zmq.XREP)
xrep.bind("tcp://*:5000")
xreq = context.socket(zmq.XREQ)
xreq.bind("tcp://*:5001")
zmq.device(zmq.QUEUE, xrep, xreq)
Несколько devices в одной сети
Модели взаимодействия
• Request/reply
• Publish/subscribe
• Pipeline
Publish/subscribe
Publish/subscribe: сервер
import zmq, random, time
context = zmq.Context(1)
s = context.socket(zmq.PUB)
s.bind("tcp://*:5000")
Publish/subscribe: сервер
while True:
for city in ["Moscow", "Murmansk", "St.
Petersburg"]:
s.send(city, zmq.SNDMORE)
s.send(str(random.randint(10, 20)))
time.sleep(2)
Publish/subscribe: клиент
import zmq, sys
context = zmq.Context(1)
s = context.socket(zmq.SUB)
s.connect("tcp://localhost:5000")
Publish/subscribe: клиент
s.setsockopt(zmq.SUBSCRIBE, sys.argv[1])
while True:
city = socket.recv()
temp = socket.recv()
print city + ": " + temp
Publish/subscribe
$ python server.py &
[1] 79569
$ python client.py M
Moscow: 11
Murmansk: 11
Moscow: 13
Murmansk: 17
Модели взаимодействия
• Request/reply
• Publish/subscribe
• Pipeline
Pipeline
Другие возможности
• PAIR-сокеты
• Долговременные сокеты
• Транспорты: in-process, IPC, TCP, PGM
• Межпоточное взаимодействие
Другие возможности
• Polling
• Альтернативные модели взаимодействия
• Devices (queue, forwarder, streamer и
собственные)
Что отсутствует
• Транзакции
• Гарантированная доставка сообщений
• Информация о подключениях и контроль
над ними
Внимание!
• В inproc-сокетах connect() должен быть
вызван после bind()
• Сокеты привязаны к потокам
• Фильтрация на стороне клиента в PUB/SUB
• assert() в случае ошибок
Заключение
• Легко использовать
• Высокая производительность
• Большой выбор моделей взаимодействия
• Легко модифицировать существующую
архитектуру
Case study: GH ATP
Case study: GH ATP
• Автоматизированная торговля ценными
бумагами
• Большой объем данных (сотни тысяч
котировок в секунду)
• Жесткие требования к производительности
Задача: получение котировок
• Разные поставщики данных с разными
протоколами
• Данные используются в нескольких
продуктах
• Нужен унифицированный API
Требования
• Низкое время отклика (<1 мс)
• Большие объемы данных
• Поддержка нескольких языков (на данный
момент — Scala и C++)
• Load balancing, fault tolerance
Решение
• Клиент-серверное взаимодействие на
основе ØMQ
• Google Protocol Buffers для сериализации
сообщений
Клиент-сервер
Архитектура
Архитектура
• Stateless взаимодействие
• Легко балансировать нагрузку и
обеспечивать устойчивость
• Высокая производительность
Цифры
• Тестовые сервер и клиент (Scala), TCP/IP
• Около 250 000 котировок в секунду
• Средняя задержка: <1 мс
• CPU bound (protobuf), ØMQ может дать
большую производительность
ØMQ — это
• Легкая разработка высонагруженных
распределенных систем
• Простая модификация и добавление нового
функционала
• Масштабирование и скорость
• http://www.zeromq.com
• http://mongrel2.org
• Андрей Охлопков <oh@ghcg.com>
• Алексей Ермаков <ae@ghcg.com>

More Related Content

PPTX
Асинхронная обработка данных: RabbitMQ, Comet
PPT
Использование AMQP в основе архитектуры бэкенда для мобильного приложения
PDF
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
PDF
Юрий Насретдинов, Badoo
PPTX
сергей спиридонов
PDF
Smirnov Twisted Python
PDF
Михаил Давыдов — Транспорт, Ajax
PPTX
SignalR
Асинхронная обработка данных: RabbitMQ, Comet
Использование AMQP в основе архитектуры бэкенда для мобильного приложения
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Юрий Насретдинов, Badoo
сергей спиридонов
Smirnov Twisted Python
Михаил Давыдов — Транспорт, Ajax
SignalR

What's hot (18)

PDF
Kubasov 1 7_deploy
PDF
Twisted Framework - сетевые приложения в Python
PDF
Вебинар: Основы распараллеливания С++ программ при помощи OpenMP
PPTX
JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогра...
PDF
CodeFest 2012. Шкарин П. — Отказоустойчивость или высокие нагрузки
PPSX
Сервер «Аллодов Онлайн». Архитектура и особенности разработки.
PDF
Бекэнд для push-уведомлений своими руками
PPTX
Chrome push notifications. Анатомия и разработка
PPT
архитектура новой почты рамблера
PDF
Путь к Go на конкретном примере
PPTX
особенности использования Times Ten In Memory Database в высоконагруженной среде
PDF
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
PDF
«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)
PPT
Node.js (Андрей Костенко)
PPTX
Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...
PPTX
Синхронная репликацтя БД: какая от неё польза? (Алексей Юрченко)
PPTX
Кэширование в Web, php и symfony
PDF
Golang в avito
Kubasov 1 7_deploy
Twisted Framework - сетевые приложения в Python
Вебинар: Основы распараллеливания С++ программ при помощи OpenMP
JS Fest 2019. Игорь Березин и Николай Крещенко. Эволюция архитектуры многогра...
CodeFest 2012. Шкарин П. — Отказоустойчивость или высокие нагрузки
Сервер «Аллодов Онлайн». Архитектура и особенности разработки.
Бекэнд для push-уведомлений своими руками
Chrome push notifications. Анатомия и разработка
архитектура новой почты рамблера
Путь к Go на конкретном примере
особенности использования Times Ten In Memory Database в высоконагруженной среде
2014.09.24 история небольшого успеха с PostgreSQL (Yandex)
«Миллион открытых каналов с данными по сети» – Илья Биин (Zenhotels)
Node.js (Андрей Костенко)
Поддержка высоконагруженного проекта: мониторинг, резервирование, обслуживани...
Синхронная репликацтя БД: какая от неё польза? (Алексей Юрченко)
Кэширование в Web, php и symfony
Golang в avito
Ad

Similar to Использование 0MQ для построения low latency распределёных систем, Андрей Охлопков, Алексей Ермаков (20)

PPTX
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
PDF
Анатомия веб-сервиса, Андрей Смирнов
PDF
Анатомия веб-сервиса (РИТ-2014)
PDF
Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)
PDF
Анатомия веб сервиса (HighLoad-2014)
ODP
В поисках эффективного middleware
ODP
Архитектура программных систем на Node.js
PDF
JSLab.Тимур Шемсединов. "Архитектура программных систем на Node.js"
PPTX
Функциональные сети на основе библиотеки SynapseGrid
PPTX
2014.12.23 Александр Андреев, Parallels
PDF
Distributed systems
PPTX
Создание и развитие отечественной платформы с открытым программным кодом для ...
PDF
PDF
Как мы переносим миллионы пользователей Badoo между дата-центрами
PDF
Как мы переносим миллионы пользователей Badoo между дата-центрами
PDF
Перенос данных пользователей Badoo между датацентрами
PDF
Как мы переносим миллионы пользователей Badoo между дата-центрами
PDF
Введение в Python и Django
PDF
OSSDEV-2015: ReOpenLDAP
PDF
Михаил Давыдов: Транспорт, ajax
Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алекс...
Анатомия веб-сервиса, Андрей Смирнов
Анатомия веб-сервиса (РИТ-2014)
Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)
Анатомия веб сервиса (HighLoad-2014)
В поисках эффективного middleware
Архитектура программных систем на Node.js
JSLab.Тимур Шемсединов. "Архитектура программных систем на Node.js"
Функциональные сети на основе библиотеки SynapseGrid
2014.12.23 Александр Андреев, Parallels
Distributed systems
Создание и развитие отечественной платформы с открытым программным кодом для ...
Как мы переносим миллионы пользователей Badoo между дата-центрами
Как мы переносим миллионы пользователей Badoo между дата-центрами
Перенос данных пользователей Badoo между датацентрами
Как мы переносим миллионы пользователей Badoo между дата-центрами
Введение в Python и Django
OSSDEV-2015: ReOpenLDAP
Михаил Давыдов: Транспорт, ajax
Ad

More from Fuenteovejuna (20)

PDF
Facebook, Robert Johnson
PPT
Интеграция открытых технологий и взаимодействие со сторонними проектами в усл...
PPTX
Shared Personalization Service - How To Scale to 15K RPS, Patrice Pelland
PPT
Оптимизация одного из топовых приложений для социальной сети ВКонтакте: 1000 ...
PPT
Практическое создание крупного масштабируемого web 20 c нуля, Дмитрий Бородин
PPTX
Social Monitoring Tool codename Looking Glass, Patrice Pelland
PDF
Профилирование памяти в приложениях на Python, Антон Грицай
PDF
Компиляция скриптов PHP. Алексей Романенко
PPTX
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
PDF
Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...
PDF
Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...
PPTX
Динамика DDoS-атак в России, Александр Лямин
PPTX
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
PDF
Extreme Cloud Storage on FreeBSD, Андрей Пантюхин
PDF
Мониторинг XXI-век, Алиса Смирнова, Дима Никоненко
PDF
Native Client, Евгений Эльцин
PDF
Tarantool Silverbox, Юрий Востриков
PDF
Real time indexes in Sphinx, Yaroslav Vorozhko
PDF
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
PPT
Масштабируемая система голосования на базе PostgreSQL PgQ, Сергей Нековаль
Facebook, Robert Johnson
Интеграция открытых технологий и взаимодействие со сторонними проектами в усл...
Shared Personalization Service - How To Scale to 15K RPS, Patrice Pelland
Оптимизация одного из топовых приложений для социальной сети ВКонтакте: 1000 ...
Практическое создание крупного масштабируемого web 20 c нуля, Дмитрий Бородин
Social Monitoring Tool codename Looking Glass, Patrice Pelland
Профилирование памяти в приложениях на Python, Антон Грицай
Компиляция скриптов PHP. Алексей Романенко
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...
Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...
Динамика DDoS-атак в России, Александр Лямин
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
Extreme Cloud Storage on FreeBSD, Андрей Пантюхин
Мониторинг XXI-век, Алиса Смирнова, Дима Никоненко
Native Client, Евгений Эльцин
Tarantool Silverbox, Юрий Востриков
Real time indexes in Sphinx, Yaroslav Vorozhko
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Масштабируемая система голосования на базе PostgreSQL PgQ, Сергей Нековаль

Использование 0MQ для построения low latency распределёных систем, Андрей Охлопков, Алексей Ермаков