Go RabbitMQ使用者性能-预取与并发
我有一个Go应用程序处理来自单个RabbitMQ队列的事件。我使用RabbitMQ客户端库 Go应用程序在约2-3秒内处理每条消息。如果我从内存中输入消息,就有可能并行处理1000条甚至更多的消息。 但不幸的是,RabbitMQ的性能更差。 所以,我想更快地使用队列中的消息 因此,问题是:如何使用Go RabbitMQ使用者性能-预取与并发,go,rabbitmq,Go,Rabbitmq,我有一个Go应用程序处理来自单个RabbitMQ队列的事件。我使用RabbitMQ客户端库 Go应用程序在约2-3秒内处理每条消息。如果我从内存中输入消息,就有可能并行处理1000条甚至更多的消息。 但不幸的是,RabbitMQ的性能更差。 所以,我想更快地使用队列中的消息 因此,问题是:如何使用github.com/streadway/amqp以最有效的方式使用消息 据我了解,有两种方法: 设置高预取 使用单消费者goroutine 示例代码: conn,err:=amqp.Dial('am
github.com/streadway/amqp
以最有效的方式使用消息
据我了解,有两种方法:
conn,err:=amqp.Dial('amqp://guest:guest@localhost:5672/“”)
FailOneError(错误,“未能连接到RabbitMQ”)
延迟连接关闭()
通道,错误:=连接通道()
FailOneError(错误,“无法打开通道”)
延迟关闭
第三章服务质量(
10000,//预取计数
0,//预取大小
false,//全局
)
msgs,err:=ch.Consume(
q、 名称,//队列
“”,//消费者
false,//没有自动确认
false,//独占
false,//没有本地
false,//没有等待
nil,//args
)
对于d:=范围msgs{
log.Printf(“收到消息:%s”,d.Body)
错误:=processMessage(d)
如果错误!=零{
log.Printf(“%s:在使用任务时”,错误)
d、 Nack(假,真)
}否则{
d、 确认(错误)
}
继续//使用其他邮件
}
但是,processMessage
会在这里并行调用吗
conn,err:=amqp.Dial('amqp://guest:guest@localhost:5672/“”)
FailOneError(错误,“未能连接到RabbitMQ”)
延迟连接关闭()
变量i=0
对于i=0;我假设每个processMessage()
都在一个新的goroutine中运行
哪种变体更好
我更喜欢第一个,因为打开/关闭通道有点贵(2+2 TCP数据包)。我认为您的OOM问题与太多的gorutine无关,gorutine非常轻,只需花费5KB左右。因此,问题可能是由您的processMessage()
引起的
我认为github.com/streadway/amqp
频道消费操作是安全的,因此,如果您只做一些消费操作,在goruntine之间共享频道是安全的。定义“更好”。我可以说,编写简单的代码比编写复杂的代码要高效得多,因为它可以节省开发人员的时间(这很昂贵)。或者说,使用大量内存实际上比闲置不用要好。除此之外,我会选择以前的代码变体并使用下游。我更新了一个问题——对我来说更好的是——代码使用更少的ram,并且它可以在同一个sime上处理更多的消息。当我尝试实现它时,扇出模式似乎不起作用,因为d
-amqp消息、ack
和nack
似乎不是线程安全的。。。