NDDev Dev — басты бет
Қауымдастық
Тіл: Қазақша
Көрініс
Тема
Анимация

NDDev бэкенді қалай құрылған: Rust, бір дерекқор және әкімшілік панельдің орнына агент

Жарияланған күні
Жаңартылған күні

NDDev-тің бес тілдегі алты сайты, өтінім формалары, кездесуге жазылу, ассистент және материалдарды жариялау бір ядрода жұмыс істейді. Төменде оның негізіндегі шешімдер мен оларды неліктен қабылдағанымыз туралы.

Rust-тағы модульді монолит

Ядро — үш қабаттан тұратын бір Cargo workspace. domain енгізу-шығарусыз ережелерді сипаттайды: ревизия, жариялау немесе өтінім деген не және қандай күй ауысулары рұқсат етілген. infrastructure PostgreSQL мен сыртқы сервистерге жауап береді. api HTTP, CLI және MCP береді. SEO мен бақылау өз дерекқорлары бар жеке Rust сервистеріне шығарылған: олардың өзгеру ырғағы да, істен шығу түрі де басқа.

Стек — Rust 1.99, Tokio, axum, SQLx және PostgreSQL. Идентификаторлар — UUIDv7: оларды қосымша жасайды және олар жасалған уақыты бойынша реттеледі.

Әкімшілік панельдің орнына агент

Платформада визуалды CMS жоқ. Иесі мен оның агенттері оны командалар арқылы басқарады: CLI, HTTP API және MCP бір командалар қабатын шақырады. Әр команда типтелген, құқықтарды тексереді және идемпотенттілік кілтін қабылдайды — сол кілтпен қайталанған сұрау көшірме жасамай, бұрынғы нәтижені қайтарады. Түзету құжаттың күтілетін нұсқасын көрсетеді: егер құжат өзгертіліп үлгерсе, команда басқаның жұмысын үнсіз қайта жазбай, бас тартады.

Сайттардың байланыс деректері мен жазулары да кодтағы тұрақтылар емес, дерекқордағы ревизиялар. Оларды командамен өзгертіп, контентпен бірге жариялайды.

Бір дерекқор және сенімді фондық тапсырмалар

Барлық күй PostgreSQL-де сақталады. Фондық жұмыс — SEO, аудармалар, сайттарды жинау, хаттар — сол дерекқордағы тапсырмалар ретінде ресімделген: outbox пен inbox, fencing-токені бар тапсырманы жалға алу, қысқа транзакциялар. Мұндай жүктемеге бөлек хабар брокері қажет емес. Сыртқы әсерлер үшін exactly-once уәде етпейміз: сыртқы сервистің нәтижесі тапсырыс берілген жұмысқа және бастапқы деректердің сол жиынтығына жауап берсе ғана қабылданады.

Ревизиялар және жариялау снимок ретінде

Кез келген түзету жаңа өзгермейтін ревизия жасайды. Жариялау нақты ревизиялар мен олардың SEO артефактілерінен пакет жинап, оған буын нөмірін береді. Сайттар осы пакеттің манифесінен құрылады, сондықтан қайта жинау сол беттерді береді. Беттің бұрынғы нұсқасын қайтару үшін оның бұрынғы ревизиясын жариялау жеткілікті — ол еш жерге жоғалмаған.

SEO — жеке сервис

Индекстелетін әр ревизия жеке сервистен SEO жұмысына тапсырыс береді. Модель тақырып пен сипаттаманы ұсынады, жеке редактор-сұрау оларды бастапқы мәтінмен салыстырады, ал Rust дәйексөздерді, сниппет пішінін және ойдан шығарылған бағалар мен метрикалардың жоқтығын тексереді. Canonical, robots, hreflang және schema.org белгілеуі детерминирленген түрде құрылады. Модель қолжетімсіз болса, нәтиже резервтік деп адал белгіленеді және оны тек нақты шешіммен жариялауға болады.

Жариялаушының бақылауындағы фронтенд

Фронтенд — Astro-дағы жеке репозиторий. Ядроның жариялаушысы оны құмсалғышта жинайды: Linux-тың оқшауланған атаулар кеңістіктері, Landlock, желісіз және құпияларға қолжетімсіз. Нәтижені жариялаушы өзі өлшейді де, содан кейін ғана сайттарға шығарады; фронтендтің алдыңғы нұсқасы бір командамен қайтарылады.

Деректер және кідіріс

Ядро Амстердамда жазады, ал дерекқордың синхронды репликасы Қазақстанда жұмыс істейді. Балама нұсқаны өлшедік: жазуды Қазақстанға көшіріп, API-ды Амстердамда қалдырса, дерекқорға әр сұрау шамамен 90 мс кідірісі бар арнадан өтеді. Өтінім жіберу 119 мс-тан 2,58 с-қа, каталогты ашу 61-ден 558 мс-қа, іздеу 55-тен 929 мс-қа дейін өсер еді. Синхронды реплика әр коммитке арна бойынша бір айналым тұрады.

Бақылау

Тректер мен метрикалар OpenTelemetry форматында жіберіледі, бірақ ядроның жұмысы қабылдағышқа тәуелді емес: буферлер шектеулі, ал жинау қолжетімсіз болса, сұраулар қызмет көрсетілуін жалғастырады.

Клиенттік жобалар үшін бұдан не шығады

Бұл архитектураны әр жобаға толығымен көшірмейміз — шағын сайтқа ол керек емес. Бірақ бірнеше ережені барлық жерде қолданамыз: жүйе бөліктері арасындағы айқын келісімшарттар, жоғалтуға немесе екі рет қолдануға болмайтын өзгерістер, production-дағы өлшенетін мінез-құлық және деректерді қолмен түзетпей бұрынғы нұсқаға қайту.

Көмекші

Көмекші жүктелуде…