Go ZeroMQ中的发布/订阅模式不工作
我正在尝试使用ZeroMQ实现一个非常基本的Go ZeroMQ中的发布/订阅模式不工作,go,zeromq,distributed-system,distributed-systems,Go,Zeromq,Distributed System,Distributed Systems,我正在尝试使用ZeroMQ实现一个非常基本的PUB/SUB模式。我希望有一个服务器(始终处于活动状态)向所有客户端广播消息(发布者),而不关心连接的客户端。 如果客户端以订阅者身份连接到此服务器,则应接收消息 但是,我无法使用PUB/SUB发送消息 在Python中,它将是: # publisher (server.py) import zmq ctx = zmq.Context() publisher = ctx.socket(zmq.PUB) publisher.bind('tcp://1
PUB/SUB
模式。我希望有一个服务器(始终处于活动状态)向所有客户端广播消息(发布者),而不关心连接的客户端。
如果客户端以订阅者身份连接到此服务器,则应接收消息
但是,我无法使用PUB/SUB
发送消息
在Python中,它将是:
# publisher (server.py)
import zmq
ctx = zmq.Context()
publisher = ctx.socket(zmq.PUB)
publisher.bind('tcp://127.0.0.1:9091')
while True:
publisher.send_string("test")
及
或在戈兰:
package main
import (
"github.com/pebbe/zmq4"
"log"
"time"
)
func Listen(subscriber *zmq4.Socket) {
for {
s, err := subscriber.Recv(0)
if err != nil {
log.Println(err)
continue
}
log.Println("rec", s)
}
}
func main() {
publisher, _ := zmq4.NewSocket(zmq4.PUB)
defer publisher.Close()
publisher.Bind("tcp://*:9090")
subscriber, _ := zmq4.NewSocket(zmq4.SUB)
defer subscriber.Close()
subscriber.Connect("tcp://127.0.0.1:9090")
go Listen(subscriber)
for _ = range time.Tick(time.Second) {
publisher.Send("test", 0)
log.Println("send", "test")
}
}
我是否误解了这种模式,或者在连接时是否需要从客户端向服务器发送特定的信号。我对golang版本感兴趣,只使用python版本进行测试。我是否误解了这种模式?是的,幸运的是你做到了。
ZeroMQ原型的定义是为了表示某种行为。如前所述,PUSH
-archetype AccessPoint“通过”到目前为止设置的所有通信通道推送每条消息,PULL
-er AccessPoint将任何已经到达的消息拉到“它的手上”PUB
-lisher AccessPoint发布,SUB
-scriber AccessPoint订阅,以便只接收与主题过滤器匹配的消息,而不接收任何其他消息
显然,这种原型“规范”有助于构建ZeroMQ智能消息传递/信令基础架构,以便于在体系结构中使用
在执行任何调试步骤之前,必须检查错误。我自己也没有用过zmq,不过,绑定的调用,从这里看地址很难闻。我可能错了,检查错误应该会提供线索。@mh cbon不,先生,
PUB
-端的.Bind()
绝对不是问题。在订阅管理(主要问题)和避免无限死锁(在所有套接字上使用.SetLinger(0)
方法)方面,魔鬼就在细节上,在任何紧急情况或故意执行延迟*.Close()时实例化(所有v.4.2+API IIRC之前版本都必须)
非常感谢!这是我第一次开始了解这个问题和可能的解决方案。欢迎您,很高兴您能得到帮助。顺便说一句,关于Deblurring等的文章很棒。谢谢,您的回答确实有助于缓解nvidia smi的群集版本。如果您关注性能和超低延迟,请注意许多问题(确实是深入的)性能驱动的套接字选项调整变得必不可少。扩展是另一个可能对性能和吞吐量造成“攻击”的维度。一个人可能会成长为约64个GPU超收敛HPC群集,因此值得了解。请在适当的时候毫不犹豫地提高这些点(如果要达到超低延迟,设计必须遵循一定的标准)。无论如何,祝你好运,请继续关注!
package main
import (
"github.com/pebbe/zmq4"
"log"
"time"
)
func Listen(subscriber *zmq4.Socket) {
for {
s, err := subscriber.Recv(0)
if err != nil {
log.Println(err)
continue
}
log.Println("rec", s)
}
}
func main() {
publisher, _ := zmq4.NewSocket(zmq4.PUB)
defer publisher.Close()
publisher.Bind("tcp://*:9090")
subscriber, _ := zmq4.NewSocket(zmq4.SUB)
defer subscriber.Close()
subscriber.Connect("tcp://127.0.0.1:9090")
go Listen(subscriber)
for _ = range time.Tick(time.Second) {
publisher.Send("test", 0)
log.Println("send", "test")
}
}
# subscriber (client.py)
import zmq
ctx = zmq.Context()
subscriber = ctx.socket( zmq.SUB )
subscriber.connect( 'tcp://127.0.0.1:9091' )
subscriber.setsockopt( zmq.LINGER, 0 ) # ALWAYS:
subscriber.setsockopt( zmq.SUBSCRIBE, "" ) # OTHERWISE NOTHING DELIVERED
while True:
msg = subscriber.recv_string() # MAY USE .poll() + zmq.NOBLOCK
print msg
subscriber, _ := zmq4.NewSocket( zmq4.SUB )
subscriber.Connect( "tcp://127.0.0.1:9090" )
subscriber.SetSubscribe( filter ) // SET: <topic-filter>
subscriber.SetLinger( 0 ) // SAFETY FIRST: PREVENT DEADLOCK
defer subscriber.Close() // NOW MAY SAFELY SET:
...
msg, _ := subscriber.Recv( 0 )
package main
import (
"github.com/pebbe/zmq4"
"log"
"time"
)
func Listen(subscriber *zmq4.Socket) {
for {
s, err := subscriber.Recv(0)
if err != nil {
log.Println(err)
continue
}
log.Println("rec", s)
}
}
func main() {
publisher, _ := zmq4.NewSocket(zmq4.PUB)
publisher.SetLinger(0)
defer publisher.Close()
publisher.Bind("tcp://127.0.0.1:9092")
subscriber, _ := zmq4.NewSocket(zmq4.SUB)
subscriber.SetLinger(0)
defer subscriber.Close()
subscriber.Connect("tcp://127.0.0.1:9092")
subscriber.SetSubscribe("")
go Listen(subscriber)
for _ = range time.Tick(time.Second) {
publisher.Send("test", 0)
log.Println("send", "test")
}
}