Як шматагентныя сістэмы перажываюць пікі трафіку: трохузроўневы кантракт
Як утрымаць шматагентную сістэму пры дзесяціразовым скачку трафіку: брамнік чаргі, абмежаванне частаты для кожнага інструмента і сінхронныя праверкі палітык, а таксама метрыкі і дэма піка.
Крыніцы: Multi-Agent Orchestration in Production: Handling Traffic Spikes at Scale
Граф агентаў можа справна працаваць пад 10 запітамі за секунду, але зламацца пад 100. Запіты накапліваюцца, перагляд правіл прыпініваецца, вызовы інструментаў ствараюць суперсцяжэння, і сістэма, якая здавалася надзеямі, ператвараецца на абярону. Агенты рэдкая прычына проблем. Недастатак — чыстае дагадка між кялём, шаром оркестрацыі і правіламі. Большасць команд адкрывае гэты прынт толькі тады, калі вялікі трафік ужо пачынае на яго вплываць.
Чаму сплескі трафіку прыходзяць раней, чым чакалася
Сістэмы агентаў пакідаюць стадыю дэмавання і пераходзяць у рэальную працэю, таму сплескі ўжо не ўнікаемы: раптовы распродацыя, функцыя, якая стае популярной, запланаваная пакетная задача, або проста кожны корыстувач, які запускае API у вторак ураначы. Калі навантажэнне вырастае, адбываюцца два явышчыны адразу.
Перша — маршрутазацыя вядзецца у рэальны час. Выбіранне таго, канферэнт агент разглядае запіт, або адлік, чы робіць яго чакаць у кяле, — гэта вімерліва праця.
Паўтора, сістэмы часта перастаюць працаваць пад тыччунам. Зазвычай гэта не спантаныя дзеянні інжынераў, якія ігнаруюць перакананні. Гэта наўважная обработка аблыкаў, якая па замовчанню разрашае дзеянні пасля выканання тайма-аўтамату, або альтэрнатыўны маршрутызацыйны механізм, які тыха прыхоўчуе перакананні пра правамернасць. Калі пад высокай навантажэннем знікае адбавленне правілаў, зазвычай прычыной ёсць гэты архітэктурны анты-патэрн, а не втручанне чалавека.
Рашэннем яўнае, выконвальнае абавесце між трыма стакантамі: кялём (што прайходзіць), графам оркестрацыі (куды ён праходзіць) і дварчым механізамам (што ён можа рабіць). Дасягніце гэтага абавесця з самага пачатку, і раптовы сплеск навантажэння стане рашаным прыблыкам, а не надзвычайная сітуацыяй.
Контракт з трыма слоямі
Слой 1: кялё як страж
Кялё — гэта перша адзінка, дзе адбавляюцца правілы. Перш чым будзь-якае запроса дасягне агента, яна праходзіць перакананне контракта, якое абыходзіце тры аспекты:
- Прыорытэт. Запыткі не ўсе равныя. Інтэрактыўныя запыткі корыстувача можаць мець вышэйшы прыорытэт чым пакетныя заданні, а кліент, які плаціць, можа працаваць раней чым кліент у безкоштовнай версіі. Чатыргаў павінен кераваць такім ранжыраваннем, ўжо таму, карэспандэнты ніколі не павінны пра гэта ведаць.
- Ліміты шчырыні і квоты. Адмова ёсць найдэшавшы варыянт пры тым, калі ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё
Пасля таго, як запіт быў дадзен у чэргу, сістэма керування выбірае яго пункт прызначэння і тое, што яму дазволена робіць. Тут таксавана канкурэнція і доступ да інструментаў.
Контракт маршрутацыі адпавядае на калькі пытанняў. Калькі група агентаў должна кераваць запытом – напрыклад, швыя агенты для простых запытанняў і медленнейшыя для складных расчынэнняў? Калькі запытанняў можа адразу обрабацваць кожны агент? Што будзе, калі всі агенты зайняты: запыт зачакае ў чэрзі, будзе адхілены чы будзе пераведэны на альтэрнатыўны спосаб?
Контракт рэгулювання інтэнсівнасці інструментаў усвядомляе, што інструменты разныя. Выклік зовнішньага API сто разоў за секунду зовсім не тое ж, што запуск локальнага інструменту. Кожны інструмент мае свой ліміт канкурэнціі. Інструмент, які базуецца на базе дадзенаў, можа дазволіць дзесяць одночасных выклікаў, тады як інструмент, які выкарыстоўвае API трэцьей стороны, можа дазволіць пяць. Калі інструмент досягае свага ліміту, запыт чакае ў яго сабэйшай чэрзі, а не ў галоўнай.
Ёжы прытамуліваць працэс гэтых інструментаў і запобегчы ўскладненням, прымітывы высокага стандарту дапамагаюць:
- Спецыяльныя механізмы захісту і кантэйнеры для токенаў шырока фіксуюць абыякавасці на роўні інструментаў, чыгунна запобiegаючы надмерным спробам зворачнага выканання, калі якая-небудзь залежнасць перапоўнена.
- Колекцыі для некорэктных або заражаных дадзеных зберагаюць такія пакеты, таму адзін неякісны запіт ніколі не зупініць усю цягу аперацый агента.
- Кантэйнеры з прытамулёнай працэсам выканання дапамагаюць прыменяць адпаведныя ліміты швайна для кожнага інструмента, што захоўвае паралельныя запускі агентаў ад зусібных абмежэнняў.
За дапамогою гэтых механізмаў бутлнэкі на роўні інструментаў застаюцца пад контролем і ўвіднымі, і не распространяюцца на ўсю сістэму. Абавязак гэтага роўна: запыт падаецца агенту, у якога ёсць вільная магчымасць, кожны інструмент сябе прыглядае да свага ліміту паралельнага выканання, а калі інструмент перапоўнены, запыт чакае на інструмент, а не на агента.
Роўн 3: правілы, якія ніколі не змінююцца
Складна частка заключаецца ў тым, што правілы павінны выконвацца ў кожны момент, включаючы пад высокай навантажэннем. Не існуе варыянта «пераглядзіць пазней» чы «гэта выглядае безпечна».
У даговорэ правіла ёсць чатыры пункты:
- Перакананне правіла выканваецца перад кожным вызовам інструмента, сінхронна і з блокаванням.
- Гэта перакананне ёсць дасканальным — не болейш чым калькі мілісекунд. Калі не так, значыць праект абяроўнены.
- Калі перакананне не выйшла, запіт таксама не выйшаў. Агент не мае можлівасці прабаваць знову чы весты кантакты.
- Неудачы фіксуюцца і стэжыцца за німі, а падысканне колькасці неудач у правілах сама по сабе ёсць сігналам.
Тыповыя правілы выглядаюць так: агент можа выкарыстоўваць толькі інструменты, пазначаныя як «толькі для чытання» для данага карыстальніка; інструмент можа працаваць толькі для аўтэнтыфікованага абэранта; агент можа выконваць не болейш пяці вызоў інструментоў за адну запытку. Слой гарантуе, што перад кожным вызам інструмента адбываецца перакананне, і што правілы ўжоць шырокія, дэтэрміністычныя і абсалютныя.
Форма канвею
У мінімальным псэудаграфе запытка праходзіць праз кантролер канцэлеры, далей да рутэра, прабіваецца да агента, а кожны выз інструмента перад выконаннем праходзіць праз прыменэнне правілаў і рэгуляванне па кожным інструменту.
[ Incoming Request ]
│
▼
[ Queue Gatekeeper ]
• Validate Schema
• Enforce Rate Limits
• Assign Priority
│ (Pass)
▼
[ Orchestration Router ]
• Check Agent Capacity
• Route to Target Node
│
▼
[ Tool-Level Gate ]
• Sync Policy Check
• Per-Tool Concurrency Limits
• Circuit Breaker / DLQ
│ (Pass)
▼
[ Tool Execution ]
Важным моментам ёсць тое, дзе прыкладзяюцца правілы. Яны дыяюць на рэвэле інструментоў, а не на рэвэле агентаў, што не дазволяе агентам віпадкова іх айсці, выкорыстоўваючы інструменты некалькі іншым спосабам.
Сцэнарый рэзкага адвароту, з контрактом і без яго
Уявіце сабе агента падтрымкі кліента, які можа шукаць замовленні, обрабоцваць вярненні грошаў і адправляць электраняны, а напраўленасць раптам зростае у дзесяць разоў.
Без контракту проблемы развіваюцца паэтапна:
- Прыходзячыя запыткі выкараняюць запас доступных агентаў.
- Агенты пачынаюць ставіцца ў чэргу на выкорыстоўванне інструментоў, і інструмент send_email накаплівае 500 запыткаў, якія чакаюць на обрабоцу.
- Служба адправкі электраняных пачынае выкананне тайма-аўт.
- Агенты прабуюць зноў, тады ўсё 1,000 запыткаў застаецца ў чаканні.
- Актываюцца шляхі выкарыстоўвання у разы працоўнай немагчымасці. Тайма-аўты або перавантажаныя альтэрнатыўныя маршруты айсця прыменэнне правілаў, каб заставіць сістэму доступной.
- Агент апляюе электрана пра вярненне грошаў некаторам іншам кліенту.
За наявнасці кантракту той жа сцэнарый развіваецца інакш:
- Сістэма кантролю ягошчэння рэгулюе прыемку запыткаў па прыорытэту і квотам.
- Рутэр бачыць, што інструмент для апляювання электрана досяг свайго ліміту адразу дзесяці запыткаў, і ён ставя на чэргу наступныя запыткі да самага інструмента, а не да агента.
- Правілы пераказваюцца з кожным вызывам інструмента. Калі агент прабуе апляюваць вярненне грошаў некаторам іншам кліенту, пераказ не успехоўваецца і запыткі адхоўваюцца.
- Сістэма застаецца стабільной. Час адпаведзення зрастае, але надзеянасць працы не падваіцца.
Аднаўленне ўсьго разам
Пачніце з LangGraph
Команда, якая ужо працуе з LangGraph, мае большую частку прымітыў. Агенты і інструменты ўтвараюць вузлы, а рэшткі — выборы маршруту; умовныя рэшткі выбіраюць маршрут на адповіднае стана. Неабходна ўстановка кяліна перад сабой — будзь то Redis, RabbitMQ чы проста кялін у памяці, а таксама прыемнік правіл, які абгружае вызовы інструментаў.
Сам прыемнік правіл можа быць невялікім дэкаратарам, які выкананае перакананні і выклікае памылку наявнасці правалянняя пры тым, як функцыя інструмента ўжо не будзе выкананае.
from functools import wraps
from typing import Callable, Any
class PolicyViolation(Exception):
"""Raised when policy check fails."""
pass
def enforce_tool_policy(
policy_fn: Callable[[str, dict], bool]
):
"""Sync tool execution guardrail."""
def decorator(func: Callable):
@wraps(func)
def wrapper(*args, **kwargs):
tool_name = func.__name__
context = kwargs.get(
"request_context", {}
)
# Must fail closed
if not policy_fn(tool_name, context):
raise PolicyViolation(
f"Denied: {tool_name}"
)
return func(*args, **kwargs)
return wrapper
return decorator
# Example Usage
def strict_policy_check(tool_name: str, context: dict) -> bool:
if not context.get("is_authenticated"):
return False
if (context.get("role") != "admin" and tool_name.startswith("execute_")):
return False
return True
@enforce_tool_policy(strict_policy_check)
def execute_refund(
order_id: str,
amount: float,
request_context: dict = None
):
# Downstream API call
return f"Refund ${amount} sent: {order_id}"
Зьвярзіце меры
Дастаткова толькі рэалізацыя і надзея. Неабяжна таксаванне і стаўленне за ўсім:
- Глыбіна очаквання ў кожным слое.
- Як часта і якія інструменты досягаюць сваіх мерагоў.
- Чы рэгламенты адхоўляюць запіты і чаму.
- Затрымкі p50, p95 і p99, якія фіксуюцца окрэма для разных тыпаў запітоў.
- Кошт на запіт пад навантажэнням. Калі ён вырастае, значы ёсць якаясь неэфекывнасць.
Скептычны погляд
Можна сказаць, што гэта вялікая канструкцыя для проблемы, якая яшчо не існуе. Сістэма, якая апрацоўвае дзесяць запітоў за секунду і застанецца такой, яе не патрэбуе. Рэч інакшая, калі мова пра функцыю, якая можа стаць популярной, або пра корпаратыўных кліентаў з непрадбачуемым трафікам; тады праектаванне павінна быць завершанае ўжо перад запускам.
Стварэнне такой сістэмы заранее коштае мало, у пораўнанні з ўдосконаленнем яе пасля таго, як падвышаны навантажэння зламалі ўсю структуру. Таксама не трэба яе перастраіваць занадта. Простая очэрэдзь, функцыя перагляду правіл і ліміты одночаснай працы для кожнага інструмента дапамагаюць рашыць большасць проблем, выступаючых пад высокім навантажэннем. Не патрэбны ні алгорытмы распраўленага кансэнсусу, ні прогназірувальнікі навантажэння на аднойчынні. Галоўнае — чыстасця формуліравання і чыткія абмежэнні.
Галоўныя моменты
- Падвышаны навантажэння адкрываюць проблемы ў дызайне. Калі сістэма з агентамі зламваецца пад вялікім навантажэннем, самі агенты не ўстаюць у вялікія затрымкі. Ніхто не задаў чыткіх правіл ўсуперак тому, як очэрэдзь, маршрутызацыя і правілы должны взаімаўзаімацца.
- Очэрэдзь таксама служыць пунктом адбыцця правіл. Яна можа пераверываць, прыорытэзаваць і адхіляць запіты, тады вычыслювальныя рэсурсы не будуць марнаваны.
- Правілы ёсць абсалютнымі і не падлягаюць пераговорам. Яны выконваюцца на рэвэлі інструмента, сінхронна, ў кожны раз, без жадных аўтаматызацый.
- Спачавайце інструменты раней, чым агенты. Узгорткі зазвычай знаходзяцца ў ніжней частці ланцоўка, у зовнішніх API або базах дадзеных, якія задаюць кантэкст агенту, а не у прадаўцы LLM.
- Замерайце все: глыбіну чэргі, канкурантнасць інструментоў, адказы на правілы, пэрцэнтыляі затрымкі і косць за кожны запіт. Тое, што не замеранае, не можа быць паспрабавана для паслаблення.
З чаго пачаць
- Запісайце умовы чэргі: што прыймаецца, а што адхіляецца.
- Запісайце умовы маршрутацыі: якія агенты адпавядаюць за якія заведаменні, і якія ёсць меры канкурантнасці.
- Запісайце умовы правілаў: якія пераказы выкананыя перад кожным вызывам інструмента.
- Створыце ўсё гэта за дапамою такога програмнага апарату, як LangGraph, дадаце шар чэргі і загорніце інструменты ў пераказы правілаў.
- Адрабоўваце тэсты на навантажэнне. Сімулюйце дзесяцікратны адзростак навантажэння і старайцеся з’ясавіць, што можа зламацца.
Усё гэта лепш адрабатваць да пачатку вырабоцтва, калі ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё ўсё