Могут ли несколько goroutines иметь подключения к одной и той же бирже rabbitmq одновременно без общего доступа? - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь настроить потребителей для тем, которые публикуются на нашей бирже, например, API-шлюз, который публикует сообщения для одного из нескольких подписчиков.

Я не могу найти пример нескольких подписчиков, которые не просто помещаются в основную функцию одного файла.

  1. Могу ли я создать программу для каждого потребителя, не разрывая соединение, которое есть у каждого другого потребителя?
  2. Подходит ли канал внутри горутина в другом горутине?

Вот основной файл:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...