Q : Может кто-нибудь указать мне, как найти эту информацию?
Да.
Q : есть ли подходящая функция / метод «промывки»?
Да и нет:
Насколько далекокак ZeroMQ v2.x вплоть до v4.3.1, не было явного API-вызова для «сбрасывателя»
Красота и возможности интеллектуальных сообщений с малой задержкой, которые обеспечивает дизайн ZeroMQ, основаны намудро созданный Zen-of-Zero: всегда предпочитая производительность комфорту - как показывают Zero-copy, Zero-Guarantee и другие парадигмы.
Наивный (и я несу большую боль, чтобы упростить это до использованияпримитивная блокировка recv () ...) "flusher" должен пройти весь путь до тех пор, пока ZMQ_RCVMORE
не помечает NACK больше частей "за пределами" multi-frame-last-message (или zmq_msg_more() == 0
соответствует тому же самому).Тем не менее, все эти операции выполняют только обработку указателей, никакие данные не «перемещаются / копируются / читаются» из ОЗУ, только назначаются указатели, поэтому это действительно быстро и эффективно для ввода-вывода:
int more;
size_t more_size = sizeof ( more );
do {
zmq_msg_t part; /* Create an empty ØMQ message to hold the message part */
int rc = zmq_msg_init (&part); assert (rc == 0 && "MSG_INIT failed" );
rc = zmq_msg_recv (&part, socket, 0); /* Block until a message is available to be received from socket */
assert (rc != -1 && "MSG_RECV failed" );
/* Determine if more message parts are to follow */
rc = zmq_getsockopt (socket, ZMQ_RCVMORE, &more, &more_size);
assert (rc == 0 && "GETSOCKOPT failed" );
zmq_msg_close (&part);
} while (more);
Учитывая задокументированные свойства RFC-23 / ZMTP , существует лишь несколько (кодированная телеметрическая кодировка) гарантия:
1) все сообщения отправляются / доставляются:
- атомарно (либо безошибочные двоичные идентичные все кадры, либо ни одного вообще)
- не более одного раза (для соответствующего партнера)
- в порядке
2) из нескольких частей сообщения дополнительно получаютвнутренняя (внутриполосная) -телеметрия «совет» о состоянии :
- помеченный битами состояние
{ 1: more-frames-follow| 0: no-more-frames }
- aпомеченный битами размер-типа
{ 0: 8b-direct-octet | 1: 64b-"network-endian"-coded }
- a размер -vice
{ 0~255: direct-size | 0~2^63-1: 64b-"network-endian"-coded-size }
Документировано zmq_recv()
API также довольно явно в этом:
Multi-partСообщения
Сообщение ØMQ состоит из 1 или более частей сообщения.Каждая часть сообщения является независимой zmq_msg_t
сама по себе.ØMQ обеспечивает атомарную доставку сообщений: одноранговые узлы должны получать либо все части сообщения, либо ни одной вообще. Общее количество частей сообщения не ограничено, кроме как доступной памятью.
Приложение, обрабатывающее сообщения, состоящие из нескольких частей, должно использовать опцию ZMQ_RCVMORE zmq_getsockopt (3) после вызоваzmq_msg_recv (), чтобы определить, есть ли дополнительные части для получения.
Каким бы «уродливым» это не выглядело при первом чтении, наихудший случай, который поместится в памяти, - это огромное количествосообщений небольшого размера внутри многочастного фрейма сообщения.
В результате время "избавления от них" не равно нулю, но преимущества компактного и эффективного внутреннего ZMTP-Телеметрия и обработка потоков с малой задержкой - гораздо более важная цель (и она была достигнута).
Если сомневаетесь, сначала сравните наихудший случай:
a) «произведите» около 1E9 multipartфреймы с сообщениями, транспортирующие полезные нагрузки нулевого размера (без данных, но все кадры сообщений)
b) «настройка» простейшей возможной «топологии» PUSH/PULL
в) "выбрать" транспортный класс на ваш выбор { inproc:// | ipc:// | tipc:// | ... | vmci:// }
- лучший без стека inproc://
(я бы начал стресс-тест с этим)
d) секундомер, такой слепой-механический-нулевой ярлык "сбрасывает" между ReferencePoint-S:
, когда zmq_poll( ZMQ_POLLIN )
имеет POSACK-наличие присутствие любого читаемого содержимого и ReferencePoint-E:
когда последнее из многочастного сообщения из нескольких частей было зациклено слепым «flusher» -circus.
ИНТЕРПРЕТАЦИЯ РЕЗУЛЬТАТА:
Эти наносекунды, потраченные между [S]
и [E]
, считаются свидетельством наихудшего случая количества времени, которое получено "козел отпущения" в заведомо слепой цирковой "флешер" .В реальных сценариях использования будут дополнительные причины для того, чтобы потенциально тратить еще больше времени на то же самое.
Тем не менее, справедливо не забывать , что ответственность за отправку таких {заведомо таких размеров |плохо сформированный} - multi-frame-BEAST (s) является основной причиной любых операционных рисков при работе с этим в противном случае с ультра- низкой задержкой , high- (почти линейный) фокусируемый на масштабируемости фреймворк для обмена сообщениями / сигнализации.
Это искусство Zen-of-Zero, которое имеетпозволил этому случиться.Все благодаря Питеру ХИНТЖЕНСУ и его команде, возглавляемой Мартином СЮСТРИКОМ, мы все должны им огромное спасибо за то, что смогли и дальше работать с их наследием.