- 關于高級請求應答中的 ROUTER to N worker 負載均衡的規則
- P96的例子rtreq.c中描述代理者按照最近最少使用的規則為工人分發任務,為此我先將工人的每次作業時間修改為400毫秒,并列印了獲取任務的工人ID順序,一下是截取的前半部分的結果。從這個結果上來看,前十個是十個工人隨機順序來取的任務,從第十一個開始,按照規則,應該為第0個工人分發任務,但實際為第6個工人分發了任務。why????????
> 0 8 1 4 7 3 5 2 6 9 6 1 4 7 8 2 0 5 3 9 6 1 0 7 8 5 2 4 3 9 2 1 0 8 5 4 6 7 3 9 5 8 3 1 0 4 6 7 2
- 猜測:工人們執行完作業,并向代理者發送準備就緒的信號,此時,工人進入佇列,等待代理者分配任務。但是由于網路狀況的波動,并不一定是0號的就緒信號先到達佇列。
package nlb;
//ROUTER to N worker
import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;
import java.util.Random;
public class rtreq {
private static final int NBR_WORKERS = 10;
private static final long start = System.currentTimeMillis();
private static int ID = 0;
public static void main(String[] args) throws Exception {
Context context = ZMQ.context(1);
Socket broker = context.socket(ZMQ.ROUTER);
broker.bind("tcp://*:5671");
for (int worker_nbr = 0; worker_nbr < NBR_WORKERS; ++worker_nbr) {
new Thread(() -> worker_task()).start();
}
long end_time = clock() + 5000;
int workers_fired = 0;
while (true) {
String identity = new String(broker.recv(0));
System.out.print(identity+" ");
broker.sendMore(identity);
broker.recv();
broker.recv();
broker.sendMore("");
if (clock() < end_time) {
broker.send("Work harder");
} else {
broker.send("Fired!");
if (++workers_fired == NBR_WORKERS) {
break;
}
}
}
broker.close();
context.close();
}
private static void worker_task() {
Context context = ZMQ.context(1);
Socket worker = context.socket(ZMQ.REQ);
String id = (ID++) + "";
worker.setIdentity(id.getBytes());
worker.connect("tcp://localhost:5671");
int total = 0;
while (true) {
//prepare worke
worker.send("Hi Boss");
//get workload util recv Fired
byte[] workload = worker.recv(0);
if (new String(workload).equals("Fired!")) {
System.out.println(id + " Completed:" + total + " tasks");
break;
}
++total;
//do something
try {
// Thread.sleep(new Random().nextInt(500) + 1);
Thread.sleep(300);
} catch (Exception e) {
System.out.println("error");
}
}
worker.close();
context.close();
}
private static long clock() {
return System.currentTimeMillis() - start;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/114030.html
標籤:網絡通信
上一篇:如何同步兩個系統的時間?
