Минимизация задержки в оба конца ZeroMQ - PullRequest
1 голос
/ 14 апреля 2020

Мой вопрос касается минимизации задержки между клиентом и сервером ZMQ. У меня есть следующий измененный Hello World ZMQ (JeroMQ 0.5.1)

import org.zeromq.SocketType;
import org.zeromq.ZContext;
import org.zeromq.ZMQ;

public class server {
    public static void main(String[] args) {
        try (ZContext context = new ZContext()) {
            // Socket to talk to clients
            ZMQ.Socket socket = context.createSocket(SocketType.REP);
            socket.bind("tcp://*:5555");

            while (!Thread.currentThread().isInterrupted()) {
                byte[] reply = socket.recv(0);
                System.out.println(
                        "Received " + ": [" + reply.length+ "]"
                );

                String response = "world";
                socket.send(response.getBytes(ZMQ.CHARSET), 0);
            }
        }
    }
}

и клиент:

import org.zeromq.SocketType;
import org.zeromq.ZContext;
import org.zeromq.ZMQ;

public class client {
    public static void main(String[] args)
    {
        try (ZContext context = new ZContext()) {
            //  Socket to talk to server
            System.out.println("Connecting to hello world server" + args[0] + args[1] + args[2] );

            ZMQ.Socket socket = context.createSocket(SocketType.REQ);
            socket.connect("tcp://"+args[0]+":"+args[1]);


            for (int requestNbr = 1; requestNbr != 10; requestNbr++) {
                byte[] request = new byte[requestNbr*(Integer.parseInt(args[2]))];
                System.out.println("Sending Hello " + requestNbr);
                long time = System.nanoTime();
                socket.send(request, 0);

                byte[] reply = socket.recv(0);
                double restime = (System.nanoTime() - time)/1000000.0;
                System.out.println(
                        "Received " + new String(reply, ZMQ.CHARSET) + " " +
                                requestNbr + " " + restime
                );
            }
        }
    }
}

Я запускаю сервер и клиент по сети с задержкой (160 мс в оба конца). Я создаю задержку, используя t c как на клиенте, так и на сервере:

tc qdisc  del dev eth0 root
tc class  add dev eth0 parent 1: classid 1:155 htb rate 1000mbit
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 flowid 1:155 match ip dst 192.168.181.1/24
tc qdisc  add dev eth0 parent 1:155 handle 155: netem delay $t1 $dt1 distribution normal

Теперь, когда я запускаю java -jar client.jar 192.168.181.3 5555 100000, я получаю следующий вывод:

Sending Hello 1
Received world 1 1103.392783
Sending Hello 2
Received world 2 322.553512
Sending Hello 3
Received world 3 478.10143
Sending Hello 4
Received world 4 606.396567
Sending Hello 5
Received world 5 641.465041
Sending Hello 6
Received world 6 772.961712
Sending Hello 7
Received world 7 910.848674
Sending Hello 8
Received world 8 966.694224
Sending Hello 9
Received world 9 940.645636

, что означает что по мере того, как мы увеличиваем размер сообщения, для отправки сообщения и получения подтверждения требуется больше циклов (вы можете поиграть с размером сообщения, чтобы убедиться в этом сами). Мне было интересно, что мне нужно сделать, чтобы этого не произошло, а именно: отправить все за один go и минимизировать задержку до времени туда и обратно.

Примечание. В исходном приложении я использую шаблон REQ-ROUTER, так как у меня несколько клиентов, но проблема с задержкой и большими сообщениями сохраняется на

...