gpt4 book ai didi

go - 一个连接可以支持 go api for rabbitmq 中的多个 channel 吗?

转载 作者:IT王子 更新时间:2023-10-29 00:42:23 28 4
gpt4 key购买 nike

package main

import (
"fmt"
"github.com/streadway/amqp"
"time"
)

// Every connection should declare the topology they expect
func setup(url, queue string) (*amqp.Connection, *amqp.Channel, error) {
//setup connection
conn, err := amqp.Dial(url)
if err != nil {
return nil, nil, err
}
//build channel in the connection
ch, err := conn.Channel()
if err != nil {
return nil, nil, err
}
//queue declare
if _, err := ch.QueueDeclare(queue, false, true, false, false, nil); err != nil {
return nil, nil, err
}

return conn, ch, nil
}

func main() {
//amqp url
url := "amqp://guest:guest@127.0.0.1:5672";
for i := 1; i <= 2; i++ {
fmt.Println("connect ", i)
//two goroutine
go func() {
//queue name
queue := fmt.Sprintf("example.reconnect.%d", i)
//setup channel in the tcp connection
_, pub, err := setup(url, queue)
if err != nil {
fmt.Println("err publisher setup:", err)
return
}
// Purge the queue from the publisher side to establish initial state
if _, err := pub.QueuePurge(queue, false); err != nil {
fmt.Println("err purge:", err)
return
}
//publish msg
if err := pub.Publish("", queue, false, false, amqp.Publishing{
Body: []byte(fmt.Sprintf("%d", i)),
}); err != nil {
fmt.Println("err publish:", err)
return
}
//keep running
for{
time.Sleep(time.Second * 20)
}
}()
}
//keep running
for {
time.Sleep(time.Second * 20)
}
}

我以为程序和mq-server之间只有一个连接,

但是有两个连接,一个连接只能支持一个 channel ,为什么?

两个goroutine不能共享同一个tcp连接吗?

套接字描述符理论上可以在一个进程的所有线程中共享。

为什么两个goroutine不共享一个socket而是有自己的channel?

手工模型:

model1

rabbitmq中的真实模型: model2

最佳答案

查看 source for the library看起来您可以随意调用 conn.Channel() 多次,并且它会在同一连接上创建新的通信流。

好的,我试过了,这是一个工作示例...一个 goroutine,一个连接,两个 channel 我设置接收器,然后发送消息,然后从接收器 channel 读取

如果你想在一个 goroutine 中绑定(bind)多个队列,你可以调用 rec.Consume 两次,然后跨队列进行选择。

package main

import (
"fmt"
"github.com/streadway/amqp"
"os"
)

func main() {
conn, err := amqp.Dial("amqp://localhost")
e(err)
defer conn.Close()
fmt.Println("Connected")
rec, err := conn.Channel()
e(err)

fmt.Println("Setup receiver")
rq, err := rec.QueueDeclare("go-test", false, false, false, false, nil)
e(err)
msgs, err := rec.Consume(rq.Name, "", true, false, false, false, nil)
e(err)

fmt.Println("Setup sender")
send, err := conn.Channel()
e(err)
sq, err := send.QueueDeclare("go-test", false, false, false, false, nil)
e(err)

fmt.Println("Send message")
err = send.Publish("", sq.Name, false, false, amqp.Publishing{
ContentType: "text/plain",
Body: []byte("This is a test"),
})
e(err)

msg := <-msgs
fmt.Println("Received from:", rq, "msg:", string(msg.Body))
}

func e(err error) {
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}

我的盒子上的输出:

$ go run rmq.go 
Connected
Setup receiver
Setup sender
Send message
Received from: {go-test 0 0} msg: This is a test

关于go - 一个连接可以支持 go api for rabbitmq 中的多个 channel 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26314061/

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