gpt4 book ai didi

asynchronous - 戈朗 ZeroMQ : REQ/REP senseless non-blocking

转载 作者:IT王子 更新时间:2023-10-29 01:41:52 26 4
gpt4 key购买 nike

在 Python 上,ZeroMQ .recv()/.send() 操作是阻塞的,这对于 REQ/REP.
在 Golang 中,我必须将 zmq.DONTWAIT 传递给 .recv() 并且.send() 操作以使其工作。

但问题是,流程需要锁步,所以:

  1. server.recv()
  2. client.send()
  3. client.recv()
  4. server.send()

在 3 到 4 之间,奇怪的事情开始了,因为它们是异步的。

当客户端发送了一条消息,而服务器还没有收到消息,但客户端试图接收响应时,锁步就不再是锁步了。

是否有某种 zmq.DOBLOCKzmq.DONTWAIT 不同?

还是我弄错了什么?


编辑:

我在 C 中为 zeromq 使用这个 go 绑定(bind):https://godoc.org/github.com/pebbe/zmq4#Type

正如您在这里看到的,.recv() 需要一个输入 flag,这是第二个 ref 中的两者之一:

接收:https://godoc.org/github.com/pebbe/zmq4#Socket.Recv

要传递的标志:https://github.com/pebbe/zmq4/blob/master/zmq4.go#L403

这是我用来解决问题的当前代码,感觉有点难看:

package connection

import (
"zmq4"
"fmt"
"time"
)


const ERRTMPUNAV="resource temporarily unavailable"


func checkError(e error){
if e != nil {
panic(e)
}
}


func CreateRepNode(address string,onMessage chan<- string,send <-chan string,closeConn <-chan bool){
stop:=false
socket,err:=zmq4.NewSocket(zmq4.REP)
checkError(err)
err=socket.Bind(address)
checkError(err)
go func(socket *zmq4.Socket){
for {
msg,err:=socket.Recv(zmq4.DONTWAIT)
fmt.Println("server message"+msg)
if stop==true {
return
}
if err != nil {
rateLimit := time.Tick(100 * time.Millisecond)
<-rateLimit
continue
}
checkError(err)
onMessage<-msg
rep:=<-send
_,err=socket.Send(rep,zmq4.DONTWAIT)
}
}(socket)
<-closeConn
stop=true
}


func CreateReqNode(address string,onMessage chan<- string,send <-chan string,closeConn <-chan bool){
stop:=false
socket,err:=zmq4.NewSocket(zmq4.REQ)
checkError(err)
err=socket.Connect(address)
checkError(err)
go func(){
for {
msg:=<-send
if stop==true {
return
}
_,err:=socket.Send(msg,zmq4.DONTWAIT)
for {
msg,err=socket.Recv(zmq4.DONTWAIT)
fmt.Println("client got message "+msg)
if err!=nil {
if err.Error()==ERRTMPUNAV {
w:=time.Tick(100*time.Millisecond)
<-w
continue
}
}
break
}
onMessage<-msg
}
}()

<-closeConn
stop=true
}

最佳答案

ZeroMQ 琐碎的基本原型(prototype)与其说是满足任何需求的生产级解决方案,不如说是一组构建 block

Go-lang 是一种非常强大的现代语言,带有协程和其他用于控制并发的智能工具,因此请原谅我列出以下建议:

  • 尽可能避免阻塞式设计(非阻塞式设计让人们可以完全控制所有出现的事物......不会“卡在任何地方” 无限/无法控制的等待循环,在已经形成的死锁中更糟)

  • 避免依赖 SLOC 示例和单一、基本类型的正式通信模式,人们应该为所有的稳健的生存能力处理策略可能出现问题的情况(传输网络中的信号丢失、消息丢失、DDoS 级别的资源过载……)


重新设计提示 - 根本不要使用 REQ/REP。是的,从来没有...

ZeroMQ 可扩展正式通信模式 REQ/REP 适合学习 ZeroMQ,但在实际生产级部署中是致命的。 For details, read here .

接下来考虑内部无条件模式,例如 PAIR(尽管标记为实验性,但对于某些用例来说效果很好),XREQ/XREPPUSH/PULL 或一些复合信令/传输多套接字定制设计自己的模式。

最好的下一步是什么?

What I can do for your further questions right now is to direct you to see a bigger picture on this subject有更多的论点,一个简单的信号平面/消息平面插图和一个指向 Pieter HINTJENS 必读书籍的直接链接。

这本书值得花时间和精力。如果一个人对分布式系统设计很认真,那么您会爱上它以及 Pieter 对零共享、零阻塞、(几乎)零复制等的热情。

关于asynchronous - 戈朗 ZeroMQ : REQ/REP senseless non-blocking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40422572/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com