Как определить отключение однорангового узла с помощью потоковой передачи MessagePack без вращения или копирования? - PullRequest
0 голосов
/ 27 мая 2020

Я разрабатываю MessagePack серверные и клиентские приложения, и мне нужно знать, когда одноранговый узел отключается. Обычно у меня есть поток, вызывающий InputStream#read сокета для анализа вводимых данных, и я бы проверил возврат -1, чтобы обнаружить, что другая сторона закрыла соединение.

Эта стратегия не отображается для работы в контексте использования InputStream с MessagePack. Распаковщик имеет метод hasNext, который возвращает логическое значение, если есть элемент для распаковки. Если поток закрывается и read возвращает -1, hasNext просто возвращает false. Таким образом, любой цикл потока на unpacker.hasNext начнет вращаться, что нежелательно.

Я вижу только две альтернативы, ни одна из которых не идеальна.

  1. Запись данных в сокет .

Я могу записывать сердцебиение в сокет каждые n секунду и искать IOException. Я не против сердцебиения в моем приложении, на самом деле они, вероятно, являются для меня требованием, но сердцебиение, вероятно, будет с интервалами 30se c или более длительными, что означает, что мой поток приема по-прежнему вращается максимально долго. Я понимаю, что 30 секунд c спиннинга - не самое худшее, но я определенно хочу избегать его, если это вообще возможно.

Найдите (или напишите) другую библиотеку MessagePack.

Библиотека Python имеет метод feed, который позволяет вам управлять свой собственный буфер и загрузите байты распаковщика, как считаете нужным. Это позволит проверить возвращаемое значение на read. Однако это все еще не идеально, потому что теперь я создал дополнительную операцию копирования. Избежание этой копии было одной из причин, по которой я вообще хотел перейти на MessagePack. Кроме того, если я не могу найти библиотеку, написание моей собственной, вероятно, будет сложнее, чем я готов взять на себя.

Я хочу обнаружить отключение однорангового узла без снижения производительности, такого как вращение или копирование. Есть ли способ сделать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...