
Daniel
23.02.2018
22:26:14
это из сети, или с диска? если с диска - надо буферизованный ридер использовать

Nik
23.02.2018
22:34:44
Циклом читаю 64, потом смотрю сколько данных, читаю их, все склеиваю и шлю на хендлинг

Daniel
23.02.2018
22:48:34
вот тут тоже хорошо бы буферизацию приспособить

Google

Daniel
23.02.2018
22:48:48
чтобы не на каждое чтение сискол был

Marlik
23.02.2018
23:21:39
оу, оказывается линтер не стоял... сколько я о себе узнал и о своём коде када поставил)))

Slava
23.02.2018
23:25:41
А в мае есть какие-то интересные конференции в россии??

Let Eat
23.02.2018
23:26:41
Не те буферы крутите. Побробуйте TCPConn обернуть в https://golang.org/pkg/bufio/#NewReader чтобы сисколы не дергать часто

Nik
23.02.2018
23:27:31
Или я чего то не умею

Let Eat
23.02.2018
23:27:49
Пусть плавает
Оно читает кусками, а вы из него побайтово

Nik
23.02.2018
23:29:09
(Наверно писать лучше тоже также)
Спасибо за мысль, завтра попробую закодить
Кстати, кто завтра в Badoo идёт?

Google

Kirill
24.02.2018
02:01:28

Zver
24.02.2018
05:07:33
Такие буферы гигантские. Это же если соединений тысячи, они всю память сжирать будут.

Marlik
24.02.2018
05:23:57

Zver
24.02.2018
06:10:19

Yura
24.02.2018
06:15:48
Если мапа с функциями сожрала память, значит ты пихал в нее жирные замыкания.
А вообще, тот же самый тарантул использует асинхронный протокол, и драйвера спокойно выжимают сотни тысяч rps без всякого трэша, который тебе @onokonem тулит. Правда, с другим трэшем.
Вот один драйвер: https://github.com/tarantool/go-tarantool
Вот другой: https://github.com/viciious/go-tarantool
Второй, думаю, читать полегче будет. (Первый - мой на половину. На ту половину, что читать труднее ? )

Marlik
24.02.2018
06:18:16

Zver
24.02.2018
06:45:33

Yura
24.02.2018
06:51:37
Вообще, каждый канал весит около 200 байт (не считая буфера под значения). А func - от 8ми байт. Вопрос только, что func в себя замкнул.

Zver
24.02.2018
06:56:04
В замыкании мегабайт иметь тоже постараться надо. Массивные данные в основном ссылочные и в куче валяются.
В общем там какая-то хрень. )

Yura
24.02.2018
06:57:03
Замыкается ведь не "стэк", весь граф достижимых по ссылкам объектов.
"замыкается" - это не значит "копируется". Это значит "не умрет раньше замыкания".
BTW, BlackTrojan чьих рук дело? Давай поговорим лично, зачем прячешься?

Zver
24.02.2018
07:02:10

Yura
24.02.2018
07:02:51
Да. Думал, что это личное. Видимо, кто-то просто по чату спамит.

BlackTrojan
24.02.2018
07:03:15

Yura
24.02.2018
07:03:41
Или тебя взломали, или ты - гондон.

BlackTrojan
24.02.2018
07:03:57

Yura
24.02.2018
07:05:05

Google

BlackTrojan
24.02.2018
07:05:20

Yura
24.02.2018
07:05:40
Похоже, это бот.

BlackTrojan
24.02.2018
07:06:07

Andrew
24.02.2018
07:20:24

Nik
24.02.2018
07:36:46
Работаю в 1 коннект

Yura
24.02.2018
07:40:46
Если сервер, то зачем мапа?

Nik
24.02.2018
07:41:24
Клиентов много, общения через сервер, каждый клиент имеет свои уникальные функции

Yura
24.02.2018
07:42:10
Клиент
А зачем обратно отсылаешь?

Nik
24.02.2018
07:42:42
Бенч тесты кстати накрутил, анмаршал/маршал работает быстро


Yura
24.02.2018
07:48:38
В общем: замыкания - это клёво. Я люблю замыкания, хоть это и не Go-way. Но в цикле чтения из сокета можно звать только легкие замыкания: например, ту же посылку в канал/закрытие канала (вариант WaitGroup.Done() ).
Ещё вместо замыкания можно использовать интерфейс, если нужно более одной функции.
Основной затык с этой асинхронщиной: как правильно пайплайн организовать. Обычно делают одну пишущую горутину, и одну читающую. Запросы пишущей едут по каналу. Читающая закрывает запросы (выбирая их из мапы). Надеюсь, ты примерно так и сделал.
Второй затык: как ту саму мапу заполнять. Если под одним мьютексом, то больше 100крпс в среднем не выходит, по разным причинам. Потому приходится шардить мапу, чтобу а шарда был свой мьютекс.
Если цель - максимальный перформанс, то маршалить нужно в клиентской горутине. Если же в реальности меньше 100krps, то может оказаться выгоднее в пишущей горутине (если будет успевать), т.к. тогла запросы будут чаще в нее пачками попадать.
Btw если слать по одному запросу в канал в сторону писателя, то это тот же мьютекс (канал реализован через мьютекс). Я у себя нагребаю слайс запросов, но в канал шлю номер шарда когда добавляю первый запрос в слайс шарда.


Nik
24.02.2018
07:55:58
Основной затык с этой асинхронщиной: как правильно пайплайн организовать. Обычно делают одну пишущую горутину, и одну читающую. Запросы пишущей едут по каналу. Читающая закрывает запросы (выбирая их из мапы). Надеюсь, ты примерно так и сделал.
Второй затык: как ту саму мапу заполнять. Если под одним мьютексом, то больше 100крпс в среднем не выходит, по разным причинам. Потому приходится шардить мапу, чтобу а шарда был свой мьютекс.
Если цель - максимальный перформанс, то маршалить нужно в клиентской горутине. Если же в реальности меньше 100krps, то может оказаться выгоднее в пишущей горутине (если будет успевать), т.к. тогла запросы будут чаще в нее пачками попадать.
Btw если слать по одному запросу в канал в сторону писателя, то это тот же мьютекс (канал реализован через мьютекс). Я у себя нагребаю слайс запросов, но в канал шлю номер шарда когда добавляю первый запрос в слайс шарда.
Чтение/запись так и сделал (+плюс пишут, что методы tcpconn потокобезопасны, хочу попробовать писать лично из зендлера)
Маршалю/анмаршалю как раз на хендлере.

Google

Yura
24.02.2018
07:57:42
А вообще, какой боевой rps предполагается? Предлагаю исходить из него. И если какая-то простая схема его перекрывает в два-три раза, то лучше остановиться на ней, и не усложнять.

Nik
24.02.2018
07:58:02
А мапа инится до старта обмена, в нее закладываются замыкания по ключам, дальше только чтение. Я ее даже без мьютексов собрал, учитывая что она юзается только на чтение

Yura
24.02.2018
07:59:19

Nik
24.02.2018
08:00:29
SAVE/GET_/итд
На хендинге выбираю именно эти 4 байта, по ним хендлю, и сырое сообщение кидаю в канал (или в замыкание)

Admin
ERROR: S client not available

Yura
24.02.2018
08:03:17
Почему мне это сервер напоминает, а не клиент?

Nik
24.02.2018
08:04:29
А сам микросервис можно по сути и сервером обозвать)) он хендлит запросы для него, и обращается к соседям по необходимости

Yura
24.02.2018
08:05:47

Nik
24.02.2018
08:05:59
Ок) пусть будет)
Это мне ща погоды не сильно поменяет

Zo zo
24.02.2018
08:06:20
Коллеги, подскажите переползающему на го. Есть protobuf-структура (Event) и обертка для массива этих структур (Events), тоже protobuf. Есть логика, которая получает через канал эти события (Event) и при определенных условиях, собирает пачку событий, запаковывает их в Events и через proto.Marshal сериализует их в файлик в бинарном виде. Понадобилось сделать аналогично для другой структуры, пытаюсь понять как правильно вынести привязку именно к этим Event(s), что бы логика сбора, сериализации и записи в файл осталась в одном месте.

Nik
24.02.2018
08:06:35
И да, вопрос сбоку - чем плох митап баду? (Может я зря проснулся так рано)

Yura
24.02.2018
08:10:25
Мало того, я не считаю, что все пхпшники .... Наверняка те, что работают в Badoo, адекватные люди, у которых можно чему-то научиться.

Nik
24.02.2018
08:15:09

Никита
24.02.2018
08:16:24

Google

Никита
24.02.2018
08:16:50
Я в мск проездом, заодно решил забежать на митапчики. А Москва огромная

Yura
24.02.2018
08:16:55
Если ты зарегался, думаю, пустят

Никита
24.02.2018
08:18:38
Зарегался.

Yura
24.02.2018
08:19:02
Спросил тут в холле: до 12ти будут в холле ждать. После 12ти будет сложнее.

Никита
24.02.2018
08:19:16
Спасибо

Marlik
24.02.2018
08:22:05

Zver
24.02.2018
08:25:03

Marlik
24.02.2018
08:25:31
Люди подскажите, поставил dep, и ругань на sqlite
../../go/src/rzn/db.go:7:4:error: could not import github.com/mattn/go-sqlite3 (type-checking package "rzn/vendor/github.com/mattn/go-sqlite3" failed (/home/marlik/go/src/rzn/vendor/github.com/mattn/go-sqlite3/error.go:14:17: invalid constant type invalid type)) (gotype)
Может кто встречался, куда копать-то?

Nik
24.02.2018
08:26:56

Никита
24.02.2018
08:38:46
Может поставил слишком свежую. Ну выглядит так оО

Michael
24.02.2018
08:48:12
vgo ещё никто не щупал?

Daniel
24.02.2018
09:08:08

Nik
24.02.2018
09:12:37

Yura
24.02.2018
09:13:45

Marlik
24.02.2018
10:07:32

Artem
24.02.2018
10:21:42
но в code по умолчанию сейчас он все равно не используется, там golint