Size: a a a

2021 June 01

АК

Александр Костюченко... in Go-go!
чего еще вы для примера не запихнули?) мб весь скинете? на playground например)
а то угадайка из меня так себе, а коллеги так вообще не играют в такое))
источник

ЯК

Ярослав Коробейников... in Go-go!
дефер разве внутри бесконечного цикла выполняется? Щас чекну
источник

ЯК

Ярослав Коробейников... in Go-go!
Ага, не выполяется ;D
Естественно тогда работает всё так как ch.Close() никогда не вызовется ;DDDDDD
источник

ЯК

Ярослав Коробейников... in Go-go!
источник

ЯК

Ярослав Коробейников... in Go-go!
Если воркер не взял сообщения и просто ждал, и я перезагружаю реббит, то ch.Close() не зависает, просто выдает ошибку что уже закрыто или ещё что.

Если я отправляю сообещния в очередь, и как только воркер его получил, перезгружаю реббит, то воркер зависает на моменте ch.Close()

https://play.golang.org/p/9_1W67fonOg

Причём зависает намертво и после того как реббит поднялся не реконектиться к нему как надо потому что как бы цикл встал на моменте с ch.Close() и всё
источник

ЯК

Ярослав Коробейников... in Go-go!
https://play.golang.org/p/m2n_2Gx5Kag

Тобишь d.Ack(false) вернул ошибку, цикл прервался и ниже по коду ch.Close() намертво стоит

worker-3      | 2021/06/01 07:51:55 Error while ACK. Error: Exception (504) Reason: "channel/connection is not open". Body: Hello World! 2
worker-1      | 2021/06/01 07:51:55 Error while ACK. Error: Exception (504) Reason: "channel/connection is not open". Body: Hello World! 1
worker-2      | 2021/06/01 07:51:55 Error while ACK. Error: Exception (504) Reason: "channel/connection is not open". Body: Hello World! 0
worker-1      | 2021/06/01 07:51:56 After break readMessagesLoop!
worker-3      | 2021/06/01 07:51:56 After break readMessagesLoop!
worker-3      | 2021/06/01 07:51:56 [main] conn.Close Error: Exception (504) Reason: "channel/connection is not open"
worker-1      | 2021/06/01 07:51:56 [main] conn.Close Error: Exception (504) Reason: "channel/connection is not open"
worker-2      | 2021/06/01 07:51:56 After break readMessagesLoop!
worker-2      | 2021/06/01 07:51:56 [main] conn.Close Error: Exception (504) Reason: "channel/connection is not open"

И всё) Висит на if err := ch.Close(); err != nil ;DDD
источник

தஒ

தமிழர்களாக ஒன்றுபடுவ... in Go-go!
Joo
источник

АК

Александр Костюченко... in Go-go!
_, ok := <-ch:
  if ok {
      ch.Close()
  }
источник

ЯК

Ярослав Коробейников... in Go-go!
Чувак, ch это не канал как в golang это структура из amqp либы
источник

АК

Александр Костюченко... in Go-go!
😩
источник

ЯК

Ярослав Коробейников... in Go-go!
func (ch *Channel) Close() error {
 defer ch.connection.closeChannel(ch, nil)
 return ch.call(
   &channelClose{ReplyCode: replySuccess},
   &channelCloseOk{},
 )
}
источник

ВС

Владимир Столяров... in Go-go!
по-моему если ошибка пришла, канал и соединение закрывать не надо, они уже закрылись
внутри Close в обоих случаях есть отправка запроса и ожидание ответа
источник

ЯК

Ярослав Коробейников... in Go-go!
Да! Это  я понимаю что сейчас глупо закрывать соединение и канал если они по факту и так прервались)

Тем более скажи что ошибка в виде зависание при попытке закрыть это такое себе?)

Просто я думаю о дальнейшей обработке, допустим я взял сообещние хочу в бд записать, какая-т ошибка на запис в бд, я хочу прервать луп, закрыть аккуратно каналы и типа всё по новой, и в теори поскольку ошибка с бд это не ошибка с реббит, конекнш должен красиво закрыться и этого зависания бы не было, НО!

Что если, у меня ошибка с бд, я прерываю луп, в этот момент падает реббит, и получается ch.Close() опять намертво повиснет?
источник

ЯК

Ярослав Коробейников... in Go-go!
Видимо реально лучше тогда панику выкидывать и оттдать на откуп докеру перезаггрузку, раз такой бред может случиться с тем что выполнение зависнет при попытке закрытия ;DDDD
источник

ЯК

Ярослав Коробейников... in Go-go!
Надо им ищью написать что ли.....
Чтобы хотя бы какой-нибудь контекст с таймаутом можно было бы прокинуть
источник

ВС

Владимир Столяров... in Go-go!
можно попробовать взять https://github.com/sbabiv/rmqconn или https://github.com/rafaeljesus/rabbus
источник

ЯК

Ярослав Коробейников... in Go-go!
Можно, но интересно почему вдруг базовая библиотека себя так ведёт неприлично)
источник

ЯК

Ярослав Коробейников... in Go-go!
Будет время, попробую эти либы в таких же условиях/моментах потестить, может они под капотом базовый фнукционал всё-таки вызывают же)
источник

DS

Dmitry Soloma in Go-go!
вроде проблем в базовой реализации не наблюдал. как вариант могу предложить
https://github.com/dimonrus/gorabbit
на основе базовой. Доки к сожалению нет, но есть тест с отравкой и получением 1кк сообщений, есть коннекшон пул
источник

ЯК

Ярослав Коробейников... in Go-go!
Как вариант можно перед закрытием всякого делать проверку

if !conn.IsClosed() {
     if err := ch.Close(); err != nil {
       log.Printf("[main] ch.Close Error: %v", err)
     }

     if err := conn.Close(); err != nil {
       log.Printf("[main] conn.Close Error: %v", err)
     }

   }
источник