51
Использование ØMQ для построения распределенных систем Андрей Охлопков Алексей Ермаков

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

Embed Size (px)

DESCRIPTION

 

Citation preview

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

Использование ØMQ для построения распределенных систем

Андрей ОхлопковАлексей Ермаков

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

План доклада• Разработка распределенных систем• ØMQ: краткий обзор• Case study: GH ATP

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

Распределенные системы

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

Распределенные системы• Более гибкие в разработке• Проще масштабировать• Надежнее

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

Масштабируемость

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

Отказоустойчивость

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

Гетерогенность

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

Взаимодействие• HTTP• TCP/IP• Message-Oriented Middleware (MOM)

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

MOM• Асинхронное взаимодействие через прием

и отправку сообщений• Очереди и маршрутизация

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

Распространенные MOM• Amazon SQS• MSMQ• JMS• AMQP (RabbitMQ, Apache Qpid)

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

ØMQ• Разработан компанией iMatix (AMQP)• LGPL• Поддерживает C/C++, C#, Java, Python, PHP,

Ruby, Erlang и другие языки • “Sockets on steroids”

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

Отличия от других MOM• Отсутствие брокера• API, похожий на BSD sockets API• Произвольный формат сообщений• Различные модели взаимодействия

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

Отличия от обычных сокетов• N:M взаимодействие• bind()/connect() могут быть вызваны в

любом порядке на любой стороне• Поток сообщений а не байтов• Автоматическое переподключение

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

Модели взаимодействия• Request/reply• Publish/subscribe• Pipeline

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

Request/reply

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

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 для построения low latency распределёных систем, Андрей Охлопков, Алексей Ермаков

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 для построения low latency распределёных систем, Андрей Охлопков, Алексей Ермаков

Request/reply$ python server.py &[1] 79259$ python client.py foo FOO$ python client.py barBAR

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

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 для построения low latency распределёных систем, Андрей Охлопков, Алексей Ермаков

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 для построения low latency распределёных систем, Андрей Охлопков, Алексей Ермаков

Проблема с масштабируемостью

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

Решение: queue device

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

Queue = XREQ + XREP + device

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

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 для построения low latency распределёных систем, Андрей Охлопков, Алексей Ермаков

Несколько devices в одной сети

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

Модели взаимодействия• Request/reply• Publish/subscribe• Pipeline

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

Publish/subscribe

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

Publish/subscribe: сервер import zmq, random, timecontext = zmq.Context(1)s = context.socket(zmq.PUB)s.bind("tcp://*:5000")

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

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 для построения low latency распределёных систем, Андрей Охлопков, Алексей Ермаков

Publish/subscribe: клиент import zmq, syscontext = zmq.Context(1)s = context.socket(zmq.SUB)s.connect("tcp://localhost:5000")

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

Publish/subscribe: клиентs.setsockopt(zmq.SUBSCRIBE, sys.argv[1])while True: city = socket.recv() temp = socket.recv() print city + ": " + temp

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

Publish/subscribe$ python server.py &[1] 79569$ python client.py MMoscow: 11Murmansk: 11Moscow: 13Murmansk: 17

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

Модели взаимодействия• Request/reply• Publish/subscribe• Pipeline

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

Pipeline

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

Другие возможности• PAIR-сокеты• Долговременные сокеты• Транспорты: in-process, IPC, TCP, PGM• Межпоточное взаимодействие

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

Другие возможности• Polling• Альтернативные модели взаимодействия• Devices (queue, forwarder, streamer и

собственные)

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

Что отсутствует• Транзакции• Гарантированная доставка сообщений• Информация о подключениях и контроль

над ними

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

Внимание! • В inproc-сокетах connect() должен быть

вызван после bind()• Сокеты привязаны к потокам• Фильтрация на стороне клиента в PUB/SUB• assert() в случае ошибок

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

Заключение• Легко использовать• Высокая производительность• Большой выбор моделей взаимодействия• Легко модифицировать существующую

архитектуру

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

Case study: GH ATP

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

Case study: GH ATP• Автоматизированная торговля ценными

бумагами• Большой объем данных (сотни тысяч

котировок в секунду)• Жесткие требования к производительности

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

Задача: получение котировок• Разные поставщики данных с разными

протоколами• Данные используются в нескольких

продуктах• Нужен унифицированный API

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

Требования• Низкое время отклика (<1 мс)• Большие объемы данных• Поддержка нескольких языков (на данный

момент — Scala и C++)• Load balancing, fault tolerance

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

Решение• Клиент-серверное взаимодействие на

основе ØMQ• Google Protocol Buffers для сериализации

сообщений

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

Клиент-сервер

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

Архитектура

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

Архитектура• Stateless взаимодействие• Легко балансировать нагрузку и

обеспечивать устойчивость• Высокая производительность

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

Цифры• Тестовые сервер и клиент (Scala), TCP/IP• Около 250 000 котировок в секунду• Средняя задержка: <1 мс• CPU bound (protobuf), ØMQ может дать

большую производительность

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

ØMQ — это• Легкая разработка высонагруженных

распределенных систем• Простая модификация и добавление нового

функционала• Масштабирование и скорость

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

• http://www.zeromq.com• http://mongrel2.org• Андрей Охлопков <[email protected]>• Алексей Ермаков <[email protected]>