猿问

一个连接可以支持rabbitmq的go api中的多个通道吗?

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之间只有一个连接,


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


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


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


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

手工模型:

rabbitmq中的真实模型:

http://img4.mukewang.com/6123535500011ff607490142.jpg

杨魅力
浏览 235回答 1
1回答
随时随地看视频慕课网APP

相关分类

Go
我要回答