Skip to main content

Οριζόντια κλιμάκωση

Το cMind κλιμακώνεται με ελάχιστη προσπάθεια διαχειριστή. Δύο κατάστατοι φορτία — εκτέλεση/backtest διαπραγμάτευση, αντιγραφή-διαπραγμάτευση — και τα δύο χρησιμοποιούν βάση δεδομένων ως συντεταγμένης σημείο, έτσι προσθέτοντας αντίγραφα δεν απαιτεί εξωτερικό συντονιστή (χωρίς ZooKeeper, χωρίς εκλογή αρχηγού).

Αντιγραφή-διαπραγμάτευση (αυτο-θεραπεία μίσθωμα)​

Κάθε κόμβος εκτελεί CopyEngineSupervisor (περιφραγμένα σε App:Copy:Enabled). Κάθε συμφωνίας κύκλο, επιβλέπων:

  1. Διεκδικήσεις κάθε τρέχουν profile αδιευθυντή ή μίσθωμα-λήγει, σε ένα ατομικό UPDATE — δύο ανταγωνιστικές επιβλέποντες ποτέ αμφότερα διεκδικούν ίδιο profile, έτσι profile αντιγράφηκε από ακριβώς έναν κόμβο (χωρίς διπλό παραγγελίες).
  2. Ανανεώνει μίσθωμα σε profiles κεντρικός υπολογιστής του.
  3. Κεντρικός υπολογιστής αναθέτηκε profiles, ώθηση πρόσβαση-token περιστροφών να τρέχουν κεντρικός υπολογιστής σε-θέση (χωρίς γεγονός-ροή αφοδεύει).

Κόμβο crash → σταματά ανανέωση. μόλις App:Copy:LeaseTtl περάσει, κάθε επιζών κόμβο ανακτά τα profiles του επόμενη κύκλο, οικοδομές κατάσταση από συμφωνία χωρίς διπλότυπα συναλλαγές. Κλιμάκωση έξω = προσθήκη αντίγραφα. αδιευθυντή/ελεύθερη profiles σηκώθηκε αυτόματα.

Ομαλό κλιμάκωση-σε / έλασης ανανέωση (S1) = σε SIGTERM, CopyEngineSupervisor.StopAsync απελευθερώνει τη μίσθωμα του κόμβου (AssignedNode/LeaseExpiresAt → null) έτσι επιζών ανακτά τους τα πολύ επόμενο συμφωνίας κύκλο — όχι μετά πλήρης LeaseTtl. Μόνο σκληρό crash περιμένει TTL. Αντιγραφή-πράκτορα του terminationGracePeriodSeconds (προεπιλογή 30) δίνει απελευθέρωση χρόνο να τελειώσει πριν αecho σκοτώθηκαν.

Κοχλία (App:Copy)​

ΡύθμισηΠροεπιλογήΣημειώσεις
EnabledfalseΕνεργοποίηση αντιγραφή φιλοξενίας για κόμβο.
ReconcileInterval30sΠόσο συχνά κόμβο διεκδικήσεις/ανανεώνει/συμφωνίες.
LeaseTtl120sΧάρη πριν σιωπηρό κόμβο του profiles ανακτηθεί. Κρατήστε λίγα συμφωνίας διαστήματα έτσι αργό κύκλο δεν αιτία ψευδής χέρι-off.
NodeNameόνομα μηχανήςΟρίστε κατοικίδιο όταν δύο επιβλέποντες δοχείο έναν κεντρικό υπολογιστή.

Σε Kubernetes αντιγραφή επιβλέποντες τρέχουν ως Deployment. ορίστε αντίγραφα στο επιθυμητό παραλληλισμό. Κάθε αecho λαμβάνει σταθερό NodeName (προεπιλογή: αecho hostname), έτσι leases αποδίδονται ανά αecho. Βάση δεδομένων είναι μονιαίος πηγή αλήθειας — χωρίς εφαρμογές lipstick συνεδρίες, χωρίς ανά-αecho κατάσταση να μεταναστεύσουν.

Ισορροπημένη κατανομή (S4): ορίστε App:Copy:MaxProfilesPerNode > 0 σε ένα κύμα πόσα τρέχουν profiles ένας κόμβο κεντρικός υπολογιστής. Κάθε επιβλέπων στη συνέχεια διεκδικήσεις το πολύ του υπόλοιπο headroom μέσω ατομικό FOR UPDATE SKIP LOCKED φράχτης διεκδίκηση, έτσι profiles εξαπλώνονται σε αντίγραφα αντί πρώτα επιβλέπων κρατών όλα — χωρίς μονιαίος hot αecho / SPOF. Skip-locked διεκδίκηση κρατά "ακριβώς ένας κόμβος ανά profile" εγγύηση (χωρίς διπλό-κεντρική) ακόμη και κάτω από ταυτόχρονο διεκδικήσεις. 0 (προεπιλογή) = unbounded (ένας κόμβος κεντρικός υπολογιστής τα πάντα, αμετάβλητο).

Κατά κλίμακα (S7/S8): κάθε αecho jitters συμφωνία από έως 20% του ReconcileInterval (CopyEngineSupervisor.JitteredInterval) έτσι N αντίγραφα δεν πυροβολεί διεκδίκηση/ανανέωση UPDATE ταυτόχρονα (Postgres thundering-κοπάδι). Όταν copyAgent.replicas > 1 chart επίσης εξαπλώνεται αντίγραφα κατά κόμβοι (topologySpreadConstraints) και προσθέτει PodDisruptionBudget (minAvailable: 1) έτσι δραίνω/αναβάθμιση ποτέ παίρνει αντιγραφή χωρητικότητα σε μηδέν.

Εκτέλεση/backtest εκτέλεση​

NodeScheduler επιλέγει λιγότερο-φορτωμένο επιλέγει κόμβο τιμημένο MaxInstances. απομακρυσμένο κόμβο πράκτορες αυτο-εγγράφονται και χτυπήσει καρδιάς (App:Discovery), NodeHeartbeatMonitor σημάδι κόμβο unreachable όταν χτύπησε καρδιάς υπερβαίνει Discovery:HeartbeatTtl. Προσθήκη κόμβο πράκτορες για προσθήκη εκτέλεση χωρητικότητα. νεκρό πράκτορα δρομολογημένο γύρω αυτόματα.

Μεταναστεύσεις σε κλιμάκωση-έξω / έλασης ανάπτυξη​

Κάθε Web/MCP αντίγραφο τρέχει OwnerSeeder κατά startup, το οποίο ισχύει EF μεταναστεύσεις και σπόροι ιδιοκτήτη. Για κάνουν ασφαλή όταν N αντίγραφα έναρξη κατά, μετανάστευση + σπόροι τρέχουν μέσα Postgres συνεδρία προαιρετικό κλείδωμα (MigrationLock.RunExclusiveAsync, κλειδί DatabaseDefaults.MigrationAdvisoryLockKey): το πρώτο αντίγραφο να αποκτήσει αυτό μεταναστεύει και σπόροι. τα υπόλοιπα αποκλειστική το κλείδωμα, στη συνέχεια εύρημα μεταναστεύσεις ήδη εφαρμόστε (χωρίς-op) και ιδιοκτήτη ήδη υπάρχει. Όχι ξεχωριστό μετανάστευση δουλειά ή αρχηγό εκλογή είναι χρειαζόμαστε. Εάν προσθέσουν πρώτα-τρέχουν σπόροι, βάλτε το μέσα το ίδιο φυλακή μπλοκ έτσι είναι ενιαίος-συγγραφέας.

Κόμβο-πράκτορα HTTP ανθεκτικότητα​

Ο κύριος κόμβος μιλά κάθε CtraderCliNode πράκτορα σε HTTP μέσα τρεις σκοπό-διαχώρισμα πελάτες έτσι ένας flaky κόμβο ή δίκτυο ποτέ αλλοιώνει κατάσταση:

  • διαβάστε (status / αναφορά / stats) — idempotent GETs, ξανάπροσπάθεια σε παροδικό αποτυχίες (εκθετικός backoff + jitter, NodeAgentHttp.ReadRetryCount) με ανά-προσπάθεια και ολικά timeouts.
  • γραφή (έναρξη / στάση / καθαρό) — μη-idempotent POSTs, timed έξω αλλά ποτέ ξανάπροσπάθεια: α ξανάπροσπάθεια έναρξη ίσως διπλό-εκτόξευση ένα κοντέινερ.
  • ροή (logs) — το μακροχρόνιο docker logs -f ροή λαμβάνει ένα άπειρο timeout και χωρίς ανθεκτικότητα σωλήνωση, έτσι tailing είναι ποτέ κόψιμο.

Ένας κόμβο που παραμένει unreachable χειρίζεται από χτύπησε καρδιάς + ορφανός-παρουσία ανακτήσιμα. το HTTP στρώμα μόνο smooths παροδικό blips.

Κατάστατοι tiers​

Web (Blazor Server + API) και MCP server κατάστατοι πίσω βάσης δεδομένων, αντίγραφο ελεύθερα. Έλεγχος ταυτότητας είναι cookie-βάση. κλιμάκωση Web οριζοντίως πίσω φορτίο balancer. MCP server είναι ξεχωριστή διαδικασία/Deployment έτσι κλιμάκες ανεξάρτητα από Web.

Βάση δεδομένων σύνδεση ανθεκτικότητα​

Κάθε κεντρικός υπολογιστής που ανοίγει βάση δεδομένων χρησιμοποιεί α ξανάπροσπάθεια εκτέλεση στρατηγική έτσι α παροδικό αποσύνδεση ή ένα διαχειριζόμενο-Postgres failover (RDS / Flexible Server patching) είναι ξανάπροσπάθεια αντί επιφάνεια ως σφάλμα στο χρήστη:

  • Web και MCP εγγράφονται τα πλαίσια μέσα το Aspire Npgsql συστατικό με DisableRetry=false και ένα ρητό CommandTimeout (DatabaseDefaults.CommandTimeoutSeconds).
  • CopyAgent (μη-Aspire) εγγράφονται μέσα UseAppNpgsql, το οποίο ισχύει το ίδιο EnableRetryOnFailure(MaxRetryCount, MaxRetryDelay) + command timeout από DatabaseDefaults.

Όλα γραφή είναι ενιαίος SaveChanges / ενιαίος ExecuteUpdate / ενιαίος ExecuteSql δηλώσεις, έτσι ο ξανάπροσπάθεια στρατηγία είναι ασφαλής (χωρίς πολύ-δήλωση συναλλαγή δεν χρειάζεται χειρόμηνο strategy.ExecuteAsync περιτύλιγμα). Εάν προσθέσουν μια χειρόμηνο συναλλαγή ή πολλαπλοί SaveChanges σε ένα λογικό λειτουργία, περιτύλιγμα το σε db.Database.CreateExecutionStrategy().ExecuteAsync(...) — διαφορετικά ρίχνει κάτω ξανάπροσπάθεια.

Λίστα ελέγχου για κλιμάκωση έξω​

  • Postgres μεγέθη για προστέθηκε σύνδεση φορτίο (κάθε Web/MCP/κόμβο αντίγραφο ανοίγει πούλι).
  • App:Copy:Enabled=true σε κάθε κόμβο που θα πρέπει να κεντρικός υπολογιστής αντιγραφή προφίλ.
  • Κατοικίδιο App:Copy:NodeName ανά συν-ταξιθεσία επιβλέπων (K8s: προεπιλογή ανά-αecho ακατάλληλο).
  • LeaseTtl ≥ 3× ReconcileInterval.
  • Κόμβο πράκτορες ανάπτυξη όπου προνόμια Docker διαθέσιμο (AKS/EKS/EC2/VM, χωρίς Fargate).
  • Πολύ-αντίγραφο Web: ορίστε το signalr συμβολοσειρά σύνδεσης (Redis backplane) και ενεργοποίηση ingress συνεδρία affinity (εφαρμογή συνεδρίες) έτσι ένα Blazor κύκλο ξανασυνδέονται σε ένα ζωντανό αecho. Ένα συστατικό εξαίρεση αιχμαλωτίστηκε από το MainLayout ErrorBoundary (φιλικό retry, κύκλο μένει ζωντανό).