不同语言编写的 ZeroMQ 套接字的兼容性
Compatibility of ZeroMQ sockets written on different languages
我基于 ZeroMQ
在 python 上构建了一个应用程序,但现在我遇到了性能问题。所以我决定使用比方说 Golang 重写我的应用程序的一些模块。但是当我尝试在由不同语言实现的套接字之间建立消息传递时,任何事情都不起作用。
到目前为止我已经搜索过,但我没有找到任何关于[的兼容性问题的信息=12=] 使用不同的语言。
所以问题是:我可以用golang做基于ZeroMQ
的服务端实现和写在python上的客户端连接吗?
或者我必须只使用一种语言吗?
编辑:这是我正在尝试正常工作的典型服务器和客户端
服务器:
import zmqctx = zmq.Context()
sock = ctx.socket(zmq.REP)
sock.bind("tcp://*:57000")
msg = sock.recv()
客户:
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)
}
服务器卡在 sock.recv()
编程语言能够相互通信 -- 是的,您可以用 Go 编写服务器并在 Python 中编写客户端并让它们相互通信。
如果您尝试使用原始套接字进行通信,请查看您所需语言的文档并确保序列化数据在结构上匹配。
例如您可以决定一个结构并在 Python or code and then match that structure in Go 中实现您的有效负载(Go 中可能有 better/stdlib 方式;我对这种语言不是很有经验)。担心这些细节的潜在维护和实施头痛是人们使用更高级别协议的原因——这正是 ZeroMQ 的一个很好的用例。
如果您使用消息队列作为操作的 backbone,只需将其用作共享协议即可。如果您的 Python 代码可以与 ZeroMQ 通信,那么它正在正确地完成它的工作——您的 Go 代码不需要知道它正在与 Python.
通信
在这种情况下,您的新 Go server would bind to ZeroMQ, your Python client would bind to ZeroMQ 和您的两种异构语言不需要相互了解。
这有点晚了,但我在尝试寻找 golang-to-python 0mq 实现时发现了这个 post。
在我的 golang 代码中,我刚刚将 zmq
更改为 zmq4
一切都对我有用:
import (
zmq4 "github.com/pebbe/zmq4"
)
func main() {
ctx, _ := zmq4.NewContext()
sock, _ := ctx.NewSocket(zmq4.REQ)
sock.Connect("tcp://localhost:57000")
sock.Send("simple message", 0)
}
我基于 ZeroMQ
在 python 上构建了一个应用程序,但现在我遇到了性能问题。所以我决定使用比方说 Golang 重写我的应用程序的一些模块。但是当我尝试在由不同语言实现的套接字之间建立消息传递时,任何事情都不起作用。
到目前为止我已经搜索过,但我没有找到任何关于[的兼容性问题的信息=12=] 使用不同的语言。
所以问题是:我可以用golang做基于ZeroMQ
的服务端实现和写在python上的客户端连接吗?
或者我必须只使用一种语言吗?
编辑:这是我正在尝试正常工作的典型服务器和客户端
服务器:
import zmqctx = zmq.Context()
sock = ctx.socket(zmq.REP)
sock.bind("tcp://*:57000")
msg = sock.recv()
客户:
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)
}
服务器卡在 sock.recv()
编程语言能够相互通信 -- 是的,您可以用 Go 编写服务器并在 Python 中编写客户端并让它们相互通信。
如果您尝试使用原始套接字进行通信,请查看您所需语言的文档并确保序列化数据在结构上匹配。
例如您可以决定一个结构并在 Python or code and then match that structure in Go 中实现您的有效负载(Go 中可能有 better/stdlib 方式;我对这种语言不是很有经验)。担心这些细节的潜在维护和实施头痛是人们使用更高级别协议的原因——这正是 ZeroMQ 的一个很好的用例。
如果您使用消息队列作为操作的 backbone,只需将其用作共享协议即可。如果您的 Python 代码可以与 ZeroMQ 通信,那么它正在正确地完成它的工作——您的 Go 代码不需要知道它正在与 Python.
通信在这种情况下,您的新 Go server would bind to ZeroMQ, your Python client would bind to ZeroMQ 和您的两种异构语言不需要相互了解。
这有点晚了,但我在尝试寻找 golang-to-python 0mq 实现时发现了这个 post。
在我的 golang 代码中,我刚刚将 zmq
更改为 zmq4
一切都对我有用:
import (
zmq4 "github.com/pebbe/zmq4"
)
func main() {
ctx, _ := zmq4.NewContext()
sock, _ := ctx.NewSocket(zmq4.REQ)
sock.Connect("tcp://localhost:57000")
sock.Send("simple message", 0)
}