Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как отслеживать мёртвые коннекты? [D7]


Dedushka_Mazai ©   (2004-01-30 13:59:00) 

есть сервер приложений и клиенты. если клиент по какой-либо причине некорректно завершается (например, нажатием <Reset>), на сервере остаётся мёртвый коннект. как можно эти коннекты вычислять и убивать со стороны сервера?


Michail Dalakov   (2004-01-30 19:40:00) [1]

Не оперативной будет только информация о умерших клиентах,
если требуется оперативность, то можно заставить клиент по требованию сервера подтвердить состояние что он жив.


Dedushka_Mazai   (2004-01-30 19:11:00) [2]

в буфере хранится временная информация (допустим, список пользователей, подключённых к appserver), которую нужно просматривать с клиента. в базе это дело я хранить не хочу, так как при некорректном завершении сервера таблица не очистится и оставшуюся информацию придётся удалять по-другому.
при подключении каждого нового клиента во временную таблицу записываются его параметры, при отключении - убиваются.


Michail Dalakov   (2004-01-30 18:53:00) [3]

Не совсем понял, что за буфер? Где он находится, и как используется.
Каждый клиент обслуживается своей инстанцией COM-объекта, созданной в отдельном потоке, и никакого влияния на другие клиенты не оказывает.
Вообще акт отключения клиента сервером связан с освобождением ресурсов последнего и не больше


Dedushka_Mazai   (2004-01-30 18:39:00) [4]

ну, дизайн-тайм - это не проблема. главное, чтобы для реальных пользователей больших задержек не возникало. предположим, что умерший клиент чего-то делал, что хранилось на сервере приложений в буфере (эти данные влияют на работу других клиентов). при нормальном завершении буфер освободится и проблем не будет. при ненормальном завершении буфер освободится через 10 мин (например) и в течении этого времени другие клиенты будут получать некорректную информацию. вот поэтому и хочется сократить время задержки.


Michail Dalakov   (2004-01-30 18:28:00) [5]

Microsoft в .NET по Default = 10 минут
я устанавливал и поменьше, сервер ждал в 2 раза больше чем просил клиент после чего если клиент не отзывался, то происходило отключение. Рекомендую оставить 10 минут иначе трудно будет работать в Design и Debag из-за отключения сервером

>но сама дельфа-то корректно освобождает память и убивает потоки?
>стало быть должна быть альтернатива RDM.Free.

Да, но она делает это через TComClassManager, и если мне не изменяет память то через приватные методы.


Dedushka_Mazai   (2004-01-30 17:54:00) [6]

>На сервере работает таймер который должен уничтожить соединение
>если клиент бесследно исчез. Клиент же с какой-то
>периодичностью должен посылает на сервер сообщение что он еще жив
что-то такое я и предполагал

а есть какое-либо оптимальное значение таймаута, по которому клиента можно отстреливать? (оно понятно, что всё это будет тестироваться на практике, но тем не менее, интересно узнать мнение человека, который уже с этим сталкивался).

>Мусор остается из за того что после Free TComClassManager никак
>не узнает об этом, остается поток в котором RDM создавался
но сама дельфа-то корректно освобождает память и убивает потоки?
стало быть должна быть альтернатива RDM.Free.
(чует моё сердце, придётся в исходниках поковыряться)


Michail Dalakov   (2004-01-30 17:41:00) [7]

Вариант, например, такой.
Клиент конектится. Если модель сервера ciMultiInstance, tmApartment (или ciInternal, tmApartment) то при конекте - в отдельном потоке создается RDM который обслуживент данное соединение. На сервере работает таймер который должен уничтожить соединение если клиент бесследно исчез. Клиент же с какой-то периодичностью должен посылает на сервер сообщение что он еще жив (ну может также посылать и параметр, который будет сообщать серверу сколько он хочет жить).
Мусор остается из за того что после Free TComClassManager никак не узнает об этом, остается поток в котором RDM создавался


Dedushka_Mazai   (2004-01-30 16:48:00) [8]

>Delphi не позволяет чисто убивать мёртвый коннект со стороны сервера. Частично остается мусор после RDM.free.
в смысле? если можно, поподробнее, что там за мусор остаётся?

Вопрос, кстати, был в другом: как, собственно, отследить момент, когда коннект помирает и сделать RDM.Free?


Michail Dalakov   (2004-01-30 15:56:00) [9]

TComClassManager модуль ComObj


Michail Dalakov   (2004-01-30 15:46:00) [10]

Delphi не позволяет чисто убивать мёртвый коннект со стороны сервера. Частично остается мусор после RDM.free.


Наверх

Титульная страница Поиск, карта сайта Написать письмо