Size: a a a

2020 February 28

p

pragus in Go-go!
Vitaly
А это как?
Мне приходит пакет, в пакете есть его seqNo (uint32), я в мапу кладу структуру с ключом seqNo, а в данных - время приёма пакета и тип пакета.

Потом отдельно по таймеру взвожу мьютекс, сканирую всю мапу (раз в секунду), нахожу протухшие пакеты, создаю отдельно слайс с пакетами-автоответчиками, кладу туда автоматически созданный ответ с ошибкой "тайм-аут обработки", удаляю запись из мапы, снимаю мьютекс и закидываю все автосозданные пакеты в канал для отправки в сеть.

Если ответ приходит вовремя, то также удаляю запись из мапы.

Как тут канал поможет?
Заводишь канал inFlightTx, пишешь в него все сообщения что надо посмотреть на предмет таймаута.


Раз в секунду горутина просыпается, вычитывает весь канал и то что не expired - закидывает в канал обратно
источник

p

pragus in Go-go!
Vitaly
А это как?
Мне приходит пакет, в пакете есть его seqNo (uint32), я в мапу кладу структуру с ключом seqNo, а в данных - время приёма пакета и тип пакета.

Потом отдельно по таймеру взвожу мьютекс, сканирую всю мапу (раз в секунду), нахожу протухшие пакеты, создаю отдельно слайс с пакетами-автоответчиками, кладу туда автоматически созданный ответ с ошибкой "тайм-аут обработки", удаляю запись из мапы, снимаю мьютекс и закидываю все автосозданные пакеты в канал для отправки в сеть.

Если ответ приходит вовремя, то также удаляю запись из мапы.

Как тут канал поможет?
По факту, ты мапу не используешь по ключу примерно нигде
источник

D

DMITRY in Go-go!
x-foby
Всё нормально там подставляется.
Для начала посмотрите ошибку вот здесь:
err := rows.Scan(...)
if err != nil {
   continue
}
https://play.golang.org/p/jSbqW-5TUuu вот полный код функции,ошибок нету,но и данных нет
источник

V

Vitaly in Go-go!
pragus
Заводишь канал inFlightTx, пишешь в него все сообщения что надо посмотреть на предмет таймаута.


Раз в секунду горутина просыпается, вычитывает весь канал и то что не expired - закидывает в канал обратно
Пока не понял мысль.
У меня постоянный поток запросов.
Тогда надо либо два канала с накоплением (но тогда таймер будет не настолько точно работать, правда у меня это не особо критично) и каждый раз переключаться между ними, либо в каком-то виде нужна в канале линия задержки, но такого я в Go не видел.

Но более интересно другое - а как я пойму, был уже ответ на такой-то seq (отправил ли я его уже) или не было?

Тем более, что кроме отслеживания таймаутов я в марте держу reference number'ы - мне пришёл ответ по сети, я его должен смаппить со входящим requestID, который хранится только у меня и в сеть я его никак не могу отправить (это когда мне запрос кинули в канал, я его отправил в сеть, получил ответ из сети и в другой канал вернул ответ).
источник

V

Vitaly in Go-go!
pragus
По факту, ты мапу не используешь по ключу примерно нигде
У меня ключ в мапе нужен для обработки ответа, полученного по сети.

Т.е. основная задача мапы - трекинг запросов-ответов, хранение нужных данных, которые будут использоваться после получения ответа из сети.

А обработка таймаутов - способ чистить мапу от мусора в случае, когда по сети вовремя не ответили.
Либо когда из сети пришёл запрос, я его отдал в канал для обработки, но его никто не обработал.
источник

ВС

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

V

Vitaly in Go-go!
Владимир Столяров
Если я правильно понял, линия задержки без проблем делается на двух каналах, из одного в другой пересылать со слипом
запускать по горутине для задержки каждого отдельного сообщения?
источник

ВС

Владимир Столяров in Go-go!
А зачем, создали два канала, создали одну горутину, которая перекладывает из одного в другой. В один пишете, из другого читаете. Но тут надо будет ещё правильно закрытия отрабатывать
источник

V

Vitaly in Go-go!
Владимир Столяров
А зачем, создали два канала, создали одну горутину, которая перекладывает из одного в другой. В один пишете, из другого читаете. Но тут надо будет ещё правильно закрытия отрабатывать
Тогда не понимаю.
Мне в канал кинули одновременно 100 запросов, через 30ms ещё 100 запросов.
Запросы идут последовательно, т.е. пришедший раньше раньше и должен выйти из линии задержки.

Горутина должна вычитывать заброс, брать из него время генерации и при необходимости делать sleep?
источник

ВС

Владимир Столяров in Go-go!
Каналы это уже FIFO очереди, так что кажется, что дополнительно ничего делать не надо
источник

V

Vitaly in Go-go!
Владимир Столяров
Каналы это уже FIFO очереди, так что кажется, что дополнительно ничего делать не надо
НО без задержки.
А сейчас говорим про то, что пакет должен стать доступным для чтения после какого-то fix времени с момента закидывания сообщения в канал.
источник

x

x-foby in Go-go!
DMITRY
https://play.golang.org/p/jSbqW-5TUuu вот полный код функции,ошибок нету,но и данных нет
buildings = append(buildings)

Так вы же здесь ничего не добавляете
источник

D

DMITRY in Go-go!
млять...пиздец
источник

D

DMITRY in Go-go!
извиняюсь...
источник

D

DMITRY in Go-go!
@xfoby спасибо,уже замылился взгляд просто
источник

x

x-foby in Go-go!
DMITRY
@xfoby спасибо,уже замылился взгляд просто
Бывает)
источник

IK

Ilya Kaznacheev in Go-go!
Господа, после обновления голанда дропдаун с подсказками стал широкий как не в себя. Кто знает, это баг или фича, и можно ли как-то пофиксить/настроить?
источник

IK

Ilya Kaznacheev in Go-go!
На скриншоте он у меня вообще на соседнее окно уехал, так как одного ему мало
источник

V💊

Vladimir 💊 Voytenko in Go-go!
Ilya Kaznacheev
Господа, после обновления голанда дропдаун с подсказками стал широкий как не в себя. Кто знает, это баг или фича, и можно ли как-то пофиксить/настроить?
TabNine юзаешь?
источник

IK

Ilya Kaznacheev in Go-go!
Vladimir 💊 Voytenko
TabNine юзаешь?
Да
источник