Quantcast
Channel: Active questions tagged zeromq - Stack Overflow
Viewing all articles
Browse latest Browse all 193

ZMQ Subscriber not receiving all the messages

$
0
0

I am trying PUB SUB ZMQ communication using Golang. I was trying to send a number of messages (for example 10000) from PUB to SUB and checking the time required to receive all the messages in SUB. But I am never getting all the messages in SUB.

What could be the reason and how can I fix this?

Pub code -

package mainimport ("fmt""log""os""strconv""time"    zmq "github.com/pebbe/zmq4")const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"func SampleStrOfSize(size int) string {    b := make([]byte, size)    idx := 0    for i := 0; i < size; i++ {        b[i] = letters[idx]        idx = (idx + 1) % len(letters)    }    // fmt.Println("message: ", string(b))    return string(b)}func main() {    publisher, err := zmq.NewSocket(zmq.PUB)    if err != nil {        os.Exit()    }    defer publisher.Close()    connectionStr := "tcp://127.0.0.1:5555"    err = publisher.Bind(connectionStr)    if err != nil {        log.Fatal(err)    }    fmt.Println("Bound to", connectionStr)        // Make some random message string    message := SampleStrOfSize(1024)    msgCount := 0    if len(os.Args) > 1 {        if msgCount, err = strconv.Atoi(os.Args[1]); err != nil {            return        }    } else {        fmt.Println("No msg count provided")        return    }    if msgCount <= 0 {        fmt.Printf("Invalid msg count (%v) provided", msgCount)        return    }        // Giving some time for SUB to connect    time.Sleep(time.Second * 5)    fmt.Println("Starting message sending")    start := time.Now()    for i := 0; i < msgCount; i++ {                // Send same message every time        _, err = publisher.Send(message, 0)        if err != nil {            fmt.Printf("Error occured while sending message. %v", err)        }    }    elapsed := time.Since(start)    fmt.Printf("Sending %d messages took %s\n", msgCount, elapsed)        // Do not close immediately        time.Sleep(time.Second * 30)}

SUB code -

package mainimport ("fmt""os""strconv""time"    zmq "github.com/pebbe/zmq4")func main() {    subscriber, err := zmq.NewSocket(zmq.SUB)    if err != nil {        fmt.Println("Failed to open socket")        os.Exit(1)    }    defer subscriber.Close()    err = subscriber.Connect("tcp://127.0.0.1:5555")    if err != nil {        fmt.Println("Connect failed")        os.Exit(1)    }    msgCount := 0    count := 0    if len(os.Args) > 1 {        if msgCount, err = strconv.Atoi(os.Args[1]); err != nil {            return        }    } else {        fmt.Println("No msg count provided")        os.Exit(1)    }    fmt.Printf("Expecting %d messages\n", msgCount)    // Subscribe for all messages    err = subscriber.SetSubscribe("")    if err != nil {        fmt.Println("Failed to subscribe for all messages")        os.Exit(1)    }    var start time.Time    for {        _, err := subscriber.Recv(0)        if count == 0 {            start = time.Now()        }        if err != nil {            fmt.Println("Receive failed")        }        count++        if count == msgCount {            break        } else if 0 == count%1000 {            // Print time for every 1000 messages            elapsed := time.Since(start)            fmt.Printf("Received %d messages in %s\n", count, elapsed)        }    }    elapsed := time.Since(start)    fmt.Printf("Received %d messages in %s\n", msgCount, elapsed)}

When I am running the both code with say msgCount 10000, I am not getting 10000 messages in SUB. For example one time I got following output in SUB -

Expecting 10000 messagesReceived 1000 messages in 17.435321msReceived 2000 messages in 25.530057msReceived 3000 messages in 27.80558msReceived 4000 messages in 1m40.583143061sReceived 5000 messages in 1m40.590513201sReceived 6000 messages in 1m40.597145666s

What could be unusual delay after 3000 messages?


Viewing all articles
Browse latest Browse all 193

Trending Articles