Satont.
299 subscribers
320 photos
52 videos
1 file
201 links
Download Telegram
Хайлоад. 😄

Это я попросил человека нафлудить 60к сообщений в чате твича, и у меня 1.7кк запросов к редису на это тригерится, и 60к+ к постгресу.

Нагрузка серверов сильно возврастает в этот момент, но при этом сервера справляются, бот в этот момент продолжает отвечать на сообщения в чате.

Оч доволен тем, как побустил перформанс. Это всё происходит на shared vcpu виртуалках от хетзнера с 4мя ядрами. Думаю с dedicated или просто большим кол-вом ядер — было бы ещё больше по запасу ресурсов.
🔥62
Forwarded from Amado 👻
😭31😁1
Satont.
Хайлоад. 😄 Это я попросил человека нафлудить 60к сообщений в чате твича, и у меня 1.7кк запросов к редису на это тригерится, и 60к+ к постгресу. Нагрузка серверов сильно возврастает в этот момент, но при этом сервера справляются, бот в этот момент продолжает…
А теперь чутка детальнее.

У меня в боте используется куча систем — сборная солянка из разных ботов.
Из-за этого на каждое событие (фоллоу, сообщение и т.п.) происходит на порядок больше действий и, как следствие, — запросов к базе.

🤯 Проблема

Есть такие ребята, которые просто флудят смайликами, сообщениями, наградами — чтобы накручивать активность в сторонних сервисах (типа StreamElements).

Один из таких товарищей недавно отправил ~3 млн запросов. В итоге:

- traefik лёг
- postgres задохнулся
- система трижды падала

🛠 Что сделал для улучшения:

- Свап traefikhaproxy в критичных местах (EventSub webhooks)
Почему Haproxy?
1. без GC
2. без компрессии
3. стабилен под нагрузкой (написан на C)


- Добавил batch-сохранения в базу
1. Раньше: один INSERT на каждое сообщение.
2. Теперь: всё уходит в очередь и раз в X мс заливается в базу одной пачкой через COPY.

Своя либка под это:
👉 https://github.com/twirapp/batch-processor

- Кэширование READ-запросов через Redis
Написал обёртку GenericCacher, которая кэширует по ключу, TTL и умеет делать invalidate. Если в кэше данных нет — вызывается LoadFn, и данные записываются в кэш.
🧱 Пример использования:
c.channelsCache.Get(ctx, channelId)
c.channelsCache.Invalidate(ctx, channelId)

Создания:
go
c.channelsCache = generic_cacher.New[channelmodel.Channel](
generic_cacher.Opts[channelmodel.Channel]{
Redis: redis,
KeyPrefix: "cache:twir:channel:",
LoadFn: repo.GetByID,
Ttl: 24 * time.Hour,
},
)


Результат:

Теперь даже при диком флуде — система не ложится.
Нагрузка снижена, всё живёт.
Да, редис стал принимать на себя на порядок больше, но за-то теперь нагрузки более правильные что-ли, бот даже не теряет во времени ответа на команды в моменте оверлоада системы.

И в целом мы теперь лучше готовы к подключению бота на крупных каналах, где чат летит с такой скоростью, что даже сервер сообщений твича пролагивает из-за этого.
❤‍🔥14👍3🆒21
Есть тут кто по ИП работал?

Хочу вас вопросами подоставать.
👀5
Please open Telegram to view this post
VIEW IN TELEGRAM
https://t.iss.one/savdevops

Канал моего друга, червечка-девопсера.

Подписывайтесь, будет рассказывать вам за реалии современного менеджмента всей той фигнёй что мы пишем.

Пока постов не много, но человек дал кровную клятву развиваться.

На правах антирекламы ерид 133722888005553535.
6
Satont.
Планирую расширять ресурсы твира, и перекинуть всё на hetzner. Напоминаю, сейчас меня хостят бесплатно, один сервак всего. Докинуть ресурсов не могу. А ресурсы порой кончаются, например сейчас в пике может 12гб оперативки потребляться из 16ти. В какой-то скорый…
Сегодня оплатил сервера.

Напоминаю, что по желанию вы можете поддержать твир и мою работу.
Всем спасибо, кто продолжает быть подписаным на бусти. 🥹
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥8😘4🍾2😁1
Forwarded from suhodolskiy
Делюсь простым инструментом для бэкапа, которым пользуюсь сам на всех своих проектах.

Основной функционал:
1. Позволяет настраивать регулярные дампы и может сохранять их локально или отправлять в облачные хранилища (S3, Google Drive, Azure, Nextcloud и другие).
2. Поддерживает множество популярных СУБД из одного контейнера.
3. Есть интеграции с Email, Slack, Telegram и другими сервисами для отправки уведомлений о статусе бэкапа.
4. Поддерживает сжатие, шифрование и автоматическое удаление старых резервных копий.

Рекомендую, детальнее тут: https://github.com/tiredofit/docker-db-backup
4❤‍🔥1👍1
Вчера крутая-лучшая-суперская винда высрала 2 блюскрина, и поломала ключи для secure-boot каким-то образом.

Из-за этого пришлось выписывать новые ключи в биосе, и у меня поломался линукс из-за этого, видимо потому что загрузик был подписан другими ключами.
Ну ладно, разобрался, переустановил grub (перед этим попробовав systemd-boot, refind).

Пришлось 1.5-2 часа разбиратья с этой всей фигнёй, вместо того чтобы быть счастливым и купить мак за 500-1000к.

Хотя главный минус мака для меня это отсутствие тайлинга нормального, yabai кал. 😠
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥5
13
Добавил ClickHouse в twir.app! 🚀

Пока записываю туда только:
- сообщения с чата

- использование команд
Что дало:
1. почти моментальный count() квери.

- использование смайликов
Что дало:
1. почти моментальный count().
2. меньший размер таблички.
3. быстрое аггрегирование таймсерии для смайлов, для года данных — 30мс с клиента, а это значит общее затраченное время на запрос, нетворк раундтрипы, скан, вообщем весь цикл.
4. быстрая выборка топа, истории.

Есть ещё что туда писать, но пока не переделывал.

Подтюнил конфиг чтобы не писалось гигибайты логов, а то на работе есть некоторые таблички логов, которые вестя 70гб. Можно было бы просто выставить ttl, но мне пока эти данные не нужны.

Так же человек с чата подсказал на счёт того, чтобы для колонок использовать тип данных LowCardinality(String) на часто повторяющиеся строки, что уменьшило их размер на диске в разы. Не знаю даёт ли это что-то в перформансе.

Мигрировал данные из постгреса очень легко, просто выполнил:
INSERT INTO chat_messages
SELECT *
FROM postgresql('postgres:5432', 'twir_prod', 'chat_messages', 'twir', 'twir');

INSERT INTO channels_emotes_usages
SELECT id, "channelId" as channel_id, "userId" as user_id, "createdAt" as created_at, emote
FROM postgresql('postgres:5432', 'twir_prod', 'channels_emotes_usages', 'twir', 'twir')


Так как clickhouse очень быстрый, 13млн записей загрузилось что-то типо за 2 секунды.

Пока ограничил ему 2cpu и 3GB ram, что коненчо же смешно для клика, но больше гига оперативы он не потребляет на моих размерах.

Из ещё заметных плюсов — мне наконец пригодился паттерн репозитория, потому как из изменений я лишь написал репозиторий кликхауза, а интерфейсы и бизнесовый код никак не поменялся.

Прикрутил opentelemetry к клиенту клика, могу видеть query, их время.
7❤‍🔥41🦄1
Satont.
Добавил ClickHouse в twir.app! 🚀 Пока записываю туда только: - сообщения с чата - использование команд Что дало: 1. почти моментальный count() квери. - использование смайликов Что дало: 1. почти моментальный count(). 2. меньший размер таблички. 3. быстрое…
С метриками чутка пришлось повозиться, потому как из коробки клиент не имеет инструментария внятного, но всё же всё работает как я хочу.

Даже для batch запросов могу видеть сколько rows было внесено.
❤‍🔥7
Satont.
Добавил ClickHouse в twir.app! 🚀 Пока записываю туда только: - сообщения с чата - использование команд Что дало: 1. почти моментальный count() квери. - использование смайликов Что дало: 1. почти моментальный count(). 2. меньший размер таблички. 3. быстрое…
Ещё из прикольного — у меня для создания\запуска миграций используется собственная cli.

Докинул туда clickhouse, и теперь одним и тем же способом могу создавать\запускать миграции для этих бд.

Отвечая на вопрос вообще ПОЧЕМУ было принятно решение мигрировать эти данные из postgres:

Первая
Это аналитические данные, они чаще пишутся, чем читаются., и никогда не изменяются.
А так как пишутся они ну очень часто (на каждое сообщение с чата), то это создаёт лишнюю нагрузку постгресу, чего я бы хотел избежать.
Постгрес на инсерты делает очень много операций к диску, чем кликхауз не злоупотребляет.
Таким образом я скину большую часть нагрузки с постгреса. Когда накопится больше данных — покажу графики с графаны, но я уже вижу улучшения.

Вторая
Я просто хочу чуть глубже поиспользовать ClickHouse. Twir всегда был тем проектом, где я обкатываю технологии для себя, если нахожу им пременением. Мне кажется тут хорошее применение.

Добавил партишены на даты, и данными можно очень быстро оперировать при выборках.
❤‍🔥102👍2
Тестят новый рефрешнутный ui, хотя недвано совсем обновились с старого убогого.

Это дизайн с их вечно beta редактора Fleet.

Прикольно выглядит, мне нравится.
Пока только в 2025.2 EAP, не в релизе.

https://blog.jetbrains.com/platform/2025/06/testing-a-fresh-look-for-jetbrains-ides/?ref=dailydev
❤‍🔥52👎2🆒2
РКН, мой любимый РКН.

Они стали блочить Cloudflare, Hetzner, и потому пришлось для Российских юзеров взять сервер, и направить главный домен twir.app на него, с которого уже идёт прокси до hetzner.

То есть сейчас user -> proxy server -> hetzner proxy service -> service.

Соответственно я теряю сразу бенефиты Cloudflare по rate limit, anti-ddos, auto ssl, cache, anti-ai scrapping, font/img cdn optimization, фронтовые метрики аналитику (и вообще метрики) в числе которых: LCP, CLS, INP, pages visits, pages views, стата по странам и вот это всё, и кучу всего сверху, включая S3.

Очень здорово, круто. Спасибо РКН!

Теперь придётся больше селфхостить, больше париться.
4😡2
Размер зависимостей Twir.
Golang vs JavaScript.

Лицо чела, который решил законтрибьютить без интернета нормального — представили?
❤‍🔥3😁1
Кто бы мог подумать.

Пока без подробностей от автора, но видимо его подписывали на одни условия, а потом продиктовали другие. Кто-то верит, что с nuxt будет иначе? Я — нет.

Если кто не шарит — это автор swc, одного из быстрейших бандлеров и парсеров js, написанный на rust. Его использует под капотом turbobuild.