Какой шаблон ZeroMQ лучше всего подходит для асинхронной пары сокетов?

У меня есть сервер (работает на Amazon) и один клиент, который к нему подключается. После установления соединения клиент и сервер взаимодействуют исключительно друг с другом и отправляют сообщения.

e.g.

1. Client -> Server
2. Client -> Server
3. Client <- Server
4. Client -> Server
5. Client <- Server
6. Client <- Server

Клиент может потерять подключение и повторно подключиться через некоторое время и возобновить отправку сообщений. Также каковы последствия порядка сообщений? Может ли № 2 прибыть раньше № 1?


person nickponline    schedule 21.02.2014    source источник


Ответы (2)


Толкать/тянуть лучше всего в этой ситуации. Это позволит асинхронный обмен сообщениями, но сохранит сообщения, если конечная точка на время отключится.

Для заказа ZeroMQ представляет собой абстракцию очереди FIFO и построен на основе TCP. Это гарантирует, что все сообщения будут переданы приложению в том порядке, в котором они были получены.

person JSON    schedule 23.02.2014
comment
Разве двухтактный не направленный? Как бы я отправил сообщения другим способом? - person nickponline; 25.02.2014

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

server.py:

import zmq
import threading

context = zmq.Context()
send_socket = context.socket(zmq.PUSH)
send_socket.bind('tcp://*:5556')

def print_incoming_messages():
    recv_socket = context.socket(zmq.PULL)
    recv_socket.bind('tcp://*:5557')
    while True:
        msg = recv_socket.recv_string()
        print(f'Message from client: {msg}')

# Print incoming messages in background
recv_thread = threading.Thread(target=print_incoming_messages)
recv_thread.start()

while True:
    msg = input('Message to send: ')
    send_socket.send_string(msg)

client.py:

import zmq
import threading

context = zmq.Context()
send_socket = context.socket(zmq.PUSH)
send_socket.connect('tcp://127.0.0.1:5557')

def print_incoming_messages():
    recv_socket = context.socket(zmq.PULL)
    recv_socket.connect('tcp://127.0.0.1:5556')
    while True:
        msg = recv_socket.recv_string()
        print(f'Message from server: {msg}')

recv_thread = threading.Thread(target=print_incoming_messages)
recv_thread.start()

while True:
    msg = input('Message to send: ')
    send_socket.send_string(msg)
person fuglede    schedule 19.04.2019