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

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

  • Upload
    ontico

  • View
    1.174

  • Download
    0

Embed Size (px)

Citation preview

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Request/reply

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

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

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

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

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

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

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

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

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

Решение: queue device

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

Queue = XREQ + XREP + device

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

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

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

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

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

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

Publish/subscribe

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

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

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

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

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

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

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

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

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

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

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

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

Pipeline

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

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

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

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

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

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

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

над ними

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

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

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

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

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

архитектуру

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

Case study: GH ATP

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

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

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

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

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

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

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

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

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

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

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

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

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

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

сообщений

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

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

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

Архитектура

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

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

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

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

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

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

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

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

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

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

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

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