以发布者身份连接到RabbitMQ的频率

时间:2018-07-12 08:55:14

标签: go rabbitmq amqp

我实际上正在关注RabbitMQ的教程。我希望我的应用程序的微服务能够通过RabbitMQ进行通信。

我创建了一个发布者库,每次我想从microservice_a向microservice_b发送消息时都使用它。像这样:

sender.go:

// SendEmail ...
func (s *MessageQueue) SendEmail(body string) {
    conn, err := amqp.Dial(fmt.Sprintf("amqp://%s:%s@%s:%d", s.Username, s.Password, s.Host, s.Port))
    failOnError(err, "Failed to connect to RabbitMQ")
    defer conn.Close()

    ch, err := conn.Channel()
    failOnError(err, "Failed to open a channel")
    defer ch.Close()

    q, err := ch.QueueDeclare(
        s.QueueName, // name
        true,        // durable
        false,       // delete when unused
        false,       // exclusive
        false,       // no-wait
        nil,         // arguments
    )
    failOnError(err, "Failed to declare a queue")

    err = ch.Publish(
        "",     // exchange
        q.Name, // routing key
        false,  // mandatory
        false,  // immediate
        amqp.Publishing{
            ContentType: "text/plain",
            Body:        []byte(body),
        })
    log.Info(" [x] Sender sent: %s", body)
    failOnError(err, "Failed to publish a message")
}

我只是想知道在发布者的情况下,是否最好像现在每次发送一条消息时拨打RabbitMQ并关闭RabbitMQ /通道,还是应该创建专用功能。

1 个答案:

答案 0 :(得分:0)

RabbitMq连接非常昂贵。您实际上应该只为每个实例创建一个。

即使对于渠道,我也不建议每次发送消息时都创建一个。我建议运行一个专用线程(goroutine)进行发布,并从chan中使用。然后,当需要发布时,您的主要逻辑便可以推送到频道。

您可以执行的另一种方法是,每个线程有一个通道,以处理该线程上需要执行的任何Rabbitmq操作。

当然,如果发布者是单线程的,最简单的方法是保留所有函数都可以使用的全局Connection和Channel变量。

也请查看以下答案:

Should I close the channel/connection after every publish?

Whether to create connection every time when amqp.Dial is threadsafe or not in go lang

Is there a performance difference between pooling connections or channels in rabbitmq?