Как я могу использовать 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?

Или в моем коде что-то не так? Большое спасибо.


person Rick.Wang    schedule 28.03.2018    source источник
comment
Как вы думаете, почему zeromq == эхо-сервер?   -  person ElmoVanKielmo    schedule 28.03.2018


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

person user3666197    schedule 28.03.2018