metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2014-12-04 03:44 pm

nanomsg, zeromq и ассерты

Продолжаю вникать в легковесные MQ библиотеки и ужасаюсь одной всепроникающей идее - ассерты в релизном коде, буквально на каждый возможный косяк.
С одной стороны, fail-fast это правильный подход, пусть супервизор процессов разбирается что дальше делать.
С другой - abort или RaiseException на виндах кидают messagebox, а messagebox в виндосервисе, если нет чек-бокса "разрешить взаимодействие с десктопом", это гамон, такой процесс можно только убить, он больше не подчиняется указаниям от сервис-контроллера. То же самое - запуск процессов из task scheduler, этот мессаджбокс будет "где-то висеть" в гребенях сессии в которой запущены сервисы.

Далее, нормальная методика при обработке ошибок: try {} catch(exception) { log(сообщение, параметры вызова, exception);throw}. Т.е. я по крайней мере, по логам узнаю, что привело к исключению (за исключением совсем плохих вещей, типа полной нехватки памяти, умершего железа или выдернутого езернет-провода).
В случае же assert - у меня процесс сдыхает (и не дай бог в соседних потоках писать на диск или работать с железом), причем если супервизор, который может прочесть stderr и скопировать сообщение в свой лок,отсутствует - сообщение об ошибке уйдет в никуда.

Судя по тому, как друг на друга псят Martin Sustrik и Pieter Hintjens, отзывам про либы и тому бардаку, который творится в коде nanomsg(например, комментарий вида: /* For some reason simple CancelIo doesn't seem to work here. We have to use CancelIoEx instead. */ в коде, из-за которого nanomsg вообще не запускается на 2003 и xp), ситуация с этими либами откровенно нехорошая.

[identity profile] b00ter.livejournal.com 2014-12-04 01:21 pm (UTC)(link)
Чот пока альтернатив нету. Ну или тупо задефайнить ассерты на try/catch, чем не подход.

[identity profile] dr-cha0s.livejournal.com 2014-12-04 01:24 pm (UTC)(link)
собственно во многих проектах ассерт заменён эксепшеном

[identity profile] metaclass.livejournal.com 2014-12-04 01:25 pm (UTC)(link)
Да, альтернатив нету.

[identity profile] dr-cha0s.livejournal.com 2014-12-04 01:23 pm (UTC)(link)
Написать свой mq с блэкджеком и шлюхами!

[identity profile] fas-tm.livejournal.com 2014-12-04 01:34 pm (UTC)(link)
шлюхи с приоритетами рекью и TTL.
Звучит заманчиво :)

[identity profile] avnik.livejournal.com 2014-12-04 01:38 pm (UTC)(link)
брось бяку.
Возьми кролика. Или редис (хотя там и симулятор очередей ;))
Или возьми ezmq (или как его там -- который с нуля по спекам на ерланге написан) если тебе надо с 0mq именно разговаривать.
develop7: (dero)

[personal profile] develop7 2014-12-04 01:58 pm (UTC)(link)
а messagebox в виндосервисе, если нет чек-бокса "разрешить взаимодействие с десктопом", это гамон, такой процесс можно только убить, он больше не подчиняется указаниям от сервис-контроллера
охуенно продуманная архитектура

[identity profile] sbj-ss.livejournal.com 2014-12-04 05:58 pm (UTC)(link)
Это грустные попытки организовать секьюрность. Были прецеденты, когда сервис (не "родной", правда), выводит на экран окошко. Этому окну посылается сообщение вида WM_COPY (а ещё веселее, если есть обработчик WM_COPYDATA), вариаций много, цель - переполнение буфера и выполнение кода с правами юзера, из-под которого запущен сервис.
Вообще у мессаджбокса есть флажок MB_SERVICE_NOTIFICATION, но и с ним не всё гладко. Как и с функцией MessageBoxTimeout.
Сама идея взаимодействия с пользователем из процесса, с пользователем не связанного, без желания на то пользователя - бред и зло. Как следствие - не надо бросаться ассёртами из библиотек в релизе.
Edited 2014-12-04 18:00 (UTC)

[identity profile] slonopotamus.livejournal.com 2014-12-04 08:43 pm (UTC)(link)
Как следствие -не надо бросаться ассёртами из библиотек в релизе.

Если архитектура - говно, надо просто это признать и исправить, а не придумывать гнилые отмазки. Окошки с сообщениями имеют смысл только если их есть кому смотреть (a.k.a. интерактивный режим). За сервисом смотреть некому, за ним должен следить запускатор сервисов и писать в логи/слать письма-смс/звонить админу, если сервису стало плохо.

[identity profile] sbj-ss.livejournal.com 2014-12-04 08:48 pm (UTC)(link)
Простите, а где отмазки-то? И я, и вы говорим, что не надо из сервиса кидать окошки.
Но что касается assert - тут уже разработчики библиотеки упускают из виду, что он может разворачиваться особо умным компилятором в показ MessageBox() (в т.ч. из консольного приложения - встречал) и прочие гадости. Известные ведь грабли, проще написать свой макрос с предсказуемым действием, чем в сотый раз на них наступать.
Если что - я этот сами-знаете-какой-компилятор, разумеется, не оправдываю.

[identity profile] slonopotamus.livejournal.com 2014-12-04 09:16 pm (UTC)(link)
Если уж говорить о компиляторе, то он тут ни при чем. Если почитать мерзкий msdn, то становится понятно, что окошко будет вылезать только если программа слинкована с debug-версией msvcrt. Никто топикстартера не заставлял это делать.

проще написать свой макрос
Проще использовать нормальные операционки, т.к. abort'ом проблемы не ограничиваются, но ребе метакласс известный мазохист и много лет уже сидит под виндой.

[identity profile] sbj-ss.livejournal.com 2014-12-04 09:21 pm (UTC)(link)
Когда линукса на десктопах менее двух процентов - неудивительно. Плюс поддерживать опердень даже под десяток разных дистрибутивов малореально.
Впрочем, это уже холивор.

[identity profile] metaclass.livejournal.com 2014-12-04 10:05 pm (UTC)(link)
В релизе вылазит другое: http://www.cacodaemon.org/nanomsg_exception.png
Оно, впрочем, на любые необработанные исключения вылазит, если SetErrorMode c флагом SEM_NOGPFAULTERRORBOX не вызвать.

[identity profile] cross-join.livejournal.com 2014-12-04 04:05 pm (UTC)(link)
ассерт же генерирует исключение, нет?
Тогда try-catch на уровне главной функции должен по идее отлавливать все, что не обрабатывается в приложении.

[identity profile] metaclass.livejournal.com 2014-12-04 04:15 pm (UTC)(link)
ассерт вызывает abort() в nanomsg, и RaiseException в zeromq

[identity profile] sbj-ss.livejournal.com 2014-12-04 06:12 pm (UTC)(link)
А _set_abort_behavior() не поможет? Хоть минус мессаджбокс.

[identity profile] metaclass.livejournal.com 2014-12-04 06:15 pm (UTC)(link)
От входа не помогло, надо разбираться, может они его там сдуру где сами повторно вызывают.

[identity profile] ygrek (from livejournal.com) 2014-12-04 06:17 pm (UTC)(link)
message box по abort'у выключается, см. _set_abort_behaviour

[identity profile] max630.livejournal.com 2014-12-04 08:36 pm (UTC)(link)
> abort или RaiseException на виндах кидают messagebox, а messagebox в виндосервисе

Это виндопроблемы, в цивилизованных осях abort() оставляет корку, где как раз и видно что произошло. А в винде вроде нельзя.

[identity profile] podberezovik345.livejournal.com 2014-12-05 11:57 pm (UTC)(link)
В винде вообще ничего нельзя. Даже таймеров, даже IPC, даже Аллах.

[identity profile] gds.livejournal.com 2014-12-04 09:37 pm (UTC)(link)
> на виндах кидают messagebox

проблемы винды

> nanomsg
> zeromq

ложе с пауками

говноедствуем?

[identity profile] metaclass.livejournal.com 2014-12-04 10:29 pm (UTC)(link)
Никак не могу поверить, что настолько широко известно-разрекламированная либа сделана настолько адски черезжопно.

[identity profile] gds.livejournal.com 2014-12-04 11:56 pm (UTC)(link)
оно же на говносишечьке написано -- какие там ещё альтернативы, кроме abort?

[identity profile] lionet.livejournal.com 2014-12-05 09:11 am (UTC)(link)
Говно всё это. Я делал анализ, и с Хиндтженсом в тви спорил.

Например, как организовать прокси в этой архитектуре, и чтобы без потери данных?
Как сделать так, чтобы при изменении топологии сети (или просто при внешних интернетных клиентах) у тебя сендер не тёк, и не слал данные "не туда"?
Как поймать отключение клиента, чтобы сразу сообщить ошибку сендеру, а не через таймаут?

[identity profile] b00ter.livejournal.com 2014-12-05 10:25 am (UTC)(link)
Счастья нет от слова "совсем"?

[identity profile] lionet.livejournal.com 2014-12-06 06:24 am (UTC)(link)
Есть. Я его сейчас пишу.

[identity profile] metaclass.livejournal.com 2014-12-06 06:35 pm (UTC)(link)
С центральным брокером или без?
Или, как ironmq воще в облацех?:)

[identity profile] edo-rus.livejournal.com 2015-07-30 11:25 pm (UTC)(link)
и как успехи?

[identity profile] vit-r.livejournal.com 2014-12-05 11:27 pm (UTC)(link)
Ассерт на виндусе - это как двигатель от гоночного автомобиля на трёхколёсном велосипеде. Удел Виндов - тихие убогие баги.

[identity profile] podberezovik345.livejournal.com 2014-12-06 12:00 am (UTC)(link)
Даже трехколесному велосипеду не нужен игрушечный двигатель игрушечного гоночного автомобиля.

[identity profile] vit-r.livejournal.com 2014-12-06 12:04 am (UTC)(link)
Всё можно сделать через жопу.

[identity profile] rashid80.livejournal.com 2014-12-16 10:43 am (UTC)(link)
не осилил?

[identity profile] geniepro.livejournal.com 2015-02-27 10:13 am (UTC)(link)
> /* For some reason simple CancelIo doesn't seem to work here. We have to use CancelIoEx instead. */ в коде, из-за которого nanomsg вообще не запускается на 2003 и xp

Да уж, и правда не работает, а вот ZeroMQ вроде запустилось на XP, придётся пока на нём остановиться...