В случае, если вы никогда не работали с ZeroMQ,
или никогда не встречали концепцию искусства Zen-of-Zero ,
, здесь можно насладиться первым взглядом.на "ZeroMQ Принципы менее чем за пять секунд " , прежде чем углубляться в дальнейшие подробности
Q : Какой самый правильный способ обработки исключения (в то время как)?
Лучшая стратегия - это предотвращение ошибок , а не любой вид"реактивного" (например,-почта Исключения) обработка.
Всегда предполагайте, что вещи могут разрушить и разрушат, и пусть они потерпят неудачу дешево.Чем дешевле стоимость отказов, тем лучше и быстрее система может вернуться к своему собственному предполагаемому поведению.
В современных с малой задержкой распределенные системы , тем более в системах реального времени исключение является чрезвычайно дорогим, разрушительным элементом спроектированного потока выполнения кода.
По этим причинам, а также для обеспечения стабильных уровней максимальной производительности,
ZeroMQ с тех пор использует совершенно другой подход:
0)
лучше использовать zmq_poll()
как самое дешевое из когда-либо обнаруженных присутствия (или не присутствия) любого читаемого сообщения (уже доставленного и готового к получению)прежде чем, если вообще, вызывать API-функцию zmq_recv()
, чтобы получить такие данные в руки кода уровня приложения изнутри Context()
экземпляра внутреннего хранилища.
1)
в зависимости от языковой привязки (wrapper), лучше всего наслаждайтесь неблокирующими формами методов .poll()
, .send()
и .recv()
.Собственный API-интерфейс наиболее прост в использовании в этом режиме: retCode = zmq_recv( ..., ZMQ_NOBLOCK );
2)
Всегда анализировать the retCode
- будь то в беззвучном режиме или с пояснениями assert( retCode == 0 && zmq_errno() )
или иным образом.
3)
Лучший обзор и точная настройка всей конфигурации* атрибуты созданных экземпляров инструментов, доступных в платформе ZeroMQ, и использование всех их скрытых возможностей для наилучшего соответствия потребностям домена вашего приложения.Многие собственные настройки API-интерфейса могут помочь смягчить, если не принципиально, избежать большого количества противоречивых требований прямо в экземпляре Context()
-инжиниринга, поэтому не стесняйтесь изучать все подробности возможных настроек и использовать их, насколько это возможно, для вашей помощи.код.
Q : С имеющейся у меня структурой (...), zmq_close
и zmq_ctx_destroy
никогда не будут выполняться,но я хочу, чтобы в случае программной ошибки / исключения (в зависимости от источника).
достаточно установить явный флаг:
bool DoNotExitSoFar = True;
while ( DoNotExitSoFar ){
// Do whatever you need
// Record return-codes, always
retCode = zmq_...(...);
// Test/Set the explicit flag upon a context of retCode and zmq_errno()
if ( retCode == EPROTONOTSUPPORTED ){
// take all due measures needed
...
// FINALLY: Set
DoNotExitSoFar = False;
}
}
// --------------------------------------------- GRACEFUL TERMINATION .close()
if ( ENOTSOCK == zmq_close(...) ) { ...; }
...
// --------------------------------------------- GRACEFUL TERMINATION .term()
retCode = zmq_ctx_term(...);
if ( EINTR == retCode ){ ...; }
if ( EFAULT == retCode ){ ...; }
...
Использование других инструментов, таких как int atexit(void (*func)(void));
, может служить последним средством для вызова ALAP zmq_close()
или zmq_ctx_term()