![]() |
0mq, готовим сеть вкуснее (иначе)
Как часто вы сталкивались что вам нужны сокеты, а все либы - какой-то тяжеловесный ужас ? Вам нужна быстрая передача пакетов, а UDP шлёт дейтаграммы без досылок. Вам нужно чтобы оно работало бл*, а в итоге вы компилите уже второй час какой-то ужас. При этом лень самому написать "эти 20 килобайт" с двумя сокетами и потоком :crazy:
Теперь уточним - если вам нужен HTTP (или REST api скажем), то "эти 20 килобайт" всё же придется писать, таков уж путь веба :) Но если вам нужна просто передача данных то welcome ! Долгое время для геймдева не было ничего лучше RakNet, но капитализм взял своё, и теперь она стоит как обычный серьезный middleware, отдавать пару тыс, а то и все 15k$ за сетевую либу это не очень просто, особенно если бюджет игры у нас меньше чем 15k$ :crazy: В общем вещь хорошая, но статья о том где вкуснее. Забегая наперёд скажу что мы опять поговорим о "готовим вкуснее", те представленное решение использует tcp сокеты (и не только их). В общем сегодня мы копнём в messaging, unix'ы базируются на подходе что у нас будет куча программ которые делают одно действие, но делают его хорошо (набор инструментаря) и какой-то фронт-енд для него, собственно если процессов много, то им надо как-то взаимодействовать с друг дружкой, вспомним еще то что "все программы в одном компьютере" это собственно наследие ibm pc, в реальности же дело было так что часть программы была на одном компьютере, часть в другом, и они взаимодействовали через разные сети\протоколы :crazy: (собственно x11 и щас по сети на ура пробрасывается), в общем взаимодействие разных инстансов программ в рамках одной системы и в рамках нескольких компьютеров - это реалии даже вне ip стека. Если у нас куча программ, и каждой надо слать друг дружке сообщения, то мы как раз попали куда надо ! 0mq (zeromq) была создана чтобы решить весь геморой в отправке сообщений, библиотека написана на C++, использует свой формат ZMTP и передаёт его поверх tcp, icp и интерконект (внутри процесса). Как же оно решает все наши проблемы ? А просто, 0mq :
Казалось бы описание обычной сетевой либы, которую компилить 2 часа с матюками, но прорыв заключается в последних двух пунктах ! Особенно в последнем. Ибо не зря её еще называют The Intelligent Transport Layer. Простой вариант, у нас есть программа которая делает запрос (request - req), и программа которая отвечает на запрос (replier - rep) : ![]() Суть контекстно-зависимого топологического решения тут в том что req сокет не может принимать пакет пока не отправит запрос, а rep не может отправлять пакет пока не получит запрос :crazy: В итоге это выливается в том что у нас есть чёткие цепочки, req : send, recv, send, recv, send, recv, ..., а у rep : recv, send, recv, send, ... Пока просто ? давайте глянем на код : Код:
// Чтобы не стоять на месте, давайте рассмотрим далее : ![]() У нас есть pub сокет - в него можно только писать, и sub сокет - он только принимает данные, сам. * тут в примерах используется s_send и s_recv, это функции хелперы для туториала, они просто создают сообщение\получают и записывают\читают строку, этот код вынесли чтобы лучше показать суть примера Код:
// Код:
// А теперь map-reduce ! Схоже с pub\sub, push сокеты используются для передачи, а pull для получения, основное отличие в том что они используются для распределения сообщений (те каждый worker не получает все сообщения, а только часть). ![]() Код:
// Код:
// Код:
// Почему ? Давайте посмотрим на банальное сетевое начало : ![]() Прокрутите в голове сколько кода нужно и как он будет выглядеть чтобы сделать такую топологию надёжной и работающей в отдельном потоке, нужно же отслеживать ошибки передачи, делать очереди и тд и тп. Если у нас только так и остаётся - всё ок. Но на самом деле так почти никогда не остаётся, под релиз у вас будет вот так : ![]() Думаю любой программист будет явно недоволен писать такое на сокетах во время кранча в 4 утра. 0mq тут выступает красной и синей пилюлей одновременно, с одной стороны мы начинаем смотреть на сеть по другому, нам начинает нравится писать сетевой код, становится легко его дебажить даже в голове, с другой стороны это сильный удар по устоявшемся устоям сетевого программирования. Дальнейшее погружение тут : http://www.zeromq.org/ и http://zguide.zeromq.org/page:all А теперь набор фактов : 1) добавить 0mq в свой проект - дело 5-10 минут, простые исходники, простая компиляция 2) вы навсегда забываете про головную боль, слова "ошибка передачи", "разрыв соединения" и тд 3) вы не думаете о том posix или win потоки используются, вы не думаете о потоках вообще 4) вы можете нагрузить канал передачи полностью, шлите хоть миллион пакетов в секунду - всё придет с максимальной скоростью канала связи 5) вы не думаете о порядке приема\передачи сообщений, он всегда такой который вы и ожидали 6) вы спите более спокойно и кранчи проходят менее болезненно 7) доступно на c, c++, c#, clojure, cl, erlang, f#, felix, go, haskell, haxe, java, lua, node.js, objective-c, perl, php, python, ruby, scala, tcl, ada, basic ps. статья направлена заинтриговать читателя и предоставить читателю решения его сетевых проблем, если интересно могу написать где, кто и как использует 0mq :) |
Ответ: 0mq, готовим сеть вкуснее (иначе)
плюсую, не так давно требовалось в срочном порядке добавить сеть в существующий нагроможденный медленно компилящийся проект, достаточно было взять 0mq и код из hello world примера на сайте, чтобы всё заработало.
все довольны, я получил свои монеты 8-) --- ах да, до этого с сетью не работал никогда, нигде и вообще. |
Ответ: 0mq, готовим сеть вкуснее (иначе)
НУ ГДЕ Ж ТЫ БЫЛ неделю назад, когда я писал (и дописал) свою библиотеку, работающую в отдельном потоке с сокетами в неблокирующем режиме. (это я типа "спасибо" сказал).
Удивительно - специально пересмотрел ряд предложений: от тяжеловесного ASIO из буста, до совсем лёгких библиотек - все имели ряд изъянов, а сабж не попался =( |
Часовой пояс GMT +4, время: 18:03. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot