Варианты уменьшить базу данных открытое соединение? - PullRequest
1 голос
/ 25 октября 2011

У меня есть бесплатное приложение, которое очень часто используется, и время от времени я получаю от 500 до 1000 одновременных пользователей.

Это приложение является настольным приложением, которое будет связываться с API моего веб-сайта для получения данных каждые 5 ~ 15 минут, а также для отправки минимальных данных о трех выбранных опциях каждые 15 минут.

Поскольку пользователи могут включать и выключать приложение по своему желанию, таймер для каждого из них может запрашивать мой API, может изменяться, и поэтому я превышаю максимальный лимит подключений, доступный для моего плана хостинга.

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

Первое, что мне пришло в голову, - это использовать FastCGI с Perl. Я уже некоторое время тестировал его, и, похоже, он прекрасно работает, но у меня возникают проблемы при его использовании:

  1. если по какой-либо причине приложение бездействует в течение 60 сервер убивает его и на следующие несколько запросов ответит ошибка 500, пока скрипт не будет вызван заново, что занимает около 3 + минут (да, это занимает столько времени, что я попробовал свой код локально на моем собственном тесте сервер, и это происходит мгновенно, поэтому я уверен, что это проблема с сервером моей хостинговой компании, но они не хотят решать это).

  2. тайм-аут уничтожения, установленный на 300 и убивающий / перезапускающий сценарий после этого периода, который приведет к выше сказанному в 1) о возрождении сценария.

Учитывая, что я сейчас ищу альтернативы, которые не основаны на FastCGI, если таковые имеются. Также из-за ограничений общего хоста я не могу создать своего собственного демона, и мой доступ к компиляции чего-либо очень ограничен.

Есть ли хорошие варианты, которые я могу заархивировать с помощью Perl или PHP?

Главным образом уменьшите количество открытых подключений к базе данных до минимума и все еще сможете кэшировать некоторые запросы на выборку для возврата данных ... Основной процесс приложения в любом случае заключается в вставке / обновлении данных, так что есть много места для кэширования.

Это был простой код, который я использовал для тестирования:

#!/usr/bin/perl -w

use CGI::Simple; # Can't use CGI as it doesn't clear the data for the 
                 # next request haven't investigate it further but needed 
                 # something working to test and using CGI::Simples was 
                 # the fastest solution found.
use DBI;
use strict;
use warnings;

use lib qw( /home/my_user/perl_modules/lib/perl/5.10.1 );
use FCGI;

my $dbh = DBI->connect('DBI:mysql:mydatabase:mymysqlservername',
                       'username', 'password', 
                       {RaiseError=>1,AutoCommit=>1}
                      ) || die &dbError($DBI::errstr);

my $request = FCGI::Request();
while($request->Accept() >= 0)
{
    my $query   = new CGI::Simple;
    my $action  = $query->param("action");
    my $id      = $query->param("id");
    my $server  = $query->param("server");
    my $ip      = $ENV{'REMOTE_ADDR'};

    print $query->header();

    if ($action eq "exp")
    {
        my $sth = $dbh->prepare(qq{
                            INSERT INTO 
                               my_data (id, server) VALUES (?,INET_ATON(?))
                            ON DUPLICATE KEY UPDATE
                               server = INET_ATON(?)});
        my $result = $sth->execute($id, $server, $server)
                             || die print($dbh->errstr);
        $sth->finish;
        if ($result)
        {
            print "1";
        }
        else
        {
            print "0";
        }
    }
    else
    {
        print "0";
    }
}

$dbh->disconnect || die print($DBI::errstr);
exit(0);

sub dbError
{
    my ($txt_erro) = @_;
    my $query = new CGI::Simple;
    print $query->header();
    print "$txt_erro";
    exit(0);
}

Ответы [ 2 ]

1 голос
/ 25 октября 2011

Запустите прокси.DBL :: Proxy Perl должен соответствовать всем требованиям.Прокси-сервер не должен находиться под контролем вашего хоста, поэтому его правило 60 дней бездействия здесь не должно применяться.

В качестве альтернативы, установите задание cron, которое запускается чаще, чем время ожидания FastCGI.просто чтобы создать на своем сайте какую-нибудь страницу "сделать активность" и отменить вывод.Некоторые CRM делают это, например, для «проверки обновлений», так что это не совсем необычно, хотя и немного раздражает.

0 голосов
/ 25 октября 2011

FWIW, вы, вероятно, хотите взглянуть на CGI :: Fast вместо CGI :: Simple, чтобы разрешить ваш CGI.pm, который не работает ожидаемым образом с постоянными переменными ...

...