Size: a a a

Kotlin Community

2020 May 21

IK

Igor Komarov in Kotlin Community
Alexander Nozik
Если я правильно понял, то вам достаточно сделать обычный Flow, но суспендить отправку при получении статуса
Нет. Так делать нельзя, другие сообщения могут отправиться. Статус распространяется на один конкретный Webhook (DiscordId), отсюда и гемор
источник

IO

Iaroslav Orlov in Kotlin Community
Igor Komarov
Я отправляю сообщения в Discord из очереди на отправку. При статусе 429, мне нужно положить сообщение в очередь на отправку, и при этом, чем более старым является сообщение, тем раньше оно должно попытаться отправиться снова (тем ближе оно к началу очереди). Подобный механизм позволит гарантировать доставку сообщений.
рейт-лимит?
источник

IK

Igor Komarov in Kotlin Community
Количество потоков по количеству Webhook делать также нельзя.
источник

IK

Igor Komarov in Kotlin Community
Iaroslav Orlov
рейт-лимит?
Да.
источник

AN

Alexander Nozik in Kotlin Community
Ну так по flow на каждый webhook. Можно сделать отдельный накопительный канал для неотправленный сообщений, конечно, он будет тоже fifo
источник

IO

Iaroslav Orlov in Kotlin Community
я, возможно, предлагаю что-то левое, но вы можете по заголовкам смотреть, сколько у вас еще осталось запросов
источник

AN

Alexander Nozik in Kotlin Community
что-то типа if(429){channel.send()}
источник

IO

Iaroslav Orlov in Kotlin Community
не обязательно падать именно на too many requests
источник

IK

Igor Komarov in Kotlin Community
Iaroslav Orlov
не обязательно падать именно на too many requests
Не уверен, но лишний запрос не критичен. Критичен механизм упорядочивания сообщений.
источник

IK

Igor Komarov in Kotlin Community
Alexander Nozik
что-то типа if(429){channel.send()}
А как это решение будет выглядеть при распараллеливании на N потоков < M Webhook-ов?
источник

AN

Alexander Nozik in Kotlin Community
Igor Komarov
А как это решение будет выглядеть при распараллеливании на N потоков < M Webhook-ов?
Зависит от того, что вы хотите. Можно для каждого свой канал сделать, можно сваливать в один общий.
источник

AN

Alexander Nozik in Kotlin Community
Если на каждый свой flow, то как бы и канал не нужен, просто конкретный флоу засуспендится пока отправка не прочихается
источник

IK

Igor Komarov in Kotlin Community
В таком случае, если у меня 2 потока, 4 канала, до тех пор пока сообщения есть в двух каналах, и их не отрежет 429, сообщения из других двух каналов не будут отправляться, и будут ждать в очереди на выполнение?
источник

IK

Igor Komarov in Kotlin Community
Насколько я понял, вы предлагаете аналогичный механизм, который будет иметь иной принцип работы. Мне же интересно, можно ли на корутинах сделать в точности такое поведение, как в примере выше?
источник

AN

Alexander Nozik in Kotlin Community
Igor Komarov
Насколько я понял, вы предлагаете аналогичный механизм, который будет иметь иной принцип работы. Мне же интересно, можно ли на корутинах сделать в точности такое поведение, как в примере выше?
Там очень много буков. Если бы вы могли в двух предложениях описать, как оно работает, было бы проще ответить
источник

IK

Igor Komarov in Kotlin Community
Давайте попробую выпилить оттуда все ненужное, к сожалению, текстом описать сложно
источник

AN

Alexander Nozik in Kotlin Community
Igor Komarov
Давайте попробую выпилить оттуда все ненужное, к сожалению, текстом описать сложно
У вас там две структуры. Одна - это очередь на все сообщеия вроде. Вторая что делает?
источник

IK

Igor Komarov in Kotlin Community
Alexander Nozik
У вас там две структуры. Одна - это очередь на все сообщеия вроде. Вторая что делает?
Вторая – N параллельно работающих потоков, которые циклично вытягивают из очереди сообщения, для которых на текущий момент доступна отправка (время ожидания после 429 прошло), по одному отправляют, если ловят 429, закидывают обратно в очередь.
источник

IK

Igor Komarov in Kotlin Community
Убрал лишнее, так должно восприниматься лучше

https://gist.github.com/ivkomarov/eb9e8feae7a7a4eb4bbd7115a898b148
источник

AN

Alexander Nozik in Kotlin Community
Igor Komarov
Вторая – N параллельно работающих потоков, которые циклично вытягивают из очереди сообщения, для которых на текущий момент доступна отправка (время ожидания после 429 прошло), по одному отправляют, если ловят 429, закидывают обратно в очередь.
Отраженное событие в конец очереди встает?
источник