了解路由器的 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
。
查看此 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
。