Amqp: d.Ack Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°Π½Π°Π»

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 22 ΠΎΠΊΡ‚. 2013  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: streadway/amqp

Если я ΠΎΠ±Ρ€Π°Ρ‰Π°ΡŽΡΡŒ ΠΊ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŽ с достаточным количСством сообщСний сразу (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 10 000), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄, ΠΊΠ°Π½Π°Π» закрываСтся ΠΈ большС Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ доставки. Однако, Ссли я ΡƒΠ΄Π°Π»ΡŽ d.Ack ΠΈ просто Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽ Ρ‚Π΅Π»ΠΎ доставки, ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

func main() {
    conn, _ := amqp.Dial(*uri)

    channel, _ := conn.Channel()

    deliveries, _ := channel.Consume(
        *queue, //queue
        "",
        false,
        false,
        false,
        false,
        nil)

    for d := range deliveries {
        go func(amqp.Delivery) {
            log.Printf("got %s", d.Body)
            d.Ack(false)
        }(d)
    }
}

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π‘ΠΎΠ»ΡŒΡˆΠΎΠ΅ спасибо Π·Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ. @michaelklishin Π― ΠΎΠ±ΠΌΠ°Π½ΡƒΠ». Π― Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ понял Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Go. Π― заставил Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π²Ρ‹Π΄Π΅Π»ΠΈΠ² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ использовав Π΅Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ go. Для всСх, ΠΊΡ‚ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ‚Ρƒ ΠΆΠ΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ, я ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΠΎΡˆΠΈΠ±ΠΊΡƒ Exception (406) Reason: Β«PRECONDITION_FAILED - нСизвСстный Ρ‚Π΅Π³ доставки 24782Β».

Π’ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠΎΠ΄

func main() {
    conn, _ := amqp.Dial(*uri)

    channel, _ := conn.Channel()

    deliveries, _ := channel.Consume(
        *queue, //queue
        "",
        false,
        false,
        false,
        false,
        nil)

    for d := range deliveries {
        go doSomeWork(d)
    }
}
func doSomeWork(d amqp.Delivery){
     log.Printf("got %s", d.Body)
     d.Ack(false)
}

ВсС 3 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°ΡˆΠ° анонимная функция Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ d ΠΈΠ· ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° for. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π½Π°Π·Π²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… вашСй Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π’Π°ΠΊΠΆΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ошибки асинхронного ΠΊΠ°Π½Π°Π»Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

go func() {
  log.Fatal(<-channel.NotifyClose(make(chan *amqp.Error)))
}()

@ MattParker89 см.

Π‘ΠΎΠ»ΡŒΡˆΠΎΠ΅ спасибо Π·Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ. @michaelklishin Π― ΠΎΠ±ΠΌΠ°Π½ΡƒΠ». Π― Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ понял Π°Π½ΠΎΠ½ΠΈΠΌΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Go. Π― заставил Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π²Ρ‹Π΄Π΅Π»ΠΈΠ² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ использовав Π΅Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ go. Для всСх, ΠΊΡ‚ΠΎ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ‚Ρƒ ΠΆΠ΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ, я ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΠΎΡˆΠΈΠ±ΠΊΡƒ Exception (406) Reason: Β«PRECONDITION_FAILED - нСизвСстный Ρ‚Π΅Π³ доставки 24782Β».

Π’ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠΎΠ΄

func main() {
    conn, _ := amqp.Dial(*uri)

    channel, _ := conn.Channel()

    deliveries, _ := channel.Consume(
        *queue, //queue
        "",
        false,
        false,
        false,
        false,
        nil)

    for d := range deliveries {
        go doSomeWork(d)
    }
}
func doSomeWork(d amqp.Delivery){
     log.Printf("got %s", d.Body)
     d.Ack(false)
}
Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ