在 NodeJs-Golang 中使用 ZeroMQ REQ-REP 时如何确保通信稳定

问题描述 投票:0回答:1

这是我的节点代码

async function runClient() {
    console.log('Connecting to hello world server…');

    //  Socket to talk to server
    const sock = new zmq.Request();
    sock.connect('tcp://localhost:5555');
    let i = 0;

    while (true) {
        const msgToSend = 'Hello';
        console.log(`Count: ${i} Sending: ${msgToSend}`);

        await sock.send(msgToSend);

        const [result] = await sock.receive();
        console.log(`Count: ${i} Received: ${result.toString()}`);

        i++;
    }
}

这是我的 Golang

package main

import (
    "log"
    "time"

    zmq "github.com/pebbe/zmq4"
)

func main() {
    responder, _ := zmq.NewSocket(zmq.REP)
    defer responder.Close()
    responder.Bind("tcp://*:5555")

    for {
        // Wait for next request from client
        msg, _ := responder.Recv(0)
        log.Printf("Received %sr\n", msg)

        // Do some 'work'
        time.Sleep(time.Second * 1)

        // Send reply back to client
        responder.Send("World", 0)
    }
}

它们都已连接并且有输出到控制台,但有时,服务器(Golang)只是停在

responder.Recv(0)
responder.Send("World", 0)
,并出现这样的错误,

fatal error: schedule: in cgo

runtime stack:
runtime_mstart
        ../../../src/libgo/runtime/proc.c:596

goroutine 1 [runnable]:
github.com/pebbe/zmq4._C2func_zmq4_msg_recv
        /tmp/go-build/b003/_cgo_gotypes.go:372
github.com/pebbe/zmq4.Socket.RecvBytes..func1
        /home/uneex/go/pkg/mod/github.com/pebbe/[email protected]/zmq4.go:1082
github_0com_1pebbe_1zmq4.Socket.RecvBytes
        /home/uneex/go/pkg/mod/github.com/pebbe/[email protected]/zmq4.go:1082
github_0com_1pebbe_1zmq4.Socket.Recv
        /home/uneex/go/pkg/mod/github.com/pebbe/[email protected]/zmq4.go:1062
main.main
        /mnt/c/Users/golang-user/zmq/main.go:148
exit status 2
/mnt/c/Users/golang-user/zmq/main.go:148
错误中的

main.go:148
指向
responder.Recv(0)
,但有时也可能是
main.go:155
,那就是
responder.Send("World", 0)

来自ZMQ指南,据说是

在 C 和其他一些语言中,字符串以 null 终止 字节。我们可以发送一个像“HELLO”这样带有额外空字节的字符串:

zmq_send (请求者, "你好", 6, 0);

但是,如果您从另一种语言发送字符串,它可能会 不包含该空字节

但我实际上不知道如何开始将字符串从 Go 格式化为 JavaScript,任何指导将不胜感激。

javascript node.js go zeromq
1个回答
0
投票

不管表面如何,字符串尤其依赖于实现。尝试输入一些特殊字符,您很快就会了解语言之间的差异以及它们对字符串的编码有何不同。正如 ZeroMQ 手册中的评论所说,C 做一件事,其他语言做另一件事。

ZeroMQ 本身只是字节的传输器,它不会为您翻译特定于语言的类型,尽管某些语言可能会以某种方式将字符串转换为字节。

最好的选择是使用异构序列化程序,例如 Google Protocol Buffers,并使用 ZeroMQ 来传输序列化消息。对于单纯的字符串来说,这听起来似乎有点矫枉过正,但它至少可以保证,无论使用什么语言,都不会遇到问题。此外,跨越卢比孔河后,您就可以轻松地混合更复杂的类型/消息结构。

© www.soinside.com 2019 - 2024. All rights reserved.