Kuendesa iyo PHP backend kuRedis hova bhazi uye kusarudza raibhurari-yakasununguka raibhurari.

Kuendesa iyo PHP backend kuRedis hova bhazi uye kusarudza raibhurari-yakasununguka raibhurari.

Foreword

Webhusaiti yangu, yandinomhanya sechido, yakagadzirirwa kugamuchira mapeji epamba anofadza uye masaiti ega. Ichi chinyorwa chakatanga kundifadza pakutanga kwerwendo rwangu rwehurongwa; panguva iyoyo ndakanakidzwa nekuwana nyanzvi huru dzinonyora nezvavo, zvavanofarira uye mapurojekiti. Tsika yekuzvitsvagira pachangu inoramba iripo nanhasi: panenge pese pese yekutengesa uye kwete nzvimbo yekutengeserana zvakanyanya, ndinoramba ndakatarisa muzasi mukutsvaga ma link kune vanyori.

Kuitwa kwepfungwa

Yekutanga vhezheni yaingova peji yehtml pawebhusaiti yangu, kwandinoisa zvinongedzo nemasaini mune ul runyorwa. Sezvo ndanyora mapeji makumi maviri nekufamba kwenguva, ndakatanga kufunga kuti izvi zvaisanyanya kushanda uye ndakafunga kuyedza kuita otomatiki maitiro. Pa stackoverflow, ndakaona kuti vanhu vazhinji vanoratidza masaiti mumaprofiles avo, saka ndakanyora parser muphp, iyo yakangopfuura nemaprofiles, kutanga nekutanga (kero paSO kusvika nhasi dzakaita seizvi: `/users/20` ), yakaburitsa zvinongedzo kubva kune yaidiwa tag ndokuiwedzera muSQLite.

Izvi zvinogona kunzi vhezheni yechipiri: muunganidzwa wemakumi ezviuru zvema URL ari muSQLite tafura, iyo yakatsiva iyo static list muHTML. Ndakatsvaga nyore pane iyi rondedzero. Nokuti kwaingova nema URL chete, saka kutsvaga kwaingobva pazviri.

Panguva iyi ndakasiya chirongwa ichi ndokudzokera kwachiri mushure menguva refu. Panguva ino, ruzivo rwangu rwebasa rwakanga rwatopfuura makore matatu uye ndainzwa kuti ndaigona kuita chimwe chinhu chakakomba. Mukuwedzera, pakanga pane chido chikuru chekuziva ruzivo rwemichina mitsva.

Modern version

Iyo purojekiti yakaiswa muDocker, dhatabhesi yakaendeswa kune mongoDb, uye nguva pfupi yadarika, radish yakawedzerwa, iyo pakutanga yaingove ye caching. Imwe yePHP microframeworks inoshandiswa sehwaro.

dambudziko

Masayiti matsva anowedzerwa neconsole command iyo inopindirana inoita zvinotevera:

  • Dhaunirodha zvirimo neURL
  • Inoisa mureza unoratidza kana HTTPS iripo
  • Inochengetedza kukosha kwewebhusaiti
  • Iyo sosi HTML uye misoro inochengetwa mu "indexing" nhoroondo
  • Parses zvirimo, inobvisa Musoro uye Tsananguro
  • Inochengetedza data kune imwe muunganidzwa

Izvi zvaive zvakakwana kungochengeta masaiti nekuaratidza mune runyorwa:

Kuendesa iyo PHP backend kuRedis hova bhazi uye kusarudza raibhurari-yakasununguka raibhurari.

Asi iyo pfungwa yeotomatiki indexing, kupatsanura uye kurongedza zvese, kuchengetedza zvese kusvika parizvino, hazvina kukwana mune iyi paradigm. Kunyangwe kungowedzera nzira yewebhu yekuwedzera mapeji anodiwa kudzokorora kodhi uye kuvharira kudzivirira inogona kuitika DDoS.

Kazhinji, hongu, zvese zvinogona kuitwa synchronously, uye nenzira yewebhu unogona kungochengeta iyo URL kuitira kuti dhimoni rinotyisa riite mabasa ese emaURL kubva pane iyo rondedzero. Asi zvakadaro, kunyangwe pano izwi rekuti "mutsara" rinoratidza pacharo. Uye kana mutsara ukaitwa, ipapo mabasa ese anogona kukamurwa uye kuitwa kanenge asynchronously.

chisarudzo

Shandisa mitsetse uye gadzira inofambiswa nechiitiko sisitimu yekugadzirisa mabasa ese. Uye ndanga ndichida kuedza Redis Streams kwenguva yakareba.

Kushandisa Redis hova muPHP

Nokuti Sezvo chimiro changu chisiri chimwe chehofori nhatu dzeSymfony, Laravel, Yii, ndinoda kuwana raibhurari yakazvimirira. Asi, sezvazvakazoitika (pakuongorora kwekutanga), hazvibviri kuwana maraibhurari ega ega akakomba. Zvese zvine chekuita nemitsara ingave purojekiti kubva ku3 yakaitwa makore mashanu apfuura, kana yakasungirirwa kuhurongwa.

Ndanzwa zvakawanda nezveSymfony semupi wezvinhu zvinobatsira zvega, uye ini ndinotoshandisa zvimwe zvacho. Uye zvakare zvimwe zvinhu kubva kuLaravel zvinogona zvakare kushandiswa, semuenzaniso yavo ORM, pasina kuvapo kweiyo chimiro pachayo.

symfony/messenger

Wekutanga mumiriri akabva aita seakanaka uye pasina kupokana ndakaiisa. Asi zvakazonyanya kunetsa kugoogle mienzaniso yekushandisa kunze kweSymfony. Maitiro ekuunganidza kubva kuboka remakirasi ane epasirese, asina zvaanoreva mazita, bhazi rekupfuura mameseji, uye kunyangwe paRedis?

Kuendesa iyo PHP backend kuRedis hova bhazi uye kusarudza raibhurari-yakasununguka raibhurari.

Zvinyorwa zviri pasaiti yepamutemo zvaive zvakanyatsotsanangurwa, asi kutanga kwakatsanangurwa kuSymfony vachishandisa yavanofarira YML nedzimwe nzira dzemashiripiti kune asiri-symphonist. Ndakanga ndisingafariri nzira yekuisa pachayo, kunyanya panguva yezororo reGore Idzva. Asi ndaifanira kuita izvi kwenguva yakareba ndisingatarisiri.

Kuedza kufunga nzira yekumisikidza sisitimu uchishandisa Symfony masosi zvakare harisi iro rakanyanya diki basa renguva yekupedzisira:

Kuendesa iyo PHP backend kuRedis hova bhazi uye kusarudza raibhurari-yakasununguka raibhurari.

Mushure mekunyura mune izvi zvese uye ndichiedza kuita chimwe chinhu nemaoko angu, ndakasvika pakugumisa kuti ndanga ndichiita imwe mhando yemadondoro uye ndakasarudza kuedza chimwe chinhu.

illuminated/queue

Zvakazoitika kuti raibhurari iyi yaive yakasungirirwa zvakasimba kune Laravel zvivakwa uye boka rezvimwe zvinotsamira, saka handina kupedza nguva yakawanda pairi: ndakaiisa, ndakaitarisa, ndakaona zvinotsamira uye ndikadzima.

yiisoft/yii2-queue

Zvakanaka, pano zvakabva zvafungidzirwa kubva pazita, zvakare, kubatana kwakasimba kuYii2. Ndaifanira kushandisa raibhurari iyi uye yakanga isina kushata, asi handina kufunga pamusoro peidi rokuti inotsamira chose chose paYii2.

Vamwe vese

Zvese zvimwe zvandakawana paGitHub zvaisavimbika, zvechinyakare uye zvakasiiwa mapurojekiti asina nyeredzi, maforogo uye huwandu hukuru hwekuita.

Dzokera kune symfony/mutumwa, ruzivo rwehunyanzvi

Ini ndaifanira kufunga raibhurari iyi uye, mushure mekupedza imwe nguva, ndakakwanisa. Zvakazoitika kuti zvese zvaive zvakapfupika uye zviri nyore. Kusimbisa bhazi, ndakagadzira fekitori diki, nekuti... Ndaifanira kunge ndiine matai akati wandei uye nemabatiro akasiyana.

Kuendesa iyo PHP backend kuRedis hova bhazi uye kusarudza raibhurari-yakasununguka raibhurari.

Matanho mashoma:

  • Isu tinogadzira mameseji ekubata anofanirwa kunge achifona
  • Tinozviputira muHandlerDescriptor (kirasi kubva kuraibhurari)
  • Isu tinoputira aya "Descriptors" mune HandlersLocator muenzaniso
  • Kuwedzera HandlersLocator kune iyo MessageBus muenzaniso
  • Isu tinopfuudza seti ye `SenderInterface` kune SendersLocator, mune yangu mamiriro e `RedisTransport` makirasi, ayo akagadzirirwa nenzira iri pachena.
  • Kuwedzera SendersLocator kune iyo MessageBus muenzaniso

MessageBus ine `->dispatch()` nzira inotarisa kumusoro vanobata vakakodzera muHandlersLocator uye inopfuudza meseji kwavari, ichishandisa inoenderana `SenderInterface` kutumira kuburikidza nebhazi (Redis hova).

Muchigadziro chemidziyo (mune iyi kesi php-di), iyi bundle yese inogona kugadzirwa seizvi:

        CONTAINER_REDIS_TRANSPORT_SECRET => function (ContainerInterface $c) {
            return new RedisTransport(
                $c->get(CONTAINER_REDIS_STREAM_CONNECTION_SECRET),
                $c->get(CONTAINER_SERIALIZER))
            ;
        },
        CONTAINER_REDIS_TRANSPORT_LOG => function (ContainerInterface $c) {
            return new RedisTransport(
                $c->get(CONTAINER_REDIS_STREAM_CONNECTION_LOG),
                $c->get(CONTAINER_SERIALIZER))
            ;
        },
        CONTAINER_REDIS_STREAM_RECEIVER_SECRET => function (ContainerInterface $c) {
            return new RedisReceiver(
                $c->get(CONTAINER_REDIS_STREAM_CONNECTION_SECRET),
                $c->get(CONTAINER_SERIALIZER)
            );
        },
        CONTAINER_REDIS_STREAM_RECEIVER_LOG => function (ContainerInterface $c) {
            return new RedisReceiver(
                $c->get(CONTAINER_REDIS_STREAM_CONNECTION_LOG),
                $c->get(CONTAINER_SERIALIZER)
            );
        },
        CONTAINER_REDIS_STREAM_BUS => function (ContainerInterface $c) {
            $sendersLocator = new SendersLocator([
                AppMessagesSecretJsonMessages::class => [CONTAINER_REDIS_TRANSPORT_SECRET],
                AppMessagesDaemonLogMessage::class => [CONTAINER_REDIS_TRANSPORT_LOG],
            ], $c);
            $middleware[] = new SendMessageMiddleware($sendersLocator);

            return new MessageBus($middleware);
        },
        CONTAINER_REDIS_STREAM_CONNECTION_SECRET => function (ContainerInterface $c) {
            $host = 'bu-02-redis';
            $port = 6379;
            $dsn = "redis://$host:$port";
            $options = [
                'stream' => 'secret',
                'group' => 'default',
                'consumer' => 'default',
            ];

            return Connection::fromDsn($dsn, $options);
        },
        CONTAINER_REDIS_STREAM_CONNECTION_LOG => function (ContainerInterface $c) {
            $host = 'bu-02-redis';
            $port = 6379;
            $dsn = "redis://$host:$port";
            $options = [
                'stream' => 'log',
                'group' => 'default',
                'consumer' => 'default',
            ];

            return Connection::fromDsn($dsn, $options);
        },

Pano iwe unogona kuona kuti muSendersLocator takapa "zvifambiso" zvakasiyana kune maviri akasiyana meseji, imwe neimwe ine yayo yekubatanidza kune inowirirana hova.

Ndakagadzira yakaparadzana demo purojekiti ichiratidza mashandisirwo emadhimoni matatu achitaurirana achishandisa bhazi rinotevera: https://github.com/backend-university/products/tree/master/products/02-redis-streams-bus.

Asi ini ndichakuratidza kuti mutengi anogona kugadzirwa sei:

use AppMessagesDaemonLogMessage;
use SymfonyComponentMessengerHandlerHandlerDescriptor;
use SymfonyComponentMessengerHandlerHandlersLocator;
use SymfonyComponentMessengerMessageBus;
use SymfonyComponentMessengerMiddlewareHandleMessageMiddleware;
use SymfonyComponentMessengerMiddlewareSendMessageMiddleware;
use SymfonyComponentMessengerTransportSenderSendersLocator;

require_once __DIR__ . '/../vendor/autoload.php';
/** @var PsrContainerContainerInterface $container */
$container = require_once('config/container.php');

$handlers = [
    DaemonLogMessage::class => [
        new HandlerDescriptor(
            function (DaemonLogMessage $m) {
                error_log('DaemonLogHandler: message handled: / ' . $m->getMessage());
            },
            ['from_transport' => CONTAINER_REDIS_TRANSPORT_LOG]
        )
    ],
];
$middleware = [];
$middleware[] = new HandleMessageMiddleware(new HandlersLocator($handlers));
$sendersLocator = new SendersLocator(['*' => [CONTAINER_REDIS_TRANSPORT_LOG]], $container);
$middleware[] = new SendMessageMiddleware($sendersLocator);

$bus = new MessageBus($middleware);
$receivers = [
    CONTAINER_REDIS_TRANSPORT_LOG => $container->get(CONTAINER_REDIS_STREAM_RECEIVER_LOG),
];
$w = new SymfonyComponentMessengerWorker($receivers, $bus, $container->get(CONTAINER_EVENT_DISPATCHER));
$w->run();

Kushandisa zvivakwa izvi mune application

Mushure mekuita bhazi mumashure mangu, ndakapatsanura nhanho dzega kubva kune yekare synchronous command ndokugadzira vakasiyana vanobata, mumwe nemumwe anoita zvake.

Iyo pombi yekuwedzera saiti nyowani kune dhatabhesi yakaita seizvi:

Kuendesa iyo PHP backend kuRedis hova bhazi uye kusarudza raibhurari-yakasununguka raibhurari.

Uye pakarepo mushure meizvozvo, zvakava nyore kwazvo kwandiri kuti ndiwedzere mashandiro matsva, semuenzaniso, kutora uye kuparadzanisa maRs. Nokuti kuita uku kunodawo izvo zvepakutanga, ipapo iyo RSS yekubatanidza inodhonza mubato, senge WebhusaitiIndexHistoryPersistor, inonyorera kune "Zviri mukati/HtmlContent" meseji, inoigadzirisa uye inopfuudza iyo yaunoda meseji mberi kwayo.

Kuendesa iyo PHP backend kuRedis hova bhazi uye kusarudza raibhurari-yakasununguka raibhurari.

Mukupedzisira, isu takapedzisira tave nemadhimoni akati wandei, imwe neimwe inochengetedza kubatana chete kune inodiwa zviwanikwa. Somuenzaniso dhimoni vanopenga ine zvese zvinobata zvinoda kuenda kuInternet kune zvemukati, uye daemon shingirira inobata chinongedzo kune database.

Zvino, pachinzvimbo chekusarudza kubva kudhatabhesi, maid anodiwa mushure mekuiswa neanorambira anongofambiswa kuburikidza nebhazi kune vese vanofarira kubata.

Source: www.habr.com

Voeg