![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
стабильный и мощный FTP - реально? [D7]
istok © (2007-12-11 21:13:00)Надо пересылать файлы с клиентских модулей программы на серверный. Используем для этого ftp. Надо обеспечить бесперебойную работу системы при 3х тысячах клиентов и сотнях файлов по ~2Кб. Причём всё должно работать (не обязательно быстро, но надёжно) в случае если все клиенты приконнектятся одновременно и будут слать данные.
Это реально?
Тесты indy, ics с серверами на indy, ics, file zilla не дают 100% гарантии доставки каждого файла.
То есть операция Put иногда не проходит. И для этого достаточно 2-4х клиентов, постоянно отсылающих файлы.
ics и indy сервера вообще убиваются после определенного времени.
Может фтп для таких задач не очень годится или надо специальное что-то делать или я что-то не понимаю? (ведь фтп сервера в инете как-то работают с тысячами клиентов?)
В идеале я хочу чтоб любой файл мог быть доставлен, если сервер доступен. И ничего при этом не глючило.
istok (2007-12-12 15:13:00) [21]я правильно понял, что вот этот кусок демки фтп сервера ics - поточная обработка get?:
procedure TFtpServerForm.FtpServer1GetProcessing(
Sender : TObject;
Client : TFtpCtrlSocket;
var DelayedSend : Boolean);
var
MyServer : TFtpServer;
MyClient : TMyClient;
begin InfoMemo.Lines.Add('-GetProcessing');
MyServer := Sender as TFtpServer;
MyClient := Client as TMyClient;
{ If client request a *.ZZZ file, then start a thread to do some }
{ processing (here the thread just sleep 10 sec to show other clients }
{ are not blocked. }
if UpperCase(ExtractFileExt(MyClient.FileName)) = '.ZZZ' then begin
MyClient.FWorkerThread := TGetProcessingThread.Create(TRUE);
MyClient.FWorkerThread.Server := MyServer;
MyClient.FWorkerThread.Client := MyClient;
MyClient.FWorkerThread.FreeOnTerminate := TRUE;
MyClient.FWorkerThread.OnTerminate := WorkerThreadTerminated;
MyClient.FWorkerThread.Resume;
{ Ask server component to not start sending immediately }
{ We will ask to start sending from WorkerThreadTerminated event }
DelayedSend := TRUE;
end;
end;
и по аналогии можно сделать поточную обработку put ? Если "да", то в каком событии - "OnStorSessionConnected" ?
MetalFan (2007-12-12 14:59:00) [22]
> асинхронности не требуются потоки, кроме главного.
>
явно - не требует... неявно система наверняка создает доп.потоки
Anatoly Podgoretsky (2007-12-12 13:39:00) [23]> istok (12.12.2007 13:26:16) [16]
С ICS идет огромное количество примеров, на любой вкус.
Скажу, что правильно написаный сервер, просто не возможно уронить.
istok (2007-12-12 13:26:00) [24]
> Anatoly Podgoretsky © (12.12.07 12:54) [15]
В какую сторону копать - асинхронный сервер на ICS ?
В TFtpServer подобных свойств\событий я не видел - от чего надо отталкиваться?
Anatoly Podgoretsky (2007-12-12 12:54:00) [25]> MetalFan (12.12.2007 12:38:14) [14]
асинхронности не требуются потоки, кроме главного.
MetalFan (2007-12-12 12:38:00) [26]
> Известны примеры работы ICS с 30000 клиентов одновременно,
> при том в одном потоке.
разве ICS не использует асинхронность? тогда это уже не один поток.
может почитать про порты завершения?
http://www.gamedev.ru/community/mmorpg/articles/?id=6
Anatoly Podgoretsky (2007-12-12 12:06:00) [27]> tesseract (12.12.2007 10:41:10) [10]
> Exception-ы они для того и созданы, чтобы их обрабатывать E:EXception многого не скажет. Почитай справку по exception-ам indy.
Инди с тысячами потоков не справится, просто не хватит памяти по стек (1-2 мб на поток).
umbra (2007-12-12 11:08:00) [28]
> Надо обеспечить бесперебойную работу системы при 3х тысячах
> клиентов
если делать на инди, то надо использовать не потоки, а волокна (fibers). три тысячи потоков в процессе - довольно круто.
umbra (2007-12-12 10:45:00) [29]
> Нет гарантии что Put сработает удачно
Такой гарантии нет никогда. Поэтому надо заранее предусмотреть возможность при обрыве соединения его восстановления и докачки файла.
> Но с Indy'шным иногда возникают то exception'ы, то просто
> зависания,
иногда - это когда? как часто? какие исключения?
> В связи с этими вопросами я дал пример кода. Может что-то
> явно не так делаю.
при исключении рекомендуется явно разрывать соединение, еще хорошо бы на сервере выставить разумный таймаут на чтение (т.е. если в течение некоторого времени от клиента нет данных, то соединение закрывать.
tesseract (2007-12-12 10:41:00) [30]
> Сервер на инди, при желании падает хоть от одного клиента,
> причём то зависнет, то exception вылетил. по-разному.
Exception-ы они для того и созданы, чтобы их обрабатывать E:EXception многого не скажет. Почитай справку по exception-ам indy.
"Зависнет " на какой высоте над уровнем моря ?
> потом винда выдаёт неизвестную ошибку.
Телепатор поставил стрелку на BufferOverflow. Или утечку памяти.
Сергей М. (2007-12-12 08:20:00) [31]
> Нет гарантии что Put сработает удачно
Что говорит сообщение об исключении при неудачном "срабатывании" ?
istok (2007-12-12 00:21:00) [32]
> DVM © (11.12.07 23:03) [7]
Замечение правомерное, ща объясню.
Я делаю и сервера и клиента.
Проблемы клиента:
1.Нет гарантии что Put сработает удачно (когда я его вызываю в цикле и есть еще пара клиентов) - вне зависимости от сервере (будь то мой или не мой сервер). Я понимаю что результат Put обрабатываем и всё такое, меня смущает сам факт того, что если 4 клиента не могут стабильно аплоадить файлы, то что уж говорить о тысячах.
2.ICS клиент работает медленнее чем Indy'шный. Где-то в 10 раз. Но с Indy'шным иногда возникают то exception'ы, то просто зависания, а ics клиент работает стабильно. Наверное дело в том, что я криво юзаю инди клиента.
В связи с этими вопросами я дал пример кода. Может что-то явно не так делаю.
Проблемы сервера:
3.Стабильность. С 50ю клиентами мой ICS сервер живёт от пары часов до пары недель и потом винда выдаёт неизвестную ошибку. Как и что ловить пока не ясно. Сервер довольно простой, ничего особенного, простые обработчики событий.
Сервер на инди, при желании падает хоть от одного клиента, причём то зависнет, то exception вылетил. по-разному. В сервере опять же ничего особенного, пара обработчиков событий и всё.
4.Масштабируемость. В идеале нужно чтоб сервер держал тысячи клиентов, и без проблем получал от них файлики или отдавал им оных. Чтоб это работало с достаточной скоростью, для того чтоб данные не накапливались на клиентах до бесконечности (это примерно расчитать можно).
Но то что есть сейчас - упадёт от сотни клиентов без проблем.
Резюме: я не ищу решений конкретных проблем своими силами, косяков много, а компетенция в этой области никакая. я хочу комплексное решение, которое гарантирует мне вышеобозначенные цели с минимумом моего кода. Желательно чтоб оно было платное и с сапортом.
К примеру, меня смущает что есть удобные, мощные 'ready-ro-use' средства для работы с данными, но я не вижу аналогичных вещей для обмена данными по сети.
В идеале хотелось бы использовать что-то опробованное на тысячах клиентов и готовое к употреблению :)
Итого, я буду рад, если знающие люди объяснят при каком подходе и затратах я бы мог добиться обозначенных целей. Может быть это пара строк кода, может быть иные компоненты, может быть заказная разработка, примеры, статьи или еще что-то - мне всё равно как именно решить проблемы, лишь бы решить.
Any concerns?
DVM (2007-12-11 23:03:00) [33]
> istok (11.12.07 22:59) [6]
Я чего то не пойму, ты клиента или сервера делаешь? И кто из них у тебя не работает? В [0] речь о серверах, а в [3] вроде как код клиента?
istok (2007-12-11 22:59:00) [34]
> Код оптимистичен, как Джордж Буш. В цикле без потоков и
> ассиметричной синхронизации, ты лосося не получишь. 30000
> - при грамотном коде мелочь. У тебя даже обработки искоючения
> не присутствует.
Можете грамотной закачки файлов пример показать?
Насчет исключений - а что конкретно имеется в виду? я ж там вроде try except юзаю..
>разницы нет
ок, а в чем разница - в том что написал tesseract ?
DVM (2007-12-11 22:28:00) [35]
> В этом примере кажется речь шла о месагинге а не о пересылке
> файлов по фтп с частыми открытиями и закрытиями соединений,
> не?
разницы нет
tesseract (2007-12-11 22:25:00) [36]
> я делаю банальный put. делаю его в цикле. что тут можно
> поправить? может низя в цикле его юзать, а давать "передохнуть"?
>
Код оптимистичен, как Джордж Буш. В цикле без потоков и ассиметричной синхронизации, ты лосося не получишь. 30000 - при грамотном коде мелочь. У тебя даже обработки искоючения не присутствует.
istok (2007-12-11 22:22:00) [37]
> Это уже не от них а от программиста зависит.
я делаю банальный put. делаю его в цикле. что тут можно поправить? может низя в цикле его юзать, а давать "передохнуть"?
function TForm1.UploadFileIndy(AFileName: string): Boolean;
var
i: Integer;
sent: Boolean;
begin
Result := False;
sent := False;
if FileExists(AFileName) then
with IdFTP1 do
begin
AddLog('>....');
try
Put(AFileName, ExtractFileName(AFileName));
sent := True;
except
on e: exception do
AddLog('Put exception: ' + e.Message, True);
end;
AddLog('....<');
if not sent then
AddLog('not sent ', True);
end;
Result := sent;
end;
> Известны примеры работы ICS с 30000 клиентов одновременно,
> при том в одном потоке.
В этом примере кажется речь шла о месагинге а не о пересылке файлов по фтп с частыми открытиями и закрытиями соединений, не?
Anatoly Podgoretsky (2007-12-11 22:09:00) [38]> istok (11.12.2007 21:13:00) [0]
Может ты просто не умеешь их готовить?
Известны примеры работы ICS с 30000 клиентов одновременно, при том в одном потоке.
DVM (2007-12-11 22:07:00) [39]
> Это реально?
реально
> Тесты indy, ics с серверами на indy, ics .... не дают 100% гарантии доставки каждого файла.
Это уже не от них а от программиста зависит.
> ics и indy сервера вообще убиваются после определенного
> времени.
они тут не причем
А почему бы не взять один из множества готовых и проверенных временем фтп серверов, нпример под FreeBSD ?