[Moscow.pm] Модули для поддержания соединения

Victor Efimov victor на vsespb.ru
Вт Сен 8 04:59:27 PDT 2015


8 сентября 2015 г., 14:52 пользователь Ilya Chesnokov
<chesnokov.ilya на gmail.com> написал:
> 8 сентября 2015 г., 0:03 пользователь Victor Efimov <victor на vsespb.ru> написал:
>> Я думаю имелось ввиду несколько другое. Примеры это DBI и CPAN Redis.
>
> Ну да. Хотя в целом про TCP keepalive тоже интересная тема.
>
>> 1) Прежде чем послать данные в сокет сделать следующее:
>>
>>   if ($self->{pid} != $$) {
>>     $self->connect;
>>   }
>>
>> (код из Redis.pm)
>>
>> 2) В DESTROY, если он есть, делать деструкцию только если $self->{pid} == $$.
>> Надо сказать, это нужно только в DBI, т.к. он в DESTROY посылает
>> какие-то данные в сокет. В "обычных" клиентах не нужно. В Redis.pm
>> нету.
>
> В-общем, ключевой вопрос в том, можно ли использовать одно и то же
> соединение в разных процессах, если я правильно понял.
> Если нельзя, то первый подход используется, если нельзя, то второй -
> не закрывать соединение в дочерних процессах, а только в родительском.

По-моему одно и то же соединение в любом случае использовать нельзя.
Учитывая что сценарий -
это fork() про который мы не знаем зачем и почему он. Возможно до
fork() кто-то использовал соединение, после fork()
собирается использовать и в child и parent. В таком случае и child и
parent будут писать в один сокет. Это всё равно что они по-очереди
будут писать в сокет в одном процессе.

А DESTROY в DBI имхо просто для того чтобы закрыть коннект, чтобы у
mysql сервера не висели открытые коннекты

>
>> 3) реконнект
>>
>> 8 сентября 2015 г., 5:36 пользователь Eugen Konkov <kes-kes на yandex.ru> написал:
>>> Здравствуйте, Ilya.
>>>
>>> IC> Есть ли готовые модули для поддержания постоянного соединения с
>>> IC> каким-либо сервером?
>>> Обычное TCP соединение с keep-alive пакетами
>>> http://habrahabr.ru/company/intersystems/blog/155565/
>>> http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html
>>>
>>>>не закрывалось при уничтожении форка
>>> Делаете управление соединениями в мастер процессе. Создали соединение или их pool и отдаёте fork'ам хендлы. Если будет один хендл, То нужно будер решить проблему, какому форку передавать пришедший ответ (Думаю будет проще если создавать хендл/fork)
>>>
>>> Вы писали 7 сентября 2015 г., 12:18:21:
>>>
>>> IC> Добрый день.
>>>
>>> IC> Есть ли готовые модули для поддержания постоянного соединения с
>>> IC> каким-либо сервером? Нужно для того, например, чтобы инициализировать
>>> IC> соединение при старте веб-приложения и повторно использовать в форках,
>>> IC> при этом чтобы оно не закрывалось при уничтожении форка, ну и заново
>>> IC> соединялось при необходимости.
>>>
>>> IC> В-общем, нужно что-то вроде той части DBI, которая отвечает за
>>> IC> TCP-соединение, но без всего того, что связано непосредственно с
>>> IC> базами данных.
>>>
>>> IC> Да, и еще интересно, есть ли что-то подобное отдельно для AnyEvent::Handle.
>>>
>>> IC> --
>>> IC> Best regards,
>>> IC> Ilya Chesnokov
>>>
>>>
>>>
>>> --
>>> С уважением,
>>>  Eugen                          mailto:kes-kes на yandex.ru
>>>
>>> --
>>> Moscow.pm mailing list
>>> moscow-pm на pm.org | http://moscow.pm.org
>
>
>
> --
> Best regards,
> Ilya Chesnokov


Подробная информация о списке рассылки Moscow-pm