столько перечитал, и статья на хабре хорошая про Анатомию каналов в Go
Но вот разница между буферизированным каналом и не буферезированным как-то не шибко чувствуется, а если чувствуется то не понятно почему так ;D
Самое главно не совсем понятно в модели с ВоркерПулами и тд (аля 10 горутин читают из одного канала и что-то делают с данными) во многих туториалах советуют размер канала (то есть уже как минимум делать буферезированным) делать равным размером кол-ву воркеров, почему?
Я тут накидал проектит, условно в 100 воркеров читают из одного канала.
В этот один канал считайте что в цикле инты идут.
Каждый воркер берёт цифру, принтит и слипается на 5 сек.
(Всё это с контекстом и грейсефул шатдауном)
Так вот я тут пытаюсь объять эту разницу между буферезированным каналом и нет в плане воркеров и обработки задач.
Всё что я заметил что если канал буферезирован на кол-во воркеров (100) то шатдаун происходит раза в три дольше, чем если бы канал не был буферезированным. 🤷♂️🤷♂️🤷♂️
Кто-нибудь может дураку сказать зачем и почему) Вот это вот частое правило делать канал буферезированным равным кол-ву воркеров, зчм?)
смотрите, у вас вопркерпул из 10 горутин, каждая из которых обрабатывает по 10 сообщений в секунду общая пропускная способность - 100 сообщений в секунду, или 6000 сообщений в минуту, так? сообщения поступают от 1000 клиентов, по одному в минуту. пропускной способности хватает, так? но! все клиенты пытаются отправить свои сообщения в первую секунду каждой минуты, так они настроены. в результате мы в первую секунду получаем 1000 сообщений, а обработать в эту же секунду можем только 100 из них выбор простой - или терять сообщения, или как-то сохранять их для последующей обработки и вот тут нам может пригодиться буферизованный канал так понятно?
Хороший пример спасибо.... Но тут кхм.... Вот вроде всё понятно... Хотя да, всё понятно, спасибо)
вот прекрасный пример как тут можно что то еще добавить я хз я балансирую внутри приложения нагрузку на сервер с помощью буферизованных каналов зачем создавать канал размером 1 мне вообще не понятно это чистая синхронщина там даже лок как таковой не нужен
Просто у меня... Ну для примера есть скрипт на ruby который в редис массив lpush делает цифер. Есть гошный проект с воркерами блекджеком и тд. ruby пушит в редис массив инты go func(){ go считывает инты из редиса через BLPop с таймаутом в секунду канал <- и шлёт в канал } 100 воркеров читают с этого канала То есть тут может быть я не совсем вижу приемущество использования буферезированного канала перед небуферезированным.......
У меня в данном примере как будто буффером служит сам редис массив......
Если использовать буфферезированный канал то единственным плюсом я вижу что редис массив как бы быстрей очищается и переходит уже в память самого го...
если вы видите только в этом плюс то лучше оставить как есть...
Оставить как есть это всмысле? Не использовать буферезированный канал? Или что вы имеете ввиду?
Ещё б вспомнить что такое редис. Это какая то приблуда с пхп используется ибо в пхп нет чего то
KV хранилище с плюшками.
Обсуждают сегодня