Top Banner
В поисках эффективного middleware Александр Герасёв, ЛВК 2014
31

В поисках эффективного middleware

Jul 16, 2015

Download

Software

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: В поисках эффективного middleware

В поисках эффективного middleware

Александр Герасёв, ЛВК 2014

Page 2: В поисках эффективного middleware

За что я не люблю программирование?

Boooring!

Page 3: В поисках эффективного middleware

Сокеты

● Установление соединения● Работа с несколькими сокетами

одновременно● Buffer overflow / short message● Обрывы связи и переподключение

Page 4: В поисках эффективного middleware

Многопоточность

● Семафоры● Разделяемые переменные● Мьютексы● Взаимные блокировки● Безблокировочные алгоритмы

● Ошибки

Page 5: В поисках эффективного middleware

Управление

Page 6: В поисках эффективного middleware

- Ваш любимый паттерн?-Спагетти.

Page 7: В поисках эффективного middleware

Message passing

Единственный метод взаимодействия компонентов: передача сообщений через очереди.

● Как сделать эффективно?● Как сделать просто?● Блокировать или нет при отправке?● Как доставлять между разными вычислителями?● Что делать, если нельзя доставить сообщение прямо

сейчас?● Как организовать очереди?● ???

Page 8: В поисках эффективного middleware

Откуда растут ноги

● RCP● Corba● DCOM● DCOP / Bonobo● RTI

В 2003 JPMorgan Chase заказала разработку и реализацию протокола AMQP компании iMatrix.

В 2007 iMatrix решили сделать свой протокол, без брокера, но с GPL.

В 2011 вышел ZeroMQ 1.0

В 2014 вышел ZeroMQ 4.0

Page 9: В поисках эффективного middleware

Что будет если

Что получится, если взять обычный TCP-сокет, добавить чуток радиоактивных изотопов, украденных с секретного советского реактора, облучить получившуюся смесь космическими лучами и передать в руки наркомана-художника, днём рисующего комиксы, а по ночам надевающего на себя костюм с накладными мускулами из спандекса.

Page 10: В поисках эффективного middleware

ØMQ

● ØMQ (also known as ZeroMQ, 0MQ, or zmq) looks like an embeddable networking library but acts like a concurrency framework.

Page 11: В поисках эффективного middleware

Ø?

● Zero brocker● Zero latency● Zero administration● Zero complexity● Zero cost

Page 12: В поисках эффективного middleware

Mesage passing and patterns

● Взаимодействие двух компонентов это всегда обмен сообщениями● Взаимодействие

– 1 to 1

– 1 to many

– many to 1

– many to many

● Шаблоны– Push-Pull

– Request-Reply

– Publish-Subscribe

– Router-Dealer

– ...

● Очереди сообщений

Page 13: В поисках эффективного middleware

Request-Reply pattern

Page 14: В поисках эффективного middleware

Request-Reply pattern

● Показать фрагмент кода

Page 15: В поисках эффективного middleware

Request-Reply pattern

Клиент:

import zmq

context = zmq.Context()

socket = context.socket(zmq.REQ)socket.connect("tcp://localhost:5555")

socket.send(b"Hello")

message = socket.recv()print("Received: %s" % message)

Сервер:

import zmq

context = zmq.Context()socket = context.socket(zmq.REP)socket.bind("tcp://*:5555")

while True: message = socket.recv() if message == b"Hello": socket.send(b"World") else: socket.send(b"Go away")

Page 16: В поисках эффективного middleware

Publisher-Subscriber

Page 17: В поисках эффективного middleware

Publisher-Subscriber

Клиент:

import zmq

context = zmq.Context()

socket = context.socket(zmq.SUB)socket.connect("tcp://localhost:5555")

while True: message = socket.recv() print("Received: %s" % message)

Сервер:

import zmqimport time

context = zmq.Context()socket = context.socket(zmq.PUB)socket.bind("tcp://*:5555")

while True: socket.send(b"Good news everyone!") time.sleep(5)

Page 18: В поисках эффективного middleware

Pipeline

● Data-driven computation

Page 19: В поисках эффективного middleware

Pipeline

● Data-driven computation● Divide and conquer

Page 20: В поисках эффективного middleware

Pipeline

● Data-driven computation● Divide and conquer● Control sockets

Page 21: В поисках эффективного middleware

zmq_socket

● Тип сокета● Тип транспорта

– In-process

– Inter-process

– TCP

– Multicast

● bind()/connect()– Кто слушает порт?

– Один ко многим и много к одному

Page 22: В поисках эффективного middleware

Connection magic

● Discovery problem● Pub-Sub proxy (Xpub-Xsub)

Page 23: В поисках эффективного middleware

Routing/Load-balancing

● Router-Dealer pattern

Page 24: В поисках эффективного middleware

Data transmission

● Non-blocking i/o● Zero-copy● HighWater marks● Serialization

● Multi-frame message– Envelopes

– Filtering

Page 25: В поисках эффективного middleware

Main loop

while True:

message = socket.recv()

message2 == ...

socket2.send(message2)

● zmq_poll

Page 26: В поисках эффективного middleware

Reliability

● Message loss● Component crash/disconnect● Idempotent data

Page 27: В поисках эффективного middleware

HighLevel Patterns

● Smart load-balancing● Heartbeats● Majordomo● Service discovery● Idempotent / non-idempotent services● Reliability / failover

Page 28: В поисках эффективного middleware

Zero latency?

Page 29: В поисках эффективного middleware

Сколько это всё стоит?

● Открытый LGPL проект● Активное сообщество● Интерфейсы для 40+ языков● Кроссплатформенность

Page 30: В поисках эффективного middleware

ØMQ Guide

http://zguide.zeromq.org

Page 31: В поисках эффективного middleware

Спасибо

Zero latency cat