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 рдореИрдВ рдбрдмрд▓-рдПрдХрд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВрдиреЗ рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЧрд▓рдд рд╕рдордЭрд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддреЛрдбрд╝рдХрд░ рдФрд░ рдЧреЛ рд░реВрдЯреАрди рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдо рдХрд┐рдпрд╛ред рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╡рд╣реА рдЧрд▓рддреА рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рдорд┐рд▓реА рддреНрд░реБрдЯрд┐ рдЕрдкрд╡рд╛рдж (406) рдХрд╛рд░рдг рдереА: "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 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЖрдкрдХрд╛ рдЕрдирд╛рдо func for рдХрдерди рд╕реЗ d рд╕реЗ рдЕрдзрд┐рдХ рдмрдВрдж рд╣реЛ рд░рд╣рд╛ рд╣реИред рдкрд░рдо рдХреЛ рдЕрдкрдиреЗ func рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдирд╛рдо рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

рд╕рд╛рде рд╣реА рдЖрдк рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЪреИрдирд▓ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ:

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

@ MattParker89 RabbitMQ рд▓реЙрдЧ рджреЗрдЦреЗрдВ, рдЗрд╕рдореЗрдВ рдПрдХ рдЪреИрдирд▓ рдЕрдкрд╡рд╛рдж рд╣реЛрдЧрд╛ред рдЖрдк рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдбрдмрд▓-рдПрдХрд┐рдВрдЧ рдбрд┐рд▓реАрд╡рд░реА рд╣реИрдВред

рдорджрдж рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред @michaelklishin рдореИрдВ рдбрдмрд▓-рдПрдХрд┐рдВрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореИрдВрдиреЗ рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЧрд▓рдд рд╕рдордЭрд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддреЛрдбрд╝рдХрд░ рдФрд░ рдЧреЛ рд░реВрдЯреАрди рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдо рдХрд┐рдпрд╛ред рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╡рд╣реА рдЧрд▓рддреА рдХрд░рддрд╛ рд╣реИ, рдореБрдЭреЗ рдорд┐рд▓реА рддреНрд░реБрдЯрд┐ рдЕрдкрд╡рд╛рдж (406) рдХрд╛рд░рдг рдереА: "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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

pierrre picture pierrre  ┬╖  22рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

michaeljs1990 picture michaeljs1990  ┬╖  11рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kamal-github picture kamal-github  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

cenkalti picture cenkalti  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

pnuz3n picture pnuz3n  ┬╖  17рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ