zmqのrouterがメッセージの隠しパラメータを受け取り、処理する問題について


記事の目次
  • 原因
  • を参照してください.
    最近はnodejsサーバーでzmqを使っています.JavaScriptを使っていますので、zromq.js[1]を使っています.(zmqを使っていません.windowsの下にzmqがインストールされています.node-gypはコンパイルされていません.早く出ますので、一旦諦めました.)その結果、最初から一つの問題があります.routerはdealerにメッセージを送って、受信できませんでした.
    原因
    参照[2]は、主にrouterがメッセージを受信するとき、デフォルトの最初のパラメータはorign socketであり、メッセージを送るときに最初のパラメータはどれに送るべきかを知るためです.
    A Router can be used to exted request/reply sockets.When receiving message a Router share prepend a message part containing the routing id of the originating peer to the message.Message received are faire-frome.the first part of the message is removed and used to determine the routing id of the peer the message shound be routed to.
    テストコード:
  • router.jsファイル
  • 	const zmq = require("zeromq")
    	
    	async function run() {
    	  const sock = new zmq.Router
    	  await sock.bind("tcp://127.0.0.1:3000")
    	  console.log("Worker connected to port 3000")
    	
    	 while (true) {
    	    await sock.send("some work")
    	
    	 const [id, msg] = await sock.receive()
    	 console.log('msg = ', id, msg.toString())
    	
    	 sock.send([id, "I,m broker."])
    	  }
    	}
    
    	run()
    
  • dealer.js
  • 	const zmq = require("zeromq")
    
    	async function run() {
    	  await sock.connect("tcp://127.0.0.1:3000")
    	  console.log("Producer bound to port 3000")
    	
    	  while (true) {
    	    await sock.send("some work")
    		
    	 const [msg] = await sock.receive()
    	 console.log('msg = ', msg.toString())
    	   
    	    await new Promise(resolve => setTimeout(resolve, 500))
    	  }
    	}
    
    	run()
    
    参照
    [1]zmq-github
    [2]ゼロムq.js-router