Stress тестирање
Stress пакет. Чеканни app делова чија неуспеха коста корисници новца — главни copy трговање — са враћа, рандомизована, fault-injected радног оптерећења. Потврди систем остаје исправна. Живи у tests/StressTests, покрена у нормално dotnet test зелена врата.
Приступ — Детерминистички Симулација Тестирање (DST)
Најбољи начин stress дистрибуирана финансијска систем = детерминистички симулација тестирање, per TigerBeetle, FoundationDB, Antithesis: покренута прави логика против симулирана света, вози са сеедована рандомна радно оптерећење + injected грешка, потврди инваријанти на умирити. Све сеедована + детерминистички → било грешка репродукције тачна од сеед. Комбиновано са:
- Chaos-engineering fault injection (Netflix Chaos Monkey стил) — веза капи, налог одбитке, token ротација, node смрт.
- Property-based инваријанти — не потврди тачна позива секвенце; потврди својства која мора задржи без обзира на како догађаји interleave (конвергенција, без сирот, at-most-one lease власник).
App већ дослова доставља савршена DST света модел: FakeTradingSession, cTrader-верна in-memory Open API сесија. Stress пакет поновна користи то (повезана, једна извор истине) не mock, тако симулирана брокер понашање као прави.
Шта то покрива
Copy трговање (примарни фокус)
Вождена via CopyDstWorld (tests/StressTests/CopyTrading/), покрена live CopyEngineHost против fake сесија, издаје членство-конзистентна source радно оптерећење:
| Сценарио | Стреси |
|---|---|
Mass_fan_out… | 1 source → 80 одредишта, 150 отвора затим затворе; пуна fan-out + цедач |
High_frequency_open_close… | 300 брзо interleaved отварање/затварање; не пропушта позиције |
Partial_close_and_scale_in_storm… | partial-close + scale-in трн; етикета-скуп стабилност |
Connection_flap_storm… | поновљена socket раскид/поновна веза + mid-flight desync; resync конвергенција |
Order_rejection_cascade… | a подмножи одбија сваки налог; здрав одредишта неутицај, затим self-heal via resync |
Token_rotation_storm… | брзо in-place token размени током налог буја |
Randomized_chaos_workload… (10 семена) | the DST core — сваки событај тип + сваки грешка interleaved непредсказиво |
CopyLeaseReclaimStressTests | node смрт + lease reclaim кроз скалирана кластер (чиста домена, FakeTimeProvider) |
Конвергенција инваријанта. На mirno, сваки здрав одредишта огледала тачна скуп од јако-отварање source позиције — без сирот, ничегов недостаје. Потврди на етикета скуп (scale-in законито отварање други одредишта позицију под исто source етикета, тако дупла етикета очекивано). Одредишта тренутно одбијање налози дозвољено да lag, умирити једном здрав.
Lease инваријанта. У кластеру где node смрт + оживе на сеедована распоред, at most једна node икад держи важећа lease на профилу; мртав node-а lease lapses тачна при истеку, добија reclaim; здрав кластер нагоди са сваким профилом держи тачна један node. Огледала CopyEngineSupervisor-а захтев предикат против CopyProfile домена lease методи.
Thread-безбедност од harness
FakeTradingSession једна-threaded; stress радно оптерећење мутира то од тест нит док host чита/пишет од њеног петље. SyncTradingSession обвија то, чини сваки сесија операција атомски на једна врата (без держања врата кроз reconnect callback — би инвертована lock ред против host-а _stateGate и deadlock). Симулатор сам себе лево неприкоснута.
Грешке пронађена
- Стартап resync трка у
CopyEngineHost.OnReconnectedелектрична пре почетна reference-load + прва resync, која трчала без_stateGate. Socket флап током стартап трча други resync конкурентно, коруптна host-а non-concurrent стање речници (_symbolDetails,_sourceVolumes). Исправљено: покренута стартап load + прва resync под врата. Производља трка, не тест артефакт — DST chaos радно оптерећење површина то.
Покренута
dotnet test tests/StressTests/StressTests.csproj
Пакет серијализована ([assembly: CollectionBehavior(DisableTestParallelization = true)]): сваки тест врта live host фон петље, вози до умирити под wall часовник, тако паралелно покренута морина host задаци и чини конвергенција timeouts колебљив. Радно оптерећење великости до завршити у секундама тако пакет остаје у подразумевано зелена врата. Неуспех штампе њеног сеед; re-run ту сеед да репродукције тачна interleaving.
Проширење
- Нови copy понашање → додајте source опу
CopyDstWorld(задржи source књига членство конзистентна са событај ток) + пондериш случај уCopyChaosDstTests. Ако то може створити или пензионирати одредишта позицију, убедите конвергенција инваријанта јако држи. - Нови грешка → додајте injector
CopyDstWorld(делегатFakeTradingSession-а контролна површина viaSyncTradingSession) + вежбе у названа сценарио плус chaos микс. - Задржи симулатор cTrader-верна (видите корен
CLAUDE.mdмандат); никад ослаби то да прохода stress тест.