使用Streadway库处理多个队列的通用方法

时间:2019-01-11 10:22:56

标签: go rabbitmq amqp goroutine

我正在处理来自多个RabbitMQ队列(5至10)的数千条消息,并将处理后的消息批量推送到ELK中。

使用streadway / amqp库处理n队列的最佳通用方法是什么?

amqp.Connectionamqp.Channelamqp.Consume r来说,每个goroutine应该包含什么。

我主要看到3种设计:

A)1个连接-1个频道-n个消费者

B)1个连接-n个通道-1个使用者

C)n连接-1个频道-1个消费者

A)对我不起作用:

Failed to register a consumer: Exception (504) Reason: "channel/connection is not open"

然后,每个goroutine将缓冲x消息,并独立于其他消息向ELK发出BatchRequest。

就目前而言,即使我必须处理服务器的大量内存消耗,每个队列(C)发起1个连接似乎也可以正常工作。这真的是最有效的设计吗?我应该为每个处理5至10个频道的工人保持1个连接吗?

这里是(C),每个队列一个连接。

func main() {
    queues := []string{"q1", "q2", "q3", "q4"}

    forever := make(chan bool)
    for _, queue := range queues {
        go processQueue(queue)
    }
    <-forever
}

func processQueue(name string) {
    conn, _ := amqp.Dial("amqp://guest:guest@localhost:5672/")
    defer conn.Close()

    ch, _ := conn.Channel()
    defer ch.Close()

    msgs, _ := ch.Consume(name, "test-dev", false, false, false, false, nil)
    go func() {
        for d := range msgs {
            log.Printf("[%s] %s", name, d.RoutingKey)
            d.Ack(true)
        }
    }()
}

0 个答案:

没有答案