Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Реализация сервера в службе / 22 сообщений из 22, страница 1 из 1
30.10.2019, 19:42
    #39883303
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
Делаю сейчас приложение для управления некоторыми компами. Схема такая: Консоль (1-2) <=> Сервер (1) <=> Агенты (много). Траффик между ними не большой, но соединения должны висеть постоянно. Чтобы не заморачиваться использую стандартные сокеты (dclsocketsXXX).

И если с консолью и агентами всё понятно, т.к. там и там GUI и поток исполнения один, то вот с сервером есть вопрос: приложение на сервере - это служба, оно кэширует у себя состояние всех агентов и управляет ими по командам с консоли. GUI у него нет. Т.к. клиентов дофига, то делать по потоку на каждого тоже не хочется (в пике их может быть до 500). Как лучше всего это реализовать с т.з. простоты и минимизации возможных граблей - через асинхронный режим, с организацией свой обработки сообщений в службе или в блокирующем режиме через пул потоков по N-ное количество соединений на поток?..
...
Рейтинг: 0 / 0
30.10.2019, 19:45
    #39883305
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
Я бы лично использовал WinSock функции в неблокирующем режиме.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.10.2019, 19:46
    #39883307
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
Dimitry SibiryakovЯ бы лично использовал WinSock функции в неблокирующем режиме.

Но тогда придётся делать свою очередь обработки сообщений, так ведь?
...
Рейтинг: 0 / 0
30.10.2019, 19:52
    #39883310
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
alekcvpНо тогда придётся делать свою очередь обработки сообщений, так ведь?

Нет, она в службе совершенно ни к чему.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.10.2019, 19:53
    #39883311
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
alekcvp,

т.к. известно что клиентов у тебе немного, не мудри и делай просто по треду на клиента.
...
Рейтинг: 0 / 0
30.10.2019, 19:56
    #39883314
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
alekcvpТраффик между ними не большой, но соединения должны висеть постоянно.

то делать по потоку на каждого тоже не хочется (в пике их может быть до 500).
Если учесть что траффик не большой то 500 соединений это не так много.
Хотя ты не уточнил что значит "не большой".
И какова прочая ресурсоемкость от одного клиента на сервере?

Как лучше всего это реализовать с т.з. простоты и минимизации возможных граблей - через асинхронный режим, с организацией свой обработки сообщений в службе или в блокирующем режиме через пул потоков по N-ное количество соединений на поток?..
С точки зрения простоты и надежности лучше таки 500 потоков с блокирующим сокетом.

Через асинхронку может оказаться эффективней и менее ресурсоемко, но отнюдь не проще.
...
Рейтинг: 0 / 0
30.10.2019, 20:07
    #39883318
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
rgreatХотя ты не уточнил что значит "не большой".
И какова прочая ресурсоемкость от одного клиента на сервере?

Ну что-то типа управляющего соединения FTP: получить состояние, изменить параметры, передача сообщений о ходе выполнения длительных задач.

Ок, спасибо, попробую через кучу потоков. К тому же 500 - это крайний случай, более частый - это 60-70.
...
Рейтинг: 0 / 0
30.10.2019, 20:31
    #39883325
Sinemurius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
А насколько оперативно клиенты должны общаться с сервером ?
Как насчет того, чтобы клиенты периодически: раз в X секунд, обращались к серверу и спрашивали его: нет ли для меня указаний от консолей ?
...
Рейтинг: 0 / 0
30.10.2019, 20:38
    #39883329
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
alekcvp,

главное - сильно не выёживаться. Я вот разработал "архигениальную" архитектуру, где каждый пользователь гарантированно может иметь не более одного коннекта к серверу, ибо так было многократно заявлено, а потом выяснилось что "в исключительных случаях - два" , а потом и "три"... тьфу.
...
Рейтинг: 0 / 0
30.10.2019, 20:56
    #39883332
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
SinemuriusА насколько оперативно клиенты должны общаться с сервером ?
Как насчет того, чтобы клиенты периодически: раз в X секунд, обращались к серверу и спрашивали его: нет ли для меня указаний от консолей ?
... а человек на консоли, отдав команду сидит и несколько секунд ждёт пока она выполнится?.. Не думаю что это хороший вариант, ничто так не раздражает (меня, например) как "лагающий" без причины интерфейс у приложения.

P.S: O_o на sql.ru теперь можно редактировать сообщения О_О
...
Рейтинг: 0 / 0
30.10.2019, 22:15
    #39883357
Sinemurius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
Хм. А как осуществляется физическая связь между агентами и сервером ? Каждый агент на собственном компьютере в локальной сети ?или все агенты на одном компе ? Или каждый агент на устройстве подключенном к одной к wifi точке ? Или сервер на арендованном хосте, а агенты - это устройства в интернете ?
На мой взгляд, ответ на этот вопрос имеет значение для выбора архитектуры.
...
Рейтинг: 0 / 0
30.10.2019, 23:58
    #39883373
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
SinemuriusХм. А как осуществляется физическая связь между агентами и сервером ? Каждый агент на собственном компьютере в локальной сети ?
Агент = компьютер, сервер - в той же сети.
...
Рейтинг: 0 / 0
31.10.2019, 07:00
    #39883384
Sinemurius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
То есть каждый агент имеет уникальный ip-шник и поскольку есть контроль над сетью, то можете выбрать порт, в рамках которого будете общаться в сети.

Тогда я бы сделал примерно так (я бы делал на Indy просто потому, что я с ним уже работал и знаю всякие нюансы, но Вы разумеется можете использовать синапс, сокеты и т.д.).

На сервере компонент TIdTCPServer слушает порт.
Агент запускается, открывает соединение с сервером и "регистрируется", то есть посылает серверу информацию о своем ip-шнике, времени запуска и еще какую нибудь идентифицирующую информацию: ну например имя пользователя ОС. И такую инфомацию агент посылает периодически, например раз в минуту, типа "я жив".
После регистрации, агент создает собственный экземпляр TIdTCPServer и начинает слушать порт, то есть становится сервером.

Вы из консоли хотите послать сообщение (команду) агенту с именем пользователя "Маша". Вы открываете сеанс соединения с сервером, посылаете ему информацию о сообщении и получателе. Сервер в рамках сеанса смотрит в своем списке: есть ли "живой" агент "Маша", получает его ip-шник и открывает уже сам сеанс соединения с TIdTCPServer на агенте "Маша", передает агенту необходимую информацию или команду и закрывает соединение с Машей. Затем передает в рамках соединения с консолью подтверждение о том, что сеанс с Машей прошел успешно, консоль получает эту информацию и закрывает соединение с сервером.

Никаких открытых потоков и соединений держать не нужно. В момент соединения консоли с сервером Indy создаст поток для сеанса соединения с сервером и также будет создан поток для соединения сервера с агентом. Но это на короткое время.
...
Рейтинг: 0 / 0
31.10.2019, 09:10
    #39883408
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
alekcvp,

когда то делал такую же задачу. Из особенностей - агенты могли располагаться где угодно, у них мог отсутствовать внешний IP, а управляющих серверов было несколько.
Я реализовал так, чтобы подключались именно агенты к назначенному серверу (либо резервному, если основной долго отвечает). Держать постоянные соединения было не нужно, агент получал задания по расписанию (по факту 1 раз в минуту оказалось достаточно), при необходимости устанавливалось постоянное соединение (если например нужен был доступ к рабочему столу, тогда по возможности устанавливалось прямое соединение между управляющей консолью и агентом).

Всё реализовал на Indy (TIdTCPServer / TIdTCPClient), управляющий сервер выдерживал до 15 тысяч одновременных соединений, для моих целей этого было вполне достаточно.

P.S. Вах, сообщения реально редактируются :-) Не мог не отметить этот факт!)))))))
...
Рейтинг: 0 / 0
31.10.2019, 09:18
    #39883411
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
alekcvp... а человек на консоли, отдав команду сидит и несколько секунд ждёт пока она выполнится?.. Не думаю что это хороший вариант, ничто так не раздражает (меня, например) как "лагающий" без причины интерфейс у приложения.
отображаешь окно - "идет установка соединения", и человек не нервничает. Можно с кнопкой "отмена"
.Обрати внимание, когда например делаешь видеозвонок через вайбер, или скайп - там тоже всё не мгновенно, тебе точно также пишут, что идет вызов.
...
Рейтинг: 0 / 0
31.10.2019, 09:35
    #39883419
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
alekcvpТ.к. клиентов дофига, то делать по потоку на каждого тоже не хочется (в пике их может быть до 500500 еще не величина для особых беспокойств. размер стэка только конечно хорошо бы отрегулировать
...
Рейтинг: 0 / 0
31.10.2019, 10:02
    #39883427
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
asutp2Держать постоянные соединения было не нужно, агент получал задания по расписанию (по факту 1 раз в минуту оказалось достаточно), при необходимости устанавливалось постоянное соединение (если например нужен был доступ к рабочему столу, тогда по возможности устанавливалось прямое соединение между управляющей консолью и агентом).

Это by-design, т.е агентом устанавливает соединение с сервером, выполняются некоторые настройки, после чего запускается длительный процесс (где-то на час). Требуется чтобы оператор видел состояние этого процесса, сколько завершено, где произошёл сбой (для этого и нужно постоянное соединение, т.к. компьютер с агентом может тупо повиснуть), и при необходимости мог отменить процесс. Плюс во время этих операций нагрузка на сеть максимальная и установка новых соединений может вообще отвалиться по таймауту.
...
Рейтинг: 0 / 0
31.10.2019, 10:38
    #39883446
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
Можно немного заморочиться и освоить асинхронную коммуникацию с помощью либы ICS. Хотя для новичка она и не особо дружелюбна, но событийная модель та же, что и у VCL.
И кстати, рекомендую не изобретать велосипед со своим протоколом и сесть на что-либо стандартное. REST, например. А можно вообще заюзать zeromq (нужна будет dll)
...
Рейтинг: 0 / 0
31.10.2019, 11:14
    #39883482
asutp2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
alekcvpasutp2Держать постоянные соединения было не нужно, агент получал задания по расписанию (по факту 1 раз в минуту оказалось достаточно), при необходимости устанавливалось постоянное соединение (если например нужен был доступ к рабочему столу, тогда по возможности устанавливалось прямое соединение между управляющей консолью и агентом).

Это by-design, т.е агентом устанавливает соединение с сервером, выполняются некоторые настройки, после чего запускается длительный процесс (где-то на час). Требуется чтобы оператор видел состояние этого процесса, сколько завершено, где произошёл сбой (для этого и нужно постоянное соединение, т.к. компьютер с агентом может тупо повиснуть), и при необходимости мог отменить процесс. Плюс во время этих операций нагрузка на сеть максимальная и установка новых соединений может вообще отвалиться по таймауту.так пусть агент при выполнении задачи отправляет инфу о статусе допустим 1 раз в секунду. А при ожидании команды от сервера пусть периодически подключается с бОльшим интервалом (гапример 1 раз в минуту).
Постоянные соединения это конечно хорошо, если к серверу подключается небольшое количество агентов. Но если ты рассчитываешь на обслуживание сервером тысяч агентов, то тогда продолжительность соединения агента с сервером должна быть минимизирована.
...
Рейтинг: 0 / 0
31.10.2019, 13:24
    #39883583
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
alekcvpво время этих операций нагрузка на сеть максимальная и установка новых соединений может
вообще отвалиться по таймауту.

Это надо сильно постараться чтобы так криво написать сервер.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
31.10.2019, 16:22
    #39883743
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
Dimitry Sibiryakovalekcvpво время этих операций нагрузка на сеть максимальная и установка новых соединений может
вообще отвалиться по таймауту.

Это надо сильно постараться чтобы так криво написать сервер.

Это передача многогигабайтных файлов по сети через SMB.
...
Рейтинг: 0 / 0
31.10.2019, 16:26
    #39883744
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Реализация сервера в службе
alekcvpЭто передача многогигабайтных файлов по сети через SMB.

Сугубо всё равно. SYN-пакет найдёт куда вклиниться.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Реализация сервера в службе / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]