170 похожих чатов

Добрый день, есть сотни воркеров и тысячи (скажем 100 тыс)

задач которые нужно выполнить. Сейчас задачи складывают в очередь и воркеры их выполняют.

Очередь реализована как

lim = semaphore.NewWeighted(int64(workers))

--- // код воркера // ----
lim.Acquire(task.ctx, 1)
тут код воркера , а потом релиз семафора.

контекст задачи - это task.ctx = context.WithTimeout(.....)
----

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

можно реализовать на каналах, но тогда не будет работать контекст.

Какую либу можно посмотреть чтобы и FIFO было и контексты работали?

26 ответов

9 просмотров

А чем канал не подходит?

Nekto- Автор вопроса
Roman Timofeev
А чем канал не подходит?

запульнул я в канал 100 тыс задач, у каждой из них разный таймаут выполнения. например задача с индексом 50000 протухла по таймауту, мне нужно об этом узнать как можно скорее. А как это сделать в случае с каналами? ведь пока 49999 задач впереди нее не обработаются (предположим у них огромный таймаут), я об этом не узнаю

Nekto- Автор вопроса

можно пояснить? не улавливаю мысль, точнее как это поможет узнать что задача протухла?

Nekto
можно пояснить? не улавливаю мысль, точнее как это...

Ничем. Проблема в том, что у вас задачи протухают. И этот факт должен отслеживать продьюсер этих задач

Nekto- Автор вопроса
Roman Timofeev
Ничем. Проблема в том, что у вас задачи протухают....

поясните пожалуйста. Вот прилетел http запрос с заданиями. У каждого задания свой таймаут. Все задания добавились в очередь (как я выше описал), http запрос завершился. задачи выполняются и по результату записывают данные в мемкеш. в случае если задача отвалилась по таймауту в мемкеш тоже пишется информация об этом. Кто тут должен отслеживать?

Nekto- Автор вопроса
Roman Timofeev
мемкеш 😳

что-то вы странное говорите или я вас не понимаю. memcache это просто хранилище, как оно что-то может отслеживать?

Nekto
что-то вы странное говорите или я вас не понимаю. ...

мемкеш - это кеш. Если вы туда даже что-то записали, не факт что вы прочитаете записанное.

Nekto
это почему?

так не гарантирует же он этого =)

Nekto
это почему?

Потому что кеш. Потому что когда у него кончится память - он начнёт играть в eviction и будет выкидывать содержимое.

Nekto- Автор вопроса
Roman Timofeev
Потому что кеш. Потому что когда у него кончится п...

аа в этом плане, ну это учтено. Задача живет несколько минут, кеш - десятки гигов. кеш переполняется за сутки.

Nekto
аа в этом плане, ну это учтено. Задача живет неско...

Допустим, задача протухла и мы тут же записали этот факт в мемкеш. А кто опрашивает эти сотни тысяч ключей в нём?

Nekto- Автор вопроса
Pavel
Рестарт кеша - и привет

я же говорю, поведение memcache - это учтено. это не страшно.

Nekto
аа в этом плане, ну это учтено. Задача живет неско...

Вы пытаетесь использовать инструмент не по назначению. которые не лучшим образом справляется со своей задачей. который дает пачку консернов. если на это есть причины - ради бога

Nekto- Автор вопроса
Pavel
Вы пытаетесь использовать инструмент не по назнач...

опять вы за свое, ну давайте считать что там редис или mysql

Nekto- Автор вопроса
Roman Timofeev
Так и храните тогда все задачи в mysql :)

RPS идет 5-10к задач в секунду, mysql наверное будет тяжело :)) дешевле будет на memcache + семафорах. Сейчас выкручиваемся тем, что делаем очередь чуть меньше чем могут обработать воркеры, те воркеры всегда выбирают очередь до того как наступит таймаут.

Nekto
RPS идет 5-10к задач в секунду, mysql наверное буд...

Так проведите тесты, чтобы понять, будет ли тяжело или нет

Nekto- Автор вопроса
Владимир Столяров
Так проведите тесты, чтобы понять, будет ли тяжело...

тут мемкеш вызывает иногда вопросы (точнее вызывал), щас решили уже. а городить кластер mysql - ну это как-нить без меня. проще тогда scylla использовать

Nekto
запульнул я в канал 100 тыс задач, у каждой из них...

про вариант поднимать горутину с контекстом таймаута на каждую задачу не думали?

Andrey Kartashov
про вариант поднимать горутину с контекстом таймау...

лучше уж ring buffer на слайсе и периодически по нему пробегаться и искать задачи что expired

Roman Timofeev
лучше уж ring buffer на слайсе и периодически по н...

подозреваю, бегать по слайсу накладнее будет, придётся ещё мутексами обмазывать

Nekto- Автор вопроса
Roman Timofeev
лучше уж ring buffer на слайсе и периодически по н...

спасибо за идею, возможно это поможет, если не найду ничего лучше

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта