Как я могу использовать ZeroMQ на балансировщике нагрузки AWS?
У меня есть два экземпляра EC2 ( vm1, vm2) и внутренний балансировщик сетевой нагрузки в моей частной подсети в VPC. В vm1 я запускаю программу для подключения балансировщика нагрузки AWS:
import zmq
if __name__ == '__main__':
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://aws-loadbalancer-dns-name:1111")
for i in range(5):
socket.send_string(str(i))
msg = socket.recv()
print('receive respond:', msg)
В vm2 я также запускаю программу:
import zmq
import time
if __name__ == "__main__":
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:1111")
while True:
msg = socket.recv()
print('receive request:', msg)
socket.send_string(str(msg))
time.sleep(1)
Кажется, что это не удалось.
Как я могу настроить мои настройки в AWS?
Или в моем коде что-то не так? Большое спасибо.
1 ответ
Часть I: " Что-то не так в моем коде? ":
Нет, код варианта использования ZeroMQ выглядит без проблем.
Не стесняйтесь добавлять столько точек отладки в MCVE-источник, сколько нужно на охоте, чтобы подробно документировать, где он находится и что актуально ZMQError()
получает сообщение на лету:
[ 'EADDRINUSE', # L3
'EADDRNOTAVAIL', # L3
'ECONNREFUSED', # L3
'ENETDOWN', # L1 / L2 / L3
'ENODEV', # L1
'EFAULT',
'EFSM', # ZMQ Finite State Machine not in a state to obey this
'EAGAIN', # ZMQ Context() blocked
'EINPROGRESS',
'EINVAL', # ZMQ did not recognise a valid value in param
'EMTHREAD',
'ENOBUFS', # resources
'ENOMEM', # resources
'ENOCOMPATPROTO', # ZMQ protocol-handshaking
'EPROTONOSUPPORT', # ZMQ protocol
'ENOTSOCK', # ZMQ resource - not recognised as an "own" socket
'ENOTSUP', # ZMQ cannot support a request
'ETERM', # ZMQ Context() already entered into a .term()-state
...
]
Часть II: " Как я могу изменить настройки в AWS? ":
Эта часть немного сложнее.
Сначала проконсультируйтесь с вашими контрактными параметрами Если оператор AWS не разрешает вам запускать TCP/IP-сервисы между экземплярами, никакой другой шаг, кроме пересмотра контракта (выбор другого, менее ограниченного продукта), не может помочь.
Если TCP/IP-сервисы не заблокированы, проконсультируйтесь со службой поддержки оператора AWS, какие номера портов разрешены в соответствующих случаях. Операционная система, помимо политик оператора, упомянутых выше, может иметь некоторые дополнительные ограниченные диапазоны номеров портов, и если ваше приложение использует блокировку O/S <transport-class>://<address>:<port#>
(будучи == 1111
в приведенном выше сценарии использования MCVE) любая попытка будет систематически заканчиваться неудачей из-за попытки использовать запрещенный ресурс (изменение <port#>
быть самым легким средством, не так ли?).
Для любых других случаев ZMQError
поможет вам диагностировать причину заблокированных операций. Не стесняйтесь добавлять столько точек отладки, сколько необходимо на охоте.