(Rund um die...) Server entlasten



  • allo,

    also das ist mehr so eine theoretische Frage (ich habe es bis jetzt auch nur theoretisch in der Schule überlegt). Falls notwendig bitte in Rund um... oder so verschieben (es ist aber ne Frage zu TClientSocket und TServerSocket dabei, darum BCB).

    Ich würde das Problem gerne z.B. am Beispiel von einem Chat umsetzen.

    Problem:
    Wenn es jetzt nur einen Server gibt, dann hauts den ja ab einer bestimmten Benutzerzahl zusammen (zuviel Traffic, zuviel Verarbeitungsaufwand).

    Lösungsansatz:
    Ich habe mir dann überlegt, man könnte es auf mehrere Server verteilen, die dann auch noch untereindander miteinander verbunden sind (Clients müssen sich halt dann einen freien Server suchen). Also einer schreibt eine Nachricht, diese wird an seinen Server gesendet dieser Server sendet sie weiter an die Clients, die mit ihm verbunden sind und an die Server, mit denen er verbunden ist (u.s.w.).

    Da ist mir allerdings ein Problem aufgefallen:
    Wenn sich Server A mit Server B, Server B mit Server C und Server C mit Server A verbindet, dann habe ich sozusagen einen "Kreis" und die Nachricht wird bis in alle Ewigkeit umhergeschickt.

    Eine Möglichkeit wäre es jeder Nachricht eine eindeutige ID (IP + Datum + Uhrzeit) zu geben. Dann würde sich bei einem Chat aber der Traffic verhältnismäßig hoch erhöhen. Außerdem müsste dann jeder Server die IDs eine bestimmte Zeit lang speichern (und wenn die Nachricht theoretisch zehn mal um die Welt und dann erst zu einem Server geschickt wird, kann das ja etwas dauern).

    Eine weitere Möglichkeit wäre es, dass sich Server B, sobald er die Verbindung zu Server A hergestellt hat, sich von A eine Liste mit den IPs der Server geben lässt, mit denen A verbunden ist und der IPs mit denen die Server verbunden sind, mit denen A verbunden ist; also die gesamten Server IPs des derzeitigen Netzwerkes. B darf sich dann mit keiner der IPs verbinden (kann sie aber speichern, falls A mal offline ist). Wenn B sich jetzt mit einer neuen IP verbindet, schickt er diese IP an A und A reicht sie an alle anderen Server weiter. So kann (glaube ich) so ein "Kreis" nicht enstehen.

    Wie arbeiten aber die TServer und TClientSocket Komponenten. Was ist wenn Server A jetzt über eine lahme Verbindung eine Liste mit tausenden (nur theoretisch) IPs von Server B bekommen würde und zur gleichen Zeit eine Nachricht von einem seiner Clients. Kommen dann erst die IPs und dann die Nachricht an oder wird das vermischt? So müsste man ein Protokoll definieren (dürfte ja noch schaffbar sein) allerdings ist der Server, der gerade tausende von IPs verschickt, außer Gefecht gesetzt.

    Ich hoffe ihr konntet mir folgen und vielleicht einige Tipps oder neue Vorschläge dazu geben (oder Probleme aufzeigen).
    Robert

    [ Dieser Beitrag wurde am 07.07.2003 um 18:09 Uhr von Jansen editiert. ]



  • Boah
    da haste aber was vor. Solltest vielleicht mal das netz durchstöbern auf der Suche nach SKALIERBARKEIT so nennt man das was du da machen möchtest, denke ich
    Viel Spass dabei 😉



  • Original erstellt von <Robert>:
    Wenn sich Server A mit Server B, Server B mit Server C und Server C mit Server A verbindet, dann habe ich sozusagen einen "Kreis" und die Nachricht wird bis in alle Ewigkeit umhergeschickt.

    Dann verhindere doch einfach, dass sich ein Server mit mehr als einem anderen Server verbindet, und/oder führe einen Masterserver ein, der nur die Unterserver verwaltet.

    Was die "Tausende von IPs" betrifft, schick sie halt "bündelweise" und sieh zwischendurch nach, ob noch andere Nachrichten zu verarbeiten sind.

    Das ist aber alles äusserst abstrakt und hat nicht wirklich mit den BCB-Komponenten zu tun, deshalb verschoben nach "Rund um".


Anmelden zum Antworten