我正在处理来自多个RabbitMQ队列(5至10)的数千条消息,并将处理后的消息批量推送到ELK中。
使用streadway / amqp库处理n
队列的最佳通用方法是什么?
用amqp.Connection
,amqp.Channel
和amqp.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)
}
}()
}