Autor Beitrag
T.E.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31

Win RT, Win 7 Pro, Win 8 Pro
Delphi 2009 Enterprise, Delphi XE, Delphi XE2
BeitragVerfasst: Do 16.09.10 11:21 
Moin moin,

ich hoffe dieses Thema ist an dieser Stelle richtig...

Und zwar geht es um folgenden Zustand:
Ich habe einen Server mit zwei Verzeichnissen und zwei IPs von dem verschiedene, große Dateien per FXP auf bis zu zwei verschiedene Server mit jeweils vier IPs gesendet werden sollen, je nachdem was halt in der GUI ausgewählt wurde, wo die Datei hin soll. Auf den zwei Servern dürfen höchstens 4 FTP Transfers pro IP gleichzeitig stattfinden, da sonst der gesamte Server in die Knie geht. Auf dem Zielserver sind außerdem höchstens 28 Logins und 12 Schreibzugriffe pro Port zugelassen. Die Logins/STORs lassen sich per Telnet abfragen.
Auch der Quellserrver hat ein Limit, das aber (noch) nicht bekannt ist.

So nun zu der Nuss die es zu knacken gilt:
Das WIE? :)
Und zwar brauche ich mal etwas Unterstützung bei der Frage wie bekomme ich nun in meiner Anwendung hin, dass ich von meiner Quelle die Last gleichmäßig auf die beiden Ports (der Einfachheit nenne ich die jetzt mal S1 und S2) S1 und S2 verteile, und den Datenstrom ebenso gleichmäßig auf die Zielserver (Z1_1 - Z1_4 und Z2_1 - Z2_4) verteile.

Aufgrund der Tatsache das ich mehrere Transfers habe muss ich wohl mit einem Thread arbeiten (Bsp: Indy FTP mit Thread), allerdings wächst die Transferliste stetig weiter an, und wie bastel ich hier am besten die Lastverteilung ein? Auch weil mehrere Transfers zu Z1_ und zu Z2_ stattfinden sollen.

Der Quellcode den ich mir für den FXP Transfer geschrieben habe sieht für ein einzelnes fest definiertes File folgendermaßen aus:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
procedure TMain_Form.TransferBtnClick(Sender: TObject);
var
  port: string;
begin
  //wechsle in Verzeichnis
  FTPSrv_S1.ChangeDirUp;
  FTPSrv_S1.changedir('fertig');

  FTPSrv_S1.sendcmd('PASV');

  //Bereinige die Rückmeldung auf den letzten Befehl (PASV) an MediaGrid von
  //nicht benötigten Zeichen, die zu Fehler führen.
  port := '';
  port := Copy(Trim(FTPSrv_S1.lastcmdresult.text.Text), 24, MaxInt);
  Delete(port,length(port)-1,2);

  FTPSrv_Z1.sendcmd('PORT ' + port);
//  FTPSrv_Z1.sendcmd('PORT ' + Trim(FTPSrv_S1.lastcmdresult.text.Text));

  FTPSrv_Z1.sendcmd('STOR ' + 'schnitt.mxf');

  FTPSrv_S1.sendcmd('RETR ' + 'schnitt.mxf');

  FTPSrv_Z1.GetResponse([110125150]);
  FTPSrv_S1.GetResponse([110125150]);
  FTPSrv_Z1.GetResponse([225226250]);
  FTPSrv_S1.GetResponse([225226250]);
end;


Ich bin für Tipps, Hilfen, Unterstützung etc. meeeehr als dankbar :)

Viele Grüße,
Torben

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Ergänzung:
Das Limit für den Quellserver liegt bei 4 FTP Transfers pro Host, das heißt S1 hat 4 Transfers und S2 auch.
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Do 16.09.10 13:55 
Das einfachste wäre vermutlich eine art Clock-Algo
Also deine Server + Ports am besten zufällig in eine Liste rein, Startposition festlegen und jeder Transfer nimmt dann Eintrag an der aktuellen Position und verschiebt die Position um 1. Überlauf wird zu 0 ersetzt (Ring)
Dann musst du nur noch beachten, dass nicht zu viele Transfers über einen Port laufen. Also dort zusätzlich speichern, wiviele gerade einen "Eintrag" verwenden. (Critical Sections nicht vergessen!)
T.E. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31

Win RT, Win 7 Pro, Win 8 Pro
Delphi 2009 Enterprise, Delphi XE, Delphi XE2
BeitragVerfasst: Do 16.09.10 14:35 
Das mit dem Clock-Algo klingt schon mal interessant, werd mr das mal anschauen.

Da ich mit Threads bisher noch nicht gearbeitet habe schau ich mir gerade das Thread Tutorial vom Delphi-Treff an. Aber die Critical Sections damit meinst du das sicherstellen das nur ein Thread zur zeit an den zwischengespeicherten Ports etwas ändern kann oder?

_________________
Schöne Grüße,
Torben