G72K
go:gen , protobuf, grpc
Oleh
спс
Nik
Но меня смущает, что переустановка буферов деградирует производительность чтения.
Oleh
ну так там наверника же лок стоит
G72K
Если не из Go то самый сок Ragel :)
Vasily
Daniel
Nik
Nik
Циклом читаю 64, потом смотрю сколько данных, читаю их, все склеиваю и шлю на хендлинг
Daniel
вот тут тоже хорошо бы буферизацию приспособить
Daniel
чтобы не на каждое чтение сискол был
🎉
оу, оказывается линтер не стоял... сколько я о себе узнал и о своём коде када поставил)))
Slava
А в мае есть какие-то интересные конференции в россии??
G72K
G72K
Nik
Nik
Или я чего то не умею
G72K
Пусть плавает
G72K
Оно читает кусками, а вы из него побайтово
Nik
Nik
(Наверно писать лучше тоже также)
Nik
Спасибо за мысль, завтра попробую закодить
Nik
Кстати, кто завтра в Badoo идёт?
Kirill
Zver
Yura
вот да, нечто похожее
Если мапа с функциями сожрала память, значит ты пихал в нее жирные замыкания.
А вообще, тот же самый тарантул использует асинхронный протокол, и драйвера спокойно выжимают сотни тысяч rps без всякого трэша, который тебе @onokonem тулит. Правда, с другим трэшем.
Вот один драйвер: https://github.com/tarantool/go-tarantool
Вот другой: https://github.com/viciious/go-tarantool
Второй, думаю, читать полегче будет. (Первый - мой на половину. На ту половину, что читать труднее 😔 )
Zver
Yura
Вообще, каждый канал весит около 200 байт (не считая буфера под значения). А func - от 8ми байт. Вопрос только, что func в себя замкнул.
Zver
В замыкании мегабайт иметь тоже постараться надо. Массивные данные в основном ссылочные и в куче валяются.
В общем там какая-то хрень. )
Yura
Yura
Замыкается ведь не "стэк", весь граф достижимых по ссылкам объектов.
Yura
"замыкается" - это не значит "копируется". Это значит "не умрет раньше замыкания".
Yura
BTW, BlackTrojan чьих рук дело? Давай поговорим лично, зачем прячешься?
Zver
Yura
Да. Думал, что это личное. Видимо, кто-то просто по чату спамит.
Anonymous
Yura
Или тебя взломали, или ты - гондон.
Anonymous
Anonymous
Yura
Похоже, это бот.
Anonymous
Nik
Nik
Nik
Работаю в 1 коннект
Yura
Yura
Если сервер, то зачем мапа?
Nik
Nik
Клиентов много, общения через сервер, каждый клиент имеет свои уникальные функции
Yura
Клиент
А зачем обратно отсылаешь?
Nik
Nik
Бенч тесты кстати накрутил, анмаршал/маршал работает быстро
Nik
Yura
В общем: замыкания - это клёво. Я люблю замыкания, хоть это и не Go-way. Но в цикле чтения из сокета можно звать только легкие замыкания: например, ту же посылку в канал/закрытие канала (вариант WaitGroup.Done() ).
Ещё вместо замыкания можно использовать интерфейс, если нужно более одной функции.
Yura
Основной затык с этой асинхронщиной: как правильно пайплайн организовать. Обычно делают одну пишущую горутину, и одну читающую. Запросы пишущей едут по каналу. Читающая закрывает запросы (выбирая их из мапы). Надеюсь, ты примерно так и сделал.
Второй затык: как ту саму мапу заполнять. Если под одним мьютексом, то больше 100крпс в среднем не выходит, по разным причинам. Потому приходится шардить мапу, чтобу а шарда был свой мьютекс.
Если цель - максимальный перформанс, то маршалить нужно в клиентской горутине. Если же в реальности меньше 100krps, то может оказаться выгоднее в пишущей горутине (если будет успевать), т.к. тогла запросы будут чаще в нее пачками попадать.
Btw если слать по одному запросу в канал в сторону писателя, то это тот же мьютекс (канал реализован через мьютекс). Я у себя нагребаю слайс запросов, но в канал шлю номер шарда когда добавляю первый запрос в слайс шарда.
Nik
Основной затык с этой асинхронщиной: как правильно пайплайн организовать. Обычно делают одну пишущую горутину, и одну читающую. Запросы пишущей едут по каналу. Читающая закрывает запросы (выбирая их из мапы). Надеюсь, ты примерно так и сделал.
Второй затык: как ту саму мапу заполнять. Если под одним мьютексом, то больше 100крпс в среднем не выходит, по разным причинам. Потому приходится шардить мапу, чтобу а шарда был свой мьютекс.
Если цель - максимальный перформанс, то маршалить нужно в клиентской горутине. Если же в реальности меньше 100krps, то может оказаться выгоднее в пишущей горутине (если будет успевать), т.к. тогла запросы будут чаще в нее пачками попадать.
Btw если слать по одному запросу в канал в сторону писателя, то это тот же мьютекс (канал реализован через мьютекс). Я у себя нагребаю слайс запросов, но в канал шлю номер шарда когда добавляю первый запрос в слайс шарда.
Чтение/запись так и сделал (+плюс пишут, что методы tcpconn потокобезопасны, хочу попробовать писать лично из зендлера)
Nik
Маршалю/анмаршалю как раз на хендлере.
Yura
А вообще, какой боевой rps предполагается? Предлагаю исходить из него. И если какая-то простая схема его перекрывает в два-три раза, то лучше остановиться на ней, и не усложнять.
Nik
А мапа инится до старта обмена, в нее закладываются замыкания по ключам, дальше только чтение. Я ее даже без мьютексов собрал, учитывая что она юзается только на чтение
Nik
Yura
Nik
SAVE/GET_/итд
Nik
На хендинге выбираю именно эти 4 байта, по ним хендлю, и сырое сообщение кидаю в канал (или в замыкание)
Yura
Почему мне это сервер напоминает, а не клиент?
Nik
А сам микросервис можно по сути и сервером обозвать)) он хендлит запросы для него, и обращается к соседям по необходимости
Yura
Nik
Ок) пусть будет)
Nik
Это мне ща погоды не сильно поменяет
3030
Коллеги, подскажите переползающему на го. Есть protobuf-структура (Event) и обертка для массива этих структур (Events), тоже protobuf. Есть логика, которая получает через канал эти события (Event) и при определенных условиях, собирает пачку событий, запаковывает их в Events и через proto.Marshal сериализует их в файлик в бинарном виде. Понадобилось сделать аналогично для другой структуры, пытаюсь понять как правильно вынести привязку именно к этим Event(s), что бы логика сбора, сериализации и записи в файл осталась в одном месте.
Nik
И да, вопрос сбоку - чем плох митап баду? (Может я зря проснулся так рано)
Yura
Yura
Мало того, я не считаю, что все пхпшники .... Наверняка те, что работают в Badoo, адекватные люди, у которых можно чему-то научиться.