mad
апачибенч
Alexander
я вижу так: 1. Есть скрипт, гоняет эти запросы, кладет результаты в табличку в той же СУБД (редисов и мемкешей у нас же нет всяких). 2. Наш веб сервер просто берет из той таблички.
Nikita
И приложение вообще трогать не нужно
mad
я вижу так: 1. Есть скрипт, гоняет эти запросы, кладет результаты в табличку в той же СУБД (редисов и мемкешей у нас же нет всяких). 2. Наш веб сервер просто берет из той таблички.
Не получится. 300+ инстансев с репликами бд. На реплике, где и живет главное приложение, делать такую выборку не особо имеет смысл, так как клиенты могут быть на этой машине, а через час на другой. На мастере вообще такое не возможно ввиду большого кол-ва клиентов и разнообразия запросов. Смысла нет готовить ответ, если его не спросят. Данные могут в любой момент обновиться и это будет бизнес логика, ответ нужен сию секунду.
mad
Nginx? Кэш запросов можно хранить в nginx Обновляется по ttl
Нжинкс поставить не получиться. Да и он будет хранить запрос и ответ? А ответ кто будет обновлять?
Alexander
Так ты же хотел сам раз в секунду обновлять
Alexander
Я хз, какой толк от хэша, который инвалидируется постоянно и мисит в основном
Alexander
Опять же один запрос 5с, а другой 1мс
mad
Так ты же хотел сам раз в секунду обновлять
Смотрите. -Пришёл запрос первый. -Сейчас и далее нужна свежая информация. -Первый ответ будет из бд с небольшой задержкой в 1-5 сек, пока база не ответит. -Остальные запросы должны получать ответ из кеша. внимание вопрос, кто обновит данные в кеше?
Alexander
Машине пофиг, конечно, если о ней речь, а вот человеку жуть
mad
Опять же один запрос 5с, а другой 1мс
Вот первый пусть 5с. Остальные сразу из свежего кеша, который обновляется раз в секунду. Ну пусть в две. Не важно.
John
Смотрите. -Пришёл запрос первый. -Сейчас и далее нужна свежая информация. -Первый ответ будет из бд с небольшой задержкой в 1-5 сек, пока база не ответит. -Остальные запросы должны получать ответ из кеша. внимание вопрос, кто обновит данные в кеше?
тебе нужно сделать мидлвар на свою реализацию репозитория для таблицы к БД. Репозиторий и мидлвар реализуют один и тот же интерфейс. Чтение: приходит запрос на чтение, ты опрашиваешь свой мидлвар, он в своём кэше ничего не находит, обращается к БД, получает данные и сохраняет в свой внутренний кэш и уже из кэша отдаёт. Запись: вариант 1: приходит запрос на запись, дергаешь метод для записи у своего мидлвара, он в свою очередь сохраняет/обновляет данные в кэше, ставит задачу на запись в БД вариант 2: приходит запрос на запись, дергаешь метод для записи у своего мидлвара, он в свою очередь дергает метод для записи в БД. Если в БД сохранилось - инвалидирует значение в кэше, т.е. стираешь. При следующем запросе на чтение см. чтение
John
запись/вариант 1 - высока доступность, но никакой отказоустойчивости
John
у тебя же банальный кэширующий посредник/мидлевар
John
детали реализации согласно требованиям: сколько RPS на запись/чтение?
kostyaBro
📊 Табличные тесты в Go с использованием Gomock Чтобы эффективнее тестировать работу программы, можно использовать табличные юнит-тесты. В этой статье пошагово рассказываем, как писать такие тесты с помощью фреймворка Gomock. Подробнее @Golang_google
За несколько лет разработки на go так и не привык к табличным тестам, даже читать очень сложно. Имхо, testify suite или ginkgo/gomega и правило 1 функция один тест кейс (инит данных, вызов, проверка ответа) читается куда понятнее.
mad
тебе нужно сделать мидлвар на свою реализацию репозитория для таблицы к БД. Репозиторий и мидлвар реализуют один и тот же интерфейс. Чтение: приходит запрос на чтение, ты опрашиваешь свой мидлвар, он в своём кэше ничего не находит, обращается к БД, получает данные и сохраняет в свой внутренний кэш и уже из кэша отдаёт. Запись: вариант 1: приходит запрос на запись, дергаешь метод для записи у своего мидлвара, он в свою очередь сохраняет/обновляет данные в кэше, ставит задачу на запись в БД вариант 2: приходит запрос на запись, дергаешь метод для записи у своего мидлвара, он в свою очередь дергает метод для записи в БД. Если в БД сохранилось - инвалидирует значение в кэше, т.е. стираешь. При следующем запросе на чтение см. чтение
Записи нет. Только чтение. В разделе Чтение вы пишите, что если данных нет- спрашиваем в БД. Данные нужны свежие. Значит данные в кеше должны обновляться. Как?
mad
Ок, прогрей кэш
Поподробнее, пожалуйста)
Sasha
За несколько лет разработки на go так и не привык к табличным тестам, даже читать очень сложно. Имхо, testify suite или ginkgo/gomega и правило 1 функция один тест кейс (инит данных, вызов, проверка ответа) читается куда понятнее.
Твой метод корректен, но зачем? Получаешь дубляж кода, который надо редактировать в N местах и лишаешься смысловой группировки, когда все успешные сценарии с корнеркейсами можно положить рядом и смыслово объединить.
John
Поподробнее, пожалуйста)
При старте приложения скопируй нужные данные из БД в кэш, а потом переодически актуализируй
mad
При старте приложения скопируй нужные данные из БД в кэш, а потом переодически актуализируй
В базе 30+ таблиц и более млн строк и сотни тысяч вариантов ответа. И оно понятно становится, что именно надо, только в время самого запроса. Запрос первый формирует ответ. Один запрос пришёл, первый. Далее каждую секунду запрос повторяется. Ответ нужен быстро, кроме первого. Через 1-600+ минут данные больше не нужны. То есть можем день запрашивать данные каждую секунду. А можем запросить 20 раз и больше неделю к этому запросу не возвращаться
John
Записи нет. Только чтение. В разделе Чтение вы пишите, что если данных нет- спрашиваем в БД. Данные нужны свежие. Значит данные в кеше должны обновляться. Как?
Можно ещё мудренее сделать. Приложение наполняет свой кэш из БД. А в БД сделай триггер , по которому в приложение будут create/update/delete данные
mad
Вот реально, возьми редис или другой in-memory storage. Все уже придумано за нас
Я сюда и пришёл за готовым решением. За модулем, который это делает. Редис хранит. Нужны свежие данные же.
mad
Коллеги, товарищи, граждане. Как сделать- я представляю. Над дизайном неделю думал. Я увидел в четверг готовый кеш на nodeJS, который сам себя обновляет. И пришёл за тем, что бы найти подобное на гоу)
mad
Тогда вообще супер, можно попробовать портировать
У меня опыта в гоу- пол года( не потяну
John
Так. У тебя есть БД, хитрый запрос отрабатывает до 5 секунд. Нужно кэшировать результат запроса. + кэш самостоятельно обновляет данные из БД. Все так?
John
Запрос 1 или несколько - я про «шаблон» запроса.
mad
Так. У тебя есть БД, хитрый запрос отрабатывает до 5 секунд. Нужно кэшировать результат запроса. + кэш самостоятельно обновляет данные из БД. Все так?
Да! Результат клиенту - из кеша. Запрос от клиента отсутсвует 10 сек? Трём кэш или перестаём обновлять.
mad
Запрос 1 или несколько - я про «шаблон» запроса.
Два три запроса, разные только ключи.
kostyaBro
Твой метод корректен, но зачем? Получаешь дубляж кода, который надо редактировать в N местах и лишаешься смысловой группировки, когда все успешные сценарии с корнеркейсами можно положить рядом и смыслово объединить.
Редактирование в N местах разве что если прототип функции поменяется, что редко. Да и дубляжа также нет. Однотипные инициализации, например, лежат в SetupSuite функции. Ну и тут просто больше вкусовщина. Просто для меня табличные тесты нечитаемы.
Anonymous
мужики, кто знает где можно взять дешевые серваки?
John
Heroku
John
А, уже никак
Anonymous
электричество
Anonymous
расбери пай в кафе
mad
мужики, кто знает где можно взять дешевые серваки?
Вопрос в том, как платить? Или вообще? Или железо надо? Какою бюджет, сколько надо? Какие то АПи для деплоя или ssh под рутом подойдёт?
John
Да! Результат клиенту - из кеша. Запрос от клиента отсутсвует 10 сек? Трём кэш или перестаём обновлять.
Готового решения не встречал. Если тут молчат , то не только я «не встречал». Скорее всего делать своё решение: или сервис, или готовить данные и писать в таблицу для быстрой выборки
John
мужики, кто знает где можно взять дешевые серваки?
смотря для чего. раньше можно было завести аккаунт на heroku, прикрепить карту и тебе давали достаточное кол-во часов работы приложения. Например, у меня бесплатно крутился там бот для дискорда с полгода, бесплатно пока не вырубил. думаю это возможно и сейчас, но проблема с оплатой. у яндекса вроде есть бесплатная программа обучения devops , где они напихали своей рекламы, например, дают промокоды для пополнения счета для боевого обучения Была беда с этими кодами, что я себе нактивировал 100к на счете для оплаты серверов, но скорее всего уже прикрыли, хотя.... чем черт не шутит
John
John
+ mastercard (вспомнилась реклама)
Alexey
а, ну и способы оплаты только картой... у hetzner через свифт можно оплатить
John
так я впн юзану
тогда у тебя должна быть mastercard))))
John
которую можно прикрепить к аккаунту
Anonymous
никогда не юзал хероку
Anonymous
вирт карта от киви подойдет?
Anonymous
и там деньги будут списываться?
Anonymous
ок понял спс
Anonymous
увидел увидел)))
John
угу
mad
вирт карта от киви подойдет?
Карта от киви не подойдёт. Международные платежи по таким картам не канают.
John
https://www.heroku.com/free
John
Maximize your free platform services Get 1000 free dyno hours by verifying your Heroku account with a credit card; unverified accounts receive 550 free hours. You will not be charged, unless you decide to use a paid service. Account verification provides other benefits too, including running more than 5 free apps, as well as free custom domain names.
John
в месяце 672 часа из бесплатных 1000
John
т.е. на каждое приложение по 1 акканту
John
+ heroku поддерживает docker-compose, но тут уже надо читать
John
я никак не могу вплотную взяться за это
John
у heroku кажется ограничение на время работы и кол-во трафика на фришных аккаунтах
John
со временем всё ок, а по трафику где-то 1-2ТБ
John
даааа, а я все колебался брать-небрать, а теперь ...
John
свято место пусто не бывает, так что уже есть приемник сервиса
John
осталось его найти)))
Alexey
у меня кстати карточка bankoff прошла в хероку
N
Гидру закрыли?
N
А давно?
Juffin
https://t.me/GolangJobsit - Golang вакансии
Есть запись? мне не удалось попасть на сам вебинар
Alexander
Коллеги, товарищи, граждане. Как сделать- я представляю. Над дизайном неделю думал. Я увидел в четверг готовый кеш на nodeJS, который сам себя обновляет. И пришёл за тем, что бы найти подобное на гоу)
мне слабо верится, что твоя задача решается сторонней либой. ну а просто что-то кэшить и апдейтить в фоне это полчаса работы без тестов
Alexander
а что, нет платформы где криптой можно оплатить?
Alexander
я не про гидру, а про хероку)
Alexander
мне слабо верится, что твоя задача решается сторонней либой. ну а просто что-то кэшить и апдейтить в фоне это полчаса работы без тестов
то бишь я имел в виду полное и разумное решение, устойчивое к разным условиям и логически верное, а не просто тупо что-то закэшил и молодец
Alexey
так это "лишняя" прослойка. Естественно будет медленней чем напрямую в базу (до какого-то момента) баунсер нужен чтобы не плодить коннекты к самой базе. потому что если у тебя будет 1к коннектов к одной базе, постресу будет не очень приятно, а баунсер держит открытыми условно 200 коннектов, и сам определяет через какой отправить запрос к пг