我正在尝试在awsvpc模式下在Fargate上运行的ECS中使用ZeroMQ。我有2个不同的服务,每个服务都运行自己的任务并启用了服务发现。
我在称为代理的微服务中创建路由器和经销商。
front, _ := zmq.NewSocket(zmq.ROUTER)
defer front.Close()
front.Bind("tcp://*:4070")
back, _ := zmq.NewSocket(zmq.DEALER)
defer back.Close()
back.Bind("tcp://*:4080")
然后,我将这两个套接字添加到轮询器,并具有一个for循环,用于等待消息。
我有一个单独的微服务,该微服务连接到套接字并尝试向经销商发送消息。我已经设置了服务发现,所以我假设我连接的地址为:
“ tcp:// broker:4070”
下面是来自“ serviceA”的代码
func New(ZMQ models.ZMQ) *Requester {
s, err := zmq.NewSocket(zmq.REQ)
if err != nil {
log.Fatalln("shareholder/requester zmq.NewSocket", err)
}
p := zmq.NewPoller()
p.Add(s, zmq.POLLIN)
log.Println("Requester", ZMQ.Req)
err = s.Connect("tcp://broker:4070")
if err != nil {
log.Print(fmt.Errorf("err is %w", err))
}
req := &Requester{
Poller: p,
Retries: 2,
Socket: s,
Timeout: time.Duration(time.Minute),
}
runtime.SetFinalizer(req, (*Requester).Close)
return req
}
然后我使用上面的代码通过套接字连接发送消息
_, err := r.Socket.SendMessage(req)
但是,我的经纪人服务从未收到我的消息。我可以使用在服务发现期间注册的主机名在网络上访问我的REST API,在此缺少Fargate / ECS / ZeroMQ吗?
我将我的想法描述为答案,我相信我们可以解决您的问题。
所以我认为这是您的设置。
服务A
nginx
通过backend
呼叫backend:9000
backend
通过nginx
呼叫nginx:80
服务A到B
nginx
无法通过broker1:4070
致电Broker1nginx
和backend
都无法调用broker1
或broker2
。如果容器运行在不同的服务中,并且每个服务都有自己的awsvpc
,则不能仅通过指定name:port来调用它们。
您需要从A到B的连接跨服务,这意味着您需要适当的服务发现。