了解路由器的 5 个请求

Understanding 5 REQs to Router

查看此 5 REQ <--> 1 ROUTER 设置的 Scala code

工人

 class WorkerTask extends Runnable {
    override def run: Unit = {
      val rand = new Random(System.currentTimeMillis())
      val context = ZMQ.context(1)
      val worker = context.socket(ZMQ.REQ)
      worker.connect("tcp://localhost:5555")
      var total = 0
      var workload = ""

      do {
        worker.send("Ready".getBytes, 0)
        workload = new String(worker.recv(0))
        Thread.sleep (rand.nextInt(1) * 1000)
        total += 1
      } while (workload.equalsIgnoreCase("END") == false)
      printf("Completed: %d tasks\n", total)
    }
  }

主要(路由器)

 def main(args: Array[String]): Unit = {
    val NBR_WORKERS = 5
    val context = ZMQ.context(1)
    val client = context.socket(ZMQ.ROUTER)

    assert(client.getType > -1)
    client.bind("tcp://*:5555")
    val workers = List.fill(NBR_WORKERS)(new Thread(new WorkerTask))
    workers.foreach (_.start)

    for (i <- 1 to (NBR_WORKERS * 10)) {
      // LRU worker is next waiting in queue
      val address = client.recv(0)
      val empty = client.recv(0)
      val ready = client.recv(0)

      client.send(address, ZMQ.SNDMORE)
      client.send("".getBytes, ZMQ.SNDMORE)
      client.send("This is the workload".getBytes, 0)
    }

    for (i <- 1 to NBR_WORKERS) {
      val address = client.recv(0)
      val empty = client.recv(0)
      val ready = client.recv(0)

      client.send(address, ZMQ.SNDMORE)
      client.send("".getBytes, ZMQ.SNDMORE)
      client.send("END".getBytes, 0)
    }
  }

运行 在我的机器上:

[info] Running net.server.RouterToReq
Completed: 21 tasks
Completed: 1 tasks
Completed: 27 tasks
Completed: 5 tasks
Completed: 1 tasks

根据我对上述代码的部分理解,5 REQ 工作人员在端口 5555.

上接受来自 ROUTER 的请求

最后,在下面的代码中:

 for (i <- 1 to NBR_WORKERS) {
      val address = client.recv(0)
      val empty   = client.recv(0)
      val ready   = client.recv(0)

client,即 ROUTER,正在接收什么消息?

工作人员将消息 "Ready" 作为单帧消息重复发送。

REQ套接字会在前面加一个空白分隔框。 ROUTER 套接字将在任何接收到的消息的前面添加一个标识符帧,以标识它来自哪里。

因此,当您在路由器上接收到单个就绪消息时,它变成了一个 3 帧消息,这就是为什么需要 3 recv 次调用的原因。

当您在路由器套接字上发送时,第一帧将被删除并用于识别将消息发送到哪个客户端。 REQ 套接字将删除所有帧,直到它找到一个空帧,因此您只需要在工作端调用一次 recv