Как я могу использовать 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 поможет вам диагностировать причину заблокированных операций. Не стесняйтесь добавлять столько точек отладки, сколько необходимо на охоте.

Другие вопросы по тегам