我实际上正在关注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 /通道,还是应该创建专用功能。
答案 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?