ZeroMQ知道一个请求来自哪个Go例程。

4
我正在尝试确定是否有两个例程调用相同的ZeroMQ套接字,如果从routine1的socket.recv()返回,则套接字将知道返回到routine1(routine2、... routinen同样)。因此......使用具有请求/响应语义的消息总线,在go中处理这个最好的模式是什么? 如果有帮助的话,请考虑简单海盗模式,并使用zeromq在该模式中实现RPC样式调用集。
Socket; //zeromq socket
//routine 1
socket.send(data) // do i need some identifier here for this routine?
socket.recv() // wait until i get a response from that send
//routine 2 
socket.send(data)
socket.recv()

在这种情况下,我不知道 routine1 或 routine2 的响应会先返回。我该如何确保当我收到 socket 的响应时,能够通知正确的接收函数。

谢谢!


请提供更多的代码,或者至少提供一个更完整的示例。您打算在一个线程还是多个线程中执行此操作?您在这个(客户端?)端和您正在通信的对等端上使用哪些套接字类型?您是如何连接/绑定的?在您的代码/数据中,什么区分一个“例程”和另一个“例程”?根据这些问题的答案,可能有许多可能的解决方案。 - Jason
我对ZeroMQ完全没有经验或知识,但在过去,当我有多个goroutine在共享的websocket上进行请求时,我有一个中央goroutine,实际上是将请求写入和响应读取的函数。该函数具有输入通道({请求,响应通道}),一个突出显示的请求ID映射(按顺序生成)并且只使用该映射来查找适当的通道以发送响应正文(或记录并删除它,如果没有映射条目)。 - Dave C
我对Go语言完全没有经验和知识,所以我们可以一起学习 :). 如果你还没有阅读过指南,我强烈建议你这样做,文档中有各种各样的Go示例(每当你看到一个代码示例时,都会有一个链接到许多不同语言版本的链接,快速浏览一下,似乎大部分都有Go变体)。你可能会看到你想要做的事情,并看到它被完成的示例。 - Jason
1个回答

2

我不相信使用zeromq可以在线程之间共享套接字。

可能需要创建一些goroutine来监听请求、发送/接收zmq,然后进行回复。

例如:(未经测试的代码)

type Req struct {
   Data []byte 
   Reply chan []byte
}

go func() { // probably not the zmq api, but you should get the idea here
    for req := <- requests {
         socket.send(req.Data)
         req.Reply <- socket.recv() 
    }
}

另一个选项是拥有一个用于发送的套接字和一个用于接收的套接字。一个是REP,另一个是REQ。将它们放在不同的程序中来处理数据。 - user3554230

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接