我已经构建了一个基于 python 编写的应用程序ZeroMQ,但现在我面临着性能问题。所以我决定使用 Golang 重写我的应用程序的一些模块。但是当我尝试在不同语言实现的套接字之间建立消息传递时,任何事情都不起作用。
到目前为止,我已经搜索过,但没有找到有关ZeroMQ使用不同语言的兼容性问题的任何信息。
所以问题是:我可以使用golang进行基于ZeroMQpython编写的客户端的服务器实现来连接它吗?
还是我必须只使用一种语言?
编辑:这是我正在尝试正常工作的典型服务器和客户端
服务器:
import zmqctx = zmq.Context()
sock = ctx.socket(zmq.REP)
sock.bind("tcp://*:57000")
msg = sock.recv()
Run Code Online (Sandbox Code Playgroud)
客户:
package main
import (
zmq "github.com/pebbe/zmq4"
)
func main() {
ctx, _ := zmq.NewContext()
sock, _ := ctx.NewSocket(zmq.REQ)
sock.Connect("tcp://localhost:57000")
sock.Send("simple message", 0)
}
Run Code Online (Sandbox Code Playgroud)
服务器卡在 sock.recv()
小智 4
编程语言能够相互通信——是的,您可以用 Go 编写服务器,用 Python 编写客户端,并让它们相互通信。
如果您尝试使用原始套接字进行通信,请查看所需语言的文档,并确保序列化数据在结构上匹配。
例如,您可以决定一个结构并在Python或代码中实现您的有效负载,然后在Go中匹配该结构(Go 中可能有更好的/stdlib 方式;我对这种语言不是很有经验)。担心这些细节带来的潜在维护和实施难题是人们使用更高级别协议的原因——这正是 ZeroMQ 的一个很好的用例。
如果您使用消息队列作为操作的骨干,只需将其用作共享协议即可。如果您的 Python 代码可以与 ZeroMQ 通信,那么它就可以正确完成其工作——您的 Go 代码不需要知道它正在与 Python 通信。
在这种情况下,您的新Go 服务器将绑定到 ZeroMQ,您的Python 客户端将绑定到 ZeroMQ,并且您的两种异构语言不需要彼此了解。