用不同语言编写的ZeroMQ套接字的兼容性

时间:2016-03-10 14:00:25

标签: python go zeromq

我已经基于 ZeroMQ 构建了一个用python编写的应用程序,但现在我面临性能问题。所以我决定使用Golang重写我的应用程序的一些模块。但是当我尝试在不同语言实现的套接字之间建立消息传递时,任何事情都不起作用。

到目前为止我已经搜索过,但是我没有找到任何关于兼容性问题的信息使用不同语言的ZeroMQ

所以问题是:我可以使用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()

2 个答案:

答案 0 :(得分:3)

编程语言能够相互通信 - 是的,你可以用Go编写服务器,用Python编写客户端,让它们相互通信。

如果您尝试使用原始套接字进行通信,请查看所需语言的文档,并确保序列化数据的结构匹配。

e.g。您可以决定结构并在Python或代码中实现您的有效负载,然后在Go中匹配该结构(在Go中可能有更好的/ stdlib方式;我对这种语言不是很有经验)。担心这些细节的潜在维护和实施令人担忧的是人们使用更高级别的协议 - 这对ZeroMQ来说是一个很好的用例。

如果您使用消息队列作为操作的主干,只需将其用作共享协议即可。如果您的Python代码可以与ZeroMQ对话,那么它正确地完成了它的工作 - 您的Go代码不需要知道它与Python对话。

在这种情况下,您的新Go server would bind to ZeroMQ,您的Python client would bind to ZeroMQ以及您的两种异类语言无需彼此了解。

答案 1 :(得分:1)

这有点晚了,但是当我试图找到一个golang-to-python 0mq实现时,我发现了这篇文章。

在我的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)
}