Nano Hash - криптовалюты, майнинг, программирование

Компенсация невозможности супервизора one_for_one перезапустить дочерний элемент: прослушиватели портов tcp/ip

Я создал общее поведение, которое инкапсулирует функциональность tcp/ip. Все, что должен сделать пользователь поведения, — это реализовать обратные вызовы, которые обрабатывают проанализированные «команды», поступающие от того, что находится на другой стороне сокета.

Мое общее поведение создает процесс прослушивания портов, который прослушивает порт через gen_tcp:accept. Когда кто-то подключается к порту, прослушиватель портов просит супервизора запустить новый прослушиватель портов, в то время как он продолжает обрабатывать связь сокета с любым клиентом, который только что подключился. Поскольку каждый из этих прослушивателей портов/обработчиков сокетов создается динамически и идентичен, для их создания я использую супервизор simple_one_for_one. Стандартные вещи.

Вот мой вопрос. Если процесс прослушивания порта завершается, все поведение становится нефункциональным, поскольку порт не будет прослушиваться. Поскольку прослушиватель портов создается супервизором simple_one_for_one, супервизор не может перезапустить новый прослушиватель портов.

Итак, должен ли я создать процесс keep_alive, который отслеживает «последний» прослушиватель портов и просит superviosr запустить еще один, если он умрет? Или есть какая-то другая передовая практика для этого типа случая.

Кроме того, есть ли способ увидеть/изучить процесс, создаваемый этим поведением? Это не приложение, поэтому appmon здесь не работает.

Спасибо


Ответы:


1

Вероятно, вы могли бы продолжить работу только с одним процессом-слушателем, поскольку вы всегда можете передать владение сокетом другому процессу с помощью

gen_tcp:controlling_process(Socket, Pid)

И тогда ваш слушатель тоже сможет.

Тогда вам не нужно будет простой_один_за_один супервайзер на высшем уровне, а вместо этого один_за_один. Или то, что, по вашему мнению, должно подойти лучше. Затем супервизор верхнего уровня порождает процесс слушателя и супервизора акцепторов со стратегией simple_one_for_one. Тогда прослушиватель обязательно будет перезапущен, если он почему-то выйдет из строя (и если вы захотите).

Кроме того, вы можете обратиться к проекту cowboy, чтобы узнать, какие подходы используют авторы.

07.11.2011
  • Итак, я последовал вашему совету и у меня есть супервизор one_for_one, который запускает port_listener. Когда клиент подключается, port_listener просит супервизора запустить процесс клиента/сокета и передает ему управление. Интересно, насколько загруженной должна быть система, прежде чем мне придется беспокоиться о проблеме быстрой потери пакетов? 07.11.2011
  • @ Jr0, единственный способ узнать это - сравнить. Моя точка зрения следующая: поскольку я вижу, что ни одна из операций, выполняемых процессом port_listener, не собирается блокировать его выполнение на значительное время, то это не является узким местом. Вы можете прочитать этот сообщение в блоге, если вас интересует эффективность подобного поведения. 08.11.2011
  • @Jr0, trapexit.org/ тоже может быть полезным. 09.11.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..