Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go RabbitMQ使用者性能-预取与并发_Go_Rabbitmq - Fatal编程技术网

Go 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

我有一个Go应用程序处理来自单个RabbitMQ队列的事件。我使用RabbitMQ客户端库

Go应用程序在约2-3秒内处理每条消息。如果我从内存中输入消息,就有可能并行处理1000条甚至更多的消息。 但不幸的是,RabbitMQ的性能更差。 所以,我想更快地使用队列中的消息

因此,问题是:如何使用
github.com/streadway/amqp
以最有效的方式使用消息

据我了解,有两种方法:

  • 设置高预取

    使用单消费者goroutine

    示例代码:

  • 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
    似乎不是线程安全的。。。