Lewati ke konten utama

Stress testing

Suite stress. Hammer app part yang failure cost user uang — chiefly copy trading — dengan hostile, randomized, fault-injected workload. Assert sistem tetap correct. Hidup di tests/StressTests, jalankan di normal dotnet test green gate.

Approach — Deterministic Simulation Testing (DST)​

Best way stress distributed financial system = deterministic simulation testing, per TigerBeetle, FoundationDB, Antithesis: jalankan real logic terhadap simulated world, drive dengan seeded random workload + injected fault, assert invariant di quiescence. Semua seeded + deterministic → failure apa pun reproduce exact dari seed. Combined dengan:

  • Chaos-engineering fault injection (Netflix Chaos Monkey style) — connection drop, order rejection, token rotation, node death.
  • Property-based invariant — tidak assert exact call sequence; assert property yang harus hold tidak peduli bagaimana event interleave (convergence, tidak ada orphan, at-most-one lease holder).

App sudah ship perfect DST world model: FakeTradingSession, cTrader-faithful in-memory Open API session. Stress suite reuse (linked, single source of truth) tidak mock, jadi simulated broker behave seperti real one.

Apa yang itu cover​

Copy trading (primary focus)​

Driven via CopyDstWorld (tests/StressTests/CopyTrading/), jalankan live CopyEngineHost terhadap fake session, issue membership-consistent source workload:

ScenarioStresses
Mass_fan_out…1 source → 80 destination, 150 open kemudian close; full fan-out + drain
High_frequency_open_close…300 rapid interleaved open/close; tidak ada leaked position
Partial_close_and_scale_in_storm…partial-close + scale-in churn; label-set stability
Connection_flap_storm…repeated socket disconnect/reconnect + mid-flight desync; resync convergence
Order_rejection_cascade…subset reject setiap order; healthy destination unaffected, kemudian self-heal via resync
Token_rotation_storm…rapid in-place token swap during order storm
Randomized_chaos_workload… (10 seeds)DST core — setiap event type + setiap fault interleaved unpredictably
CopyLeaseReclaimStressTestsnode death + lease reclaim melintasi scaled cluster (pure domain, FakeTimeProvider)

Convergence invariant. Di rest, setiap healthy destination mirror exactly set dari still-open source position — tidak ada orphan, tidak ada missing. Asserted pada label set (scale-in legitimately buka second destination position di bawah sama source label, jadi duplicate label expected). Destination saat ini reject order allowed lag, reconciled sekali healed.

Lease invariant. Di cluster di mana node mati + revive pada seeded schedule, at most satu node pernah hold valid lease di profile; dead node lease lapses exact di expiry, get reclaimed; healthy cluster settle dengan setiap profile held oleh exact satu node. Mirror CopyEngineSupervisor claim predicate terhadap CopyProfile domain lease method.

Thread-safety dari harness​