Как решить это неудобство?
1)
Если есть сомнения по поводу EC2сначала попытайтесь проверить обратный .bind() / .connect()
, чтобы назначения локального хоста на стороне EC2 вышли из игры, и ваше доказательство подключения к известному IP-адресу не будет зависеть от EC2-настройки стороны.
2)
Далее, учитывая отсутствие подробностей о клиентской части MCVE, возможно, я неправильно понял идею сценария, так что терпите меня- с тех пор доступны только эти совместимые масштабируемые формальные коммуникационные архетипы ZeroMQ сокетов , вплоть до API v4.2.x в 2018 / Q2:
{ PUB: [ SUB,
XSUB,
None
],
PULL: [ PUSH,
None
],
...
}
3)
Существует хорошая инженерная практика, позволяющая не допускать возникновения необработанных исключений, тем более, если Context()
-инстанция может все еще обладать IP: PORT # (b) заблокированным ресурсом (иногда даже за пределами питона)завершение процесса (много инцидентов с моей собственной наивностью и этимпуть тупиковых экспериментов в моей прошлой мрачной истории: o))
Каждый шаг в настройке инфраструктуры должен быть заключен в синтаксический раздел обработки ошибок, лучше всего включающий раздел finally:
, где до сих пор созданные ресурсы будут время от времениИзящно разбираться в тех случаях, когда возникают исключения.Таким образом, ваш код предотвратит навсегда зависших сирот, у которых есть только возможность перезагрузить платформу, чтобы избавиться от этих, иначе невозможно спасти заложников.
Проблема решена,
окончательное резюме:
Первоначально указанная проблема (диагностированная на этапе .bind() / .connect()
), как было показано ранее, была связана с отображением IP-адреса экземпляра Amazon EC2 в качестве термина, необходимого для любого транспорта.Настройка конечной точки класса, localhost:port#
camdebu 1 ноября 2012 17:07 объяснил все необходимые шаги:
Установите Elastic IP на ваш EC2 isntance.Тогда у вас будет статический IP-адрес.Elastic IP не требует затрат, если он указывает на экземпляр EC2.
После этого у вас не должно возникнуть проблем с подключением к вашему новому IP-адресу и порту при условии, что ваша безопасностьгруппа настроена правильно.-Cam-
- Проверьте правило группы безопасности.Убедитесь, что вы разрешаете порту взаимодействовать извне.(Включите все TCP и проверьте). [добавлено Yesu Jeya Bensh.P]
Недавно опубликованный код клиента, но показывает другую проблему, взаимный блок ,генерируется не взаимодействующим zmq::socket_t
sender( context, ZMQ_PUSH )
, который фактически никогда не отправляет отдельное сообщение.
Учитывая, что клиент переходит в while(1)
-loop какопубликовано выше, связанный одноранговый узел непреднамеренно войдет в нераспространенное заблокированное состояние внутри созданного Python main()
, так как:
def main():
...
collector = ctx.socket( zmq.PULL )
#ollector.bind( "tcp://*:5558" )
collector.bind( "tcp://54.89.25.43:5558" )
while True:
message = collector.recv() # THIS SLOC WILL BLOCK FOREVER HERE,
... # GIVEN <sender> NEVER SENDS...
, так что нужно быть более внимательным, чтобы сделать поток событийдостаточно крепкий, чтобы никогда не попасть в этот или подобный неразрушимый взаимный блок.