Использование 0mq для построения распределёных систем...
TRANSCRIPT
![Page 1: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/1.jpg)
Использование ØMQ для построения распределенных систем
Андрей ОхлопковАлексей Ермаков
![Page 2: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/2.jpg)
План доклада• Разработка распределенных систем• ØMQ: краткий обзор• Case study: GH ATP
![Page 3: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/3.jpg)
Распределенные системы
![Page 4: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/4.jpg)
Распределенные системы• Более гибкие в разработке• Проще масштабировать• Надежнее
![Page 5: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/5.jpg)
Масштабируемость
![Page 6: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/6.jpg)
Отказоустойчивость
![Page 7: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/7.jpg)
Гетерогенность
![Page 8: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/8.jpg)
Взаимодействие• HTTP• TCP/IP• Message-Oriented Middleware (MOM)
![Page 9: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/9.jpg)
MOM• Асинхронное взаимодействие через прием
и отправку сообщений• Очереди и маршрутизация
![Page 10: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/10.jpg)
Распространенные MOM• Amazon SQS• MSMQ• JMS• AMQP (RabbitMQ, Apache Qpid)
![Page 11: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/11.jpg)
![Page 12: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/12.jpg)
ØMQ• Разработан компанией iMatix (AMQP)• LGPL• Поддерживает C/C++, C#, Java, Python, PHP,
Ruby, Erlang и другие языки • “Sockets on steroids”
![Page 13: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/13.jpg)
Отличия от других MOM• Отсутствие брокера• API, похожий на BSD sockets API• Произвольный формат сообщений• Различные модели взаимодействия
![Page 14: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/14.jpg)
Отличия от обычных сокетов• N:M взаимодействие• bind()/connect() могут быть вызваны в
любом порядке на любой стороне• Поток сообщений а не байтов• Автоматическое переподключение
![Page 15: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/15.jpg)
Модели взаимодействия• Request/reply• Publish/subscribe• Pipeline
![Page 16: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/16.jpg)
Request/reply
![Page 17: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/17.jpg)
Request/reply: серверimport zmqcontext = zmq.Context(1)s = context.socket(zmq.REP)s.bind("tcp://*:5000") while True: request = s.recv() s.send(request.upper())
![Page 18: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/18.jpg)
Request/reply: клиент import zmq, syscontext = zmq.Context(1)s = context.socket(zmq.REQ)s.connect("tcp://localhost:5000")s.send(sys.argv[1])print socket.recv(),
![Page 19: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/19.jpg)
Request/reply$ python server.py &[1] 79259$ python client.py foo FOO$ python client.py barBAR
![Page 20: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/20.jpg)
Request/reply: серверimport zmqcontext = zmq.Context(1)s = context.socket(zmq.REP)s.bind("tcp://*:5000") while True: request = s.recv() s.send(request.upper())
![Page 21: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/21.jpg)
Request/reply: клиент import zmq, syscontext = zmq.Context(1)s = context.socket(zmq.REQ)s.connect("tcp://localhost:5000")s.send(sys.argv[1])print socket.recv(),
![Page 22: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/22.jpg)
Проблема с масштабируемостью
![Page 23: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/23.jpg)
Решение: queue device
![Page 24: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/24.jpg)
Queue = XREQ + XREP + device
![Page 25: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/25.jpg)
Queue = XREQ + XREP + deviceimport zmq, random, timecontext = 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)
![Page 26: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/26.jpg)
Несколько devices в одной сети
![Page 27: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/27.jpg)
Модели взаимодействия• Request/reply• Publish/subscribe• Pipeline
![Page 28: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/28.jpg)
Publish/subscribe
![Page 29: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/29.jpg)
Publish/subscribe: сервер import zmq, random, timecontext = zmq.Context(1)s = context.socket(zmq.PUB)s.bind("tcp://*:5000")
![Page 30: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/30.jpg)
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)
![Page 31: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/31.jpg)
Publish/subscribe: клиент import zmq, syscontext = zmq.Context(1)s = context.socket(zmq.SUB)s.connect("tcp://localhost:5000")
![Page 32: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/32.jpg)
Publish/subscribe: клиентs.setsockopt(zmq.SUBSCRIBE, sys.argv[1])while True: city = socket.recv() temp = socket.recv() print city + ": " + temp
![Page 33: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/33.jpg)
Publish/subscribe$ python server.py &[1] 79569$ python client.py MMoscow: 11Murmansk: 11Moscow: 13Murmansk: 17
![Page 34: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/34.jpg)
Модели взаимодействия• Request/reply• Publish/subscribe• Pipeline
![Page 35: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/35.jpg)
Pipeline
![Page 36: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/36.jpg)
Другие возможности• PAIR-сокеты• Долговременные сокеты• Транспорты: in-process, IPC, TCP, PGM• Межпоточное взаимодействие
![Page 37: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/37.jpg)
Другие возможности• Polling• Альтернативные модели взаимодействия• Devices (queue, forwarder, streamer и
собственные)
![Page 38: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/38.jpg)
Что отсутствует• Транзакции• Гарантированная доставка сообщений• Информация о подключениях и контроль
над ними
![Page 39: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/39.jpg)
Внимание! • В inproc-сокетах connect() должен быть
вызван после bind()• Сокеты привязаны к потокам• Фильтрация на стороне клиента в PUB/SUB• assert() в случае ошибок
![Page 40: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/40.jpg)
Заключение• Легко использовать• Высокая производительность• Большой выбор моделей взаимодействия• Легко модифицировать существующую
архитектуру
![Page 41: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/41.jpg)
Case study: GH ATP
![Page 42: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/42.jpg)
Case study: GH ATP• Автоматизированная торговля ценными
бумагами• Большой объем данных (сотни тысяч
котировок в секунду)• Жесткие требования к производительности
![Page 43: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/43.jpg)
Задача: получение котировок• Разные поставщики данных с разными
протоколами• Данные используются в нескольких
продуктах• Нужен унифицированный API
![Page 44: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/44.jpg)
Требования• Низкое время отклика (<1 мс)• Большие объемы данных• Поддержка нескольких языков (на данный
момент — Scala и C++)• Load balancing, fault tolerance
![Page 45: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/45.jpg)
Решение• Клиент-серверное взаимодействие на
основе ØMQ• Google Protocol Buffers для сериализации
сообщений
![Page 46: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/46.jpg)
Клиент-сервер
![Page 47: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/47.jpg)
Архитектура
![Page 48: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/48.jpg)
Архитектура• Stateless взаимодействие• Легко балансировать нагрузку и
обеспечивать устойчивость• Высокая производительность
![Page 49: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/49.jpg)
Цифры• Тестовые сервер и клиент (Scala), TCP/IP• Около 250 000 котировок в секунду• Средняя задержка: <1 мс• CPU bound (protobuf), ØMQ может дать
большую производительность
![Page 50: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/50.jpg)
ØMQ — это• Легкая разработка высонагруженных
распределенных систем• Простая модификация и добавление нового
функционала• Масштабирование и скорость
![Page 51: Использование 0MQ для построения распределёных систем (Андрей Охлопков, Алексей Ермаков)](https://reader035.vdocuments.pub/reader035/viewer/2022062312/55627a79d8b42ae73c8b4d94/html5/thumbnails/51.jpg)
• http://www.zeromq.com• http://mongrel2.org• Андрей Охлопков <[email protected]>• Алексей Ермаков <[email protected]>