【问题标题】:JeroMq dropping messages – how to prevent?JeroMq 丢弃消息——如何防止?
【发布时间】:2012-11-04 18:59:59
【问题描述】:

我有关注“hello world”jeromqPUSH-PULL 客户端和服务器。只有在我设置了高水位标记值之后,我才能在不丢失消息的情况下进行传输。

import org.jeromq.ZMQ;

    public class TestTcpServer {

    public static void main(String[] args) {

    ZMQ.Context context = ZMQ.context(1);
    ZMQ.Socket socket = context.socket(ZMQ.PULL);

    System.out.println("Binding TCP server on port 5555");

    //socket.setRcvHWM(100_000);

    socket.bind("tcp://*:5555");
    int x;
    x = 0;
    while (true) {
        x++;
        byte[] raw = socket.recv(0);
        String rawMessage = new String(raw);
        if (x > 99_997) {
            System.out.println(x);
            System.out.println(rawMessage);
        }
    }

    }

}

//client

import java.io.IOException;
import org.jeromq.ZMQ;

public class TestTcpClient {

/**
 * @param args
 * @throws InterruptedException
 * @throws IOException
 */
public static void main(String[] args) throws InterruptedException,
        IOException {
    ZMQ.Context context = ZMQ.context(1);
    ZMQ.Socket socket = context.socket(ZMQ.PUSH);
    socket.connect("tcp://localhost:5555");

    //socket.setRcvHWM(100_000);

    System.out.println("Sending 100 000 transactions over TCP...");                   long start = System.currentTimeMillis();

    for (int request_nbr = 0; request_nbr != 100_000; request_nbr++) {
        String requestString = "message";
        byte[] request = requestString.getBytes();
        boolean success = socket.send(request, 0);
        if (!success) {
            System.out.println("sending message failed!");
        }

    }
    long end = System.currentTimeMillis();
    System.out.print("Time: ");
    System.out.print(end - start);
    System.out.println(" ms");      
    socket.close();
    context.term();     
}

}

根据 0Mq documentation,只有 PUB 套接字会在达到高水位标记时丢弃消息。既然我使用的是 PUSH-PULL 套接字,为什么会丢弃消息?

在我看来,HWM 是系统的动态属性,所以虽然我已经能够在这个 hello world 示例中解决丢弃消息的问题,但我想知道我是否可以指望 jeromq 在现实世界的情况下不会丢弃消息?

【问题讨论】:

    标签: messaging zeromq jeromq


    【解决方案1】:

    感谢您的报告。

    是的,PUSH/PULL 不得丢弃消息。

    ZMTP 2.0 支持的最新飞跃存在错误。

    请尝试使用最新的快照。

    另外,如果您想在发送消息后退出应用程序,我建议您在客户端添加socket.setLinger(some_milli_seconds)

    【讨论】:

    • 我尝试了延迟设置,但没有效果,将尝试最新的快照。
    【解决方案2】:

    在 JeroMQ 0.3 中应该可以正常工作,我在这里做了一个简单的基准测试 http://nguyentantrieu.info/blog/benchmark-pubsub-jeromq-java/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      相关资源
      最近更新 更多