Maxim
boltdb - известный тормоз, особенно на запись
В моём проде записи довольно редко случаются
Daniel
и все данные в память влезли, небойсь
Daniel
тогда да, будет быстро
Alexander
Быстро, конечно, но задолбаешься конвертировать данные в байты и обратно
обвязки всякие есть, для улучшайзинга и удобства. еще форк какой-то был, с новыми фичами
Kirill 🎹 📷
Кто-нибудь собирается на 2018.codefest.ru ?
Kirill 🎹 📷
https://2018.codefest.ru/
Yura
и все данные в память влезли, небойсь
Даже если не влезли, btree пока-что самый быстрый способ искать данные на диске, и все lsm адепты это признают. (Ок, может и есть более лучшие способы, но они гораздо менее популярны чем btree и lsm). Правда, при определенных условиях итерация по lsm может быть быстрее, это правда.
Daniel
если не влезли - будет как у всех
Pawel
и дженерики
round же дали в 1.10 по просьбам трудящихся, глядишь и дж..в подкинут
Pawel
boltdb же
sqlite же если не хочешь в постгрес
Pawel
то ли я тупой, то ли гвозди, но с boltdb почему то всегда всё, кроме самого простого, получается на много хуже, чем с любым SQL - и тормозит, и говнокода много
Daniel
это не болт, это KV такие
Pawel
да, конечно
Anonymous
Кстати интересно, а что если бы автор той статьи попробовал azul с профилем оптимизации
Mister Tomato
у автора статьи цель другая была
🏳️ Phil
Хито?
Anonymous
А кто не тормоз?
/dev/null. Я сам офигел - скорость записи упирается в скорость чтения из любого источника!
Pawel
у автора статьи цель другая была
это был наброс за бесовский Го против православной Скалы. ни кто в этом не сомневается
Kirill 🎹 📷
🏳️ Phil
Я просто токен oauth2 сервер сделал. И он на boltdb. Но пока не пробовал в проде
Daniel
для твоих целей оно ок
Andrey
Всем привет. 2 Вопроса тем, кто использует vscode. Использую тэги в го "-tags". 1. Как сделать так чтобы отладчик запускался с определёнными тэгами? С компиляцией проблем нет. таски настроил. Что надо пропистаь в launch.json? Мне надо дебаггером по тесту пройтись. { "version": "0.2.0", "configurations": [ { "name": "Launch", "type": "go", "request": "launch", "mode": "test", "remotePath": "", "port": 2345, "host": "127.0.0.1", "program": "${workspaceRoot}", "env": {}, "args": [], "showLog": true } ] } 2. Как сделать чтобы линтер теги видел?
Kirill 🎹 📷
Как интегрируете?
форкаем и используем только нужное
Kirill 🎹 📷
стартуем ноду без http апи и тд
Aleksandr
коллеги, есть несколько воркеров, получающих задания из продьюсера, который кидает задания в канал. Внутри воркера получаю задания вот таким манером: for { select { case task := <-crawler.tasks: // chan *Task log.Printf("Task: %v", task) crawler.handleTask(task) case <-crawler.workersStop: return } } сейчас наблюдаю как из канала приходит сначала нормальный Task, а в другом воркере nil, причем продьюсер отправил в канал только первый таск. Это какая-то гонка?
Yura
badgerdb
Пока багнутый. Ну и, честно подразумевает, что у вас ssd. В том смысле, что значения больше порога не хранятся в lsm, а значит, скорее всего, итерация обернётся рандом-ридом. Тот же boltdb кладёт значения in-place, и итерация будет быстрее. Но вот мне потребовалось перелопатить 800GB данных, взял амазоновский инстанс с быстрым nvme, отключил fsync, и job done. Thank you, badgerdb.
Aleksandr
каналы потокобезопасны, ищите ошибку в коде отправки сообщения
вот мне так же казалось. но у меня одно место отправки в канал и дебаг показал что он один раз вызывается
Aleksandr
вот мне так же казалось. но у меня одно место отправки в канал и дебаг показал что он один раз вызывается
task.Status = taskStatusInProcess crawler.tasks <- task причем такой код исключает что в канал попадет nil.
Denis
и как такой код что то может исключать?
там кстати, вот так лучше go crawler.handleTask(task)
Andrei 🦉
там кстати, вот так лучше go crawler.handleTask(task)
он уже внутри отдельной горутины получает задачу, зачем еще одну плодить?
Aleksandr
и как такой код что то может исключать?
обращение к task.Status - запаникует ели там nil (но на самом деле чуть выше task явно создается)
Aleksandr
там кстати, вот так лучше go crawler.handleTask(task)
это у меня уже внутри отдельной горутины-воркера
Denis
потому что этот task crawler.handleTask(task) заблокирует цикл а если там сотня сразу свалится запросов?
Andrei 🦉
обращение к task.Status - запаникует ели там nil (но на самом деле чуть выше task явно создается)
скиньте ключевые участки в goplayground, пока что это гадание на гуще
Andrei 🦉
потому что этот task crawler.handleTask(task) заблокирует цикл а если там сотня сразу свалится запросов?
прежде чем давать советы следует хотя бы прочитать предыдущие сообщения...
Aleksandr
Может быть закрыли канал? Скиньте в плэйграунд.
а если закрыл канал, прилетит оттуда nil? я просто закрываю после того как убиваю все воркеры, поэтому кажется не должно влиять
Andrei 🦉
если ok == false, то канал уже был закрыт
Aleksandr
если ok == false, то канал уже был закрыт
точно, канал закрыт. спасибо. дальше разберусь
Pawel
это у меня уже внутри отдельной горутины-воркера
всё равно лучше запускать handleTask в отдельной горутине, чтобы цикл for перешёл к следующей итерации по возможности быстрее
Aleksandr
всё равно лучше запускать handleTask в отдельной горутине, чтобы цикл for перешёл к следующей итерации по возможности быстрее
Но мне это как раз не нужно. У меня n воркеров выполняют n заданий. Выполнил - приступил к следующему.
Pawel
а
Pawel
а канал с какой целью закрываете?
ainu
Клевый канал, лучший в телеграмме по Go, не надо закрывать
Kirill 🎹 📷
ор
Ruslan
Хех
Kirill 🎹 📷
Кто-нибудь поедет на codefest?
Aleksandr
а канал с какой целью закрываете?
Канал закрываю после закрытия воркеров при шатдауне приложения. Видимо почему то канал закрывается раньше чем тушится воркер. Переделаю этот момент
Pawel
Канал закрываю после закрытия воркеров при шатдауне приложения. Видимо почему то канал закрывается раньше чем тушится воркер. Переделаю этот момент
я к тому, что канал же не файл, его закрывать не обзательно, утечек ресурсов это не создаст, тем более при закрытии приложения. Наксколько я понял из tour of go, канал закрывают исключительно для того, чтобы послать своеобразный сигнал о прекращении работы внутрь for { select {...}} , но у вас для этого специалльный стоп-канал есть
Sergey
Всем привет, пишу api сервер для мобильного приложения, уперся в вопрос аутентификации пользователя, читал много всего, мнения розняться, так что лучше для этого использовать? Какую то свою реализацию(выдавать пользователю рефреш и acess токены и хранить их в redis) или использовать что то готовое, как я понима в oauth2 смысла никакого нет, так это не публичное api, напривьте кто шарит, что лучше или куда смотреть.
Alexander
2-legged oauth2 - это вот прямо то, что нужно
Alexander
> выдавать пользователю рефреш и acess токены и хранить их в redis В общем-то это почти oauth2 и есть, в простом варианте
Daniel
https://jwt.io/introduction/
Sergey
Понял, почитаю и про то и про то, спасибо)
Oleh
Подскажите пож как реализовать подобное. Мне необходимо на один endpoint повесить несколько экшенов, ко мне приходит GET-request по адрессу /requests/ /requests/123123 /requests/abcdefg И для каждого из них мне необходимо вызывать различные хэндлеры как можно реализовать такое ? разница между вторым и третьем лишь в том, что во втором будет uint, а в третьем string
Aleksandr
проверять req.Path, в зависимости от пути подсовывать разные хэндлеры
Oleh
так путь каждый раз будет другим, у меня есть идея лишь в том, чтобы парсить в middlewares и из неё раскидывать по хэндлерам
Pawel
либо используйте маршрутизатор с регэкспами, например, chi: r := chi.NewRouter() r.Route("/requests", func(r chi.Router) { r.Get("/", ...) // GET /requests r.Get("/{[0-9]+}", ...) // GET /requests/123123 r.Get("/{[A-Za-z]+}", ...) // GET /requests/abcdefg })
Aleksandr
так путь каждый раз будет другим, у меня есть идея лишь в том, чтобы парсить в middlewares и из неё раскидывать по хэндлерам
и? вешаешь хэндлер на requests. Проверяешь Path. В зависимости от условий, подсовываешь другой хэндлер.
Aleksandr
пересказал второй раз, что первый раз написал
Kirill
хттп, тсп, юдп хттп сервер наверно самый тяжелый из них, а тсп юдп относительно друг друга как? в го
Заур
В смысле тяжёлый?
Kirill
по использования ресурсов, рам цп
Sergei
а часто вы в го _реализуете_ tcp?
Kirill
а часто вы в го _реализуете_ tcp?
приходилось один раз как-то
Sergei
приходилось один раз как-то
я не тебя спрашивал (:
Kirill
ничего кроме хттп не использовал но сейчас возникла задача, что бы на одной локальной машине держалось n сервисов и общалось между собой, хотелось выбрать наименее затраный в плане ресурсов вариант
Sergei
ты-то понятно реализовывал