Я пытаюсь настроить потребителей для тем, которые публикуются на нашей бирже, например, API-шлюз, который публикует сообщения для одного из нескольких подписчиков.
Я не могу найти пример нескольких подписчиков, которые не просто помещаются в основную функцию одного файла.
- Могу ли я создать программу для каждого потребителя, не разрывая соединение, которое есть у каждого другого потребителя?
- Подходит ли канал внутри горутина в другом горутине?
Вот основной файл:
package main
func main() {
...
go myMessagePackage.Subscribe("example_topic1")
go myMessagePackage.Subscribe("example_topic2")
go myMessagePackage.Subscribe("example_topic3")
...
}
А вот так выглядит каждый потребитель:
package myMessagePackage
import...
func Subscribe(topic string, queueName string) {
conn, err := amqp.Dial(getConnectionString())
failOnError(err, "API Consumer failed to connect to RabbitMQ")
defer conn.Close()
ch, err := conn.Channel()
failOnError(err, "API Consumer failed to open a channel")
defer ch.Close()
err = ch.ExchangeDeclare(
env.RabbitMq_Exchange_Name,
env.RabbitMq_Exchange_Type,
true,
false,
false,
false,
nil,
)
failOnError(err, "API Consumer failed to declare an exchange")
q, err := ch.QueueDeclare(
queueName,
true,
false,
false,
false,
nil,
)
failOnError(err, "API Consumer failed to declare a queue")
err = ch.QueueBind(
q.Name,
topic,
env.RabbitMq_Exchange_Name,
false,
nil)
failOnError(err, "API Consumer failed to bind a queue")
msgs, err := ch.Consume(
q.Name,
"",
true,
false,
false,
false,
nil,
)
failOnError(err, "API Consumer failed to register a consumer")
forever := make(chan bool)
go func() {
for d := range msgs {
log.Printf("API Consumer received a message from backend: %s", d.Body)
routeResponse(d.Body)
}
}()
log.Printf("API Consumer on topic %s started. Waiting for messages.", topic)
<-forever
}