Notice: file_put_contents(): Write of 20899 bytes failed with errno=28 No space left on device in /var/www/tgoop/post.php on line 50
Эшу быдлокодит@eshu_coding P.187
ESHU_CODING Telegram 187
Палантир. Часть 2. Жизненный цикл команд.
#палантир@eshu_coding

Как я уже упоминал, мой сборщик построен на микросервисной архитектуре: центральный сервер - master для хранения информации, находящийся над БД (postgresql) и slave-ы сборщики, в некотором количестве.

В master-е генерируются приказы: загрузить историю из определенного чатика/канала или проверить наличие чата для дискуссий у канала.

И как только пошла +- боевая нагрузка, я начал собирать грабли за граблями. Казалось бы, логика работы простая:
1. Чекаем базу, если есть чаты или каналы, которые давно не обновлялись - создаём приказ на обновление.
2. Сборщик берет приказ, пытается выполнить его.
З. Если приказ не может быть выполнен каким-либо сборщиком (лимиты телеги на спам например) - приказ возвращается "на базу", авось кто сможет выполнить.

Всё логично? Но если счёт приказов идёт на десятки тысяч, достаточно быстро возникает "шторм" из невыполнимых приказов: сервисы перебрасываются ими 99% времени.

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

Через какое-то время я обнаружил, что полезли дубли в засосанных сообщениях. Сначала нашел небольшой баг в сборщике, пофиксил. А следом началась чертовщина: дубли никуда не делись, их стало только больше.

Выяснилось, что при рабочей нагрузке возникает ситуация, когда приказ уже ушел на исполнение, данные грузятся, грузятся, грузятся, попадают в длииинную очередь. В это время приходит время генерации следующей партии приказов, генерится дубль уже выполняющегося и отправляется на исполнение другому сборщику. Как результат - число дублей в какой-то момент дошло до 25%.

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

Но вылезла другая проблема: "узкий" запрос на получение чатика от канала имеет один счетчик флуда с простым поиском юзера/канала по юзернейму. В итоге у меня сеть перестала расти, т.к. сборщики исчерпывали свой суточный лимит запросов буквально за час.

Будь у меня один сборщик - проблем бы не было, т.к. вся нужная для доступа информация сохраняется в сессии. Но у меня их несколько, потому, чтобы получить доступ к каналу/чату первый раз нужно сделать поиск.

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

Вся система стала работать как часы, производительность сборки улучшилась... И тут всплыла проблема ограниченной памяти сервера: если все сборщики одновременно натыкаются на огромные каналы/чаты база перестает справляться с нагрузкой на запись, потребление оперативки растет, что в итоге засталяет линукс sacrifice cild убить или postgres или master сборщика.

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

Продолжение следует...

P.S. В итоге у меня приказы возвращаются ограниченное количество раз, а поиск по юзернейму случается только когда предыдущие несколько сборщиков вернули запрос. Кроме того менеджер приказов анализирует очереди и при необходимости выдает slave-ам команду "поспать".
👍1



tgoop.com/eshu_coding/187
Create:
Last Update:

Палантир. Часть 2. Жизненный цикл команд.
#палантир@eshu_coding

Как я уже упоминал, мой сборщик построен на микросервисной архитектуре: центральный сервер - master для хранения информации, находящийся над БД (postgresql) и slave-ы сборщики, в некотором количестве.

В master-е генерируются приказы: загрузить историю из определенного чатика/канала или проверить наличие чата для дискуссий у канала.

И как только пошла +- боевая нагрузка, я начал собирать грабли за граблями. Казалось бы, логика работы простая:
1. Чекаем базу, если есть чаты или каналы, которые давно не обновлялись - создаём приказ на обновление.
2. Сборщик берет приказ, пытается выполнить его.
З. Если приказ не может быть выполнен каким-либо сборщиком (лимиты телеги на спам например) - приказ возвращается "на базу", авось кто сможет выполнить.

Всё логично? Но если счёт приказов идёт на десятки тысяч, достаточно быстро возникает "шторм" из невыполнимых приказов: сервисы перебрасываются ими 99% времени.

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

Через какое-то время я обнаружил, что полезли дубли в засосанных сообщениях. Сначала нашел небольшой баг в сборщике, пофиксил. А следом началась чертовщина: дубли никуда не делись, их стало только больше.

Выяснилось, что при рабочей нагрузке возникает ситуация, когда приказ уже ушел на исполнение, данные грузятся, грузятся, грузятся, попадают в длииинную очередь. В это время приходит время генерации следующей партии приказов, генерится дубль уже выполняющегося и отправляется на исполнение другому сборщику. Как результат - число дублей в какой-то момент дошло до 25%.

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

Но вылезла другая проблема: "узкий" запрос на получение чатика от канала имеет один счетчик флуда с простым поиском юзера/канала по юзернейму. В итоге у меня сеть перестала расти, т.к. сборщики исчерпывали свой суточный лимит запросов буквально за час.

Будь у меня один сборщик - проблем бы не было, т.к. вся нужная для доступа информация сохраняется в сессии. Но у меня их несколько, потому, чтобы получить доступ к каналу/чату первый раз нужно сделать поиск.

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

Вся система стала работать как часы, производительность сборки улучшилась... И тут всплыла проблема ограниченной памяти сервера: если все сборщики одновременно натыкаются на огромные каналы/чаты база перестает справляться с нагрузкой на запись, потребление оперативки растет, что в итоге засталяет линукс sacrifice cild убить или postgres или master сборщика.

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

Продолжение следует...

P.S. В итоге у меня приказы возвращаются ограниченное количество раз, а поиск по юзернейму случается только когда предыдущие несколько сборщиков вернули запрос. Кроме того менеджер приказов анализирует очереди и при необходимости выдает slave-ам команду "поспать".

BY Эшу быдлокодит


Share with your friend now:
tgoop.com/eshu_coding/187

View MORE
Open in Telegram


Telegram News

Date: |

For crypto enthusiasts, there was the “gm” app, a self-described “meme app” which only allowed users to greet each other with “gm,” or “good morning,” a common acronym thrown around on Crypto Twitter and Discord. But the gm app was shut down back in September after a hacker reportedly gained access to user data. On Tuesday, some local media outlets included Sing Tao Daily cited sources as saying the Hong Kong government was considering restricting access to Telegram. Privacy Commissioner for Personal Data Ada Chung told to the Legislative Council on Monday that government officials, police and lawmakers remain the targets of “doxxing” despite a privacy law amendment last year that criminalised the malicious disclosure of personal information. It’s yet another bloodbath on Satoshi Street. As of press time, Bitcoin (BTC) and the broader cryptocurrency market have corrected another 10 percent amid a massive sell-off. Ethereum (EHT) is down a staggering 15 percent moving close to $1,000, down more than 42 percent on the weekly chart. Avoid compound hashtags that consist of several words. If you have a hashtag like #marketingnewsinusa, split it into smaller hashtags: “#marketing, #news, #usa. Don’t publish new content at nighttime. Since not all users disable notifications for the night, you risk inadvertently disturbing them.
from us


Telegram Эшу быдлокодит
FROM American