Ukutshintshela i-backend ye-PHP kwibhasi ye-Redis streams kwaye ukhethe ilayibrari ezimeleyo.

Ukutshintshela i-backend ye-PHP kwibhasi ye-Redis streams kwaye ukhethe ilayibrari ezimeleyo.

I ngcaciso

Iwebhusayithi yam, endiyiqhubayo njengento yokuzonwabisa, yenzelwe ukusingatha amaphepha anomdla asekhaya kunye neesayithi zomntu. Esi sihloko saqala ukuba nomdla kum kwasekuqaleni kohambo lwam lwenkqubo; ngelo xesha ndandinomdla kukufumana iingcali ezinkulu ezibhala malunga neziqu zabo, izinto abazithandayo kunye neeprojekthi. Umkhwa wokuzifumanisa ngokwam uhleli unanamhla: phantse kuzo zonke iindawo zentengiso kunye nezingekho zorhwebo kakhulu, ndiqhubeka ndijonge kwi-footer ekufuneni amakhonkco kubabhali.

Ukuphunyezwa kombono

Inguqulelo yokuqala yayiliphepha nje le-html kwiwebhusayithi yam yobuqu, apho ndibeka amakhonkco kunye nemisayino kuluhlu lwe-ul. Emva kokuchwetheza amaphepha angama-20 ixesha elide, ndaqala ukucinga ukuba oku akusebenzi kangako kwaye ndagqiba kwelokuba ndizame ukwenza inkqubo ngokuzenzekelayo. Kwi-stackoverflow, ndiqaphele ukuba abantu abaninzi babonisa iisayithi kwiiprofayili zabo, ngoko ke ndibhale i-parser kwi-php, ehambe ngokulula kwiiprofayili, ukuqala ngeyokuqala (idilesi kwi-SO ukuza kuthi ga namhlanje zinje: `/users/1` ), ikhuphe amakhonkco kwithegi efunwayo kwaye yongeze kwiSQLite.

Oku kunokubizwa ngokuba yinguqulelo yesibini: ingqokelela yamashumi amawaka ee-URL kwitafile yeSQLite, ethathe indawo yoluhlu olumileyo kwi-HTML. Ndenze uphendlo olulula kolu luhlu. Ngokuba bekukho ii-URL kuphela, emva koko uphendlo lwalusekwe kuzo.

Kweli nqanaba ndiyekile le projekthi ndabuyela kuyo emva kwexesha elide. Kweli nqanaba, amava am omsebenzi sele engaphezulu kweminyaka emithathu kwaye ndaziva ngathi ndingenza into ebaluleke ngakumbi. Ukongezelela, kwakukho umnqweno omkhulu wokufunda ubugcisa obutsha ngokwentelekiso.

Inguqulelo yanamhlanje

Le projekthi ifakwe kwi-Docker, i-database idluliselwe kwi-mongoDb, kwaye kutsha nje, iradish yongezwa, ekuqaleni yayiyeyogcino. Enye yee-microframeworks ze-PHP isetyenziswa njengesiseko.

Ingxaki

Iisayithi ezitsha zongezwa ngumyalelo we-console owenza ngokulandelelanayo oku kulandelayo:

  • Khuphela umxholo nge-URL
  • Iseta iflegi ebonisa ukuba i-HTTPS ibikhona na
  • Igcina undoqo wewebhusayithi
  • Umthombo we-HTML kunye neeheader zigcinwe kwimbali "yesalathisi".
  • Uhlalutya umxholo, ucaphula isihloko kunye neNkcazelo
  • Igcina idatha kwingqokelela eyahlukileyo

Oku kwakwanele ukugcina iisayithi kwaye uzibonise kuluhlu:

Ukutshintshela i-backend ye-PHP kwibhasi ye-Redis streams kwaye ukhethe ilayibrari ezimeleyo.

Kodwa ingcamango yokwenza isalathiso ngokuzenzekelayo, ukwahlula kunye nokubeka yonke into, ukugcina yonke into isexesheni, ayizange ingene kakuhle kule paradigm. Kwanokongeza ngokulula indlela yewebhu ukongeza amaphepha afunekayo ukuphindaphinda ikhowudi kunye nokuthintela ukunqanda iDDoS enokubakho.

Ngokubanzi, ewe, yonke into inokwenziwa ngaxeshanye, kwaye kwindlela yewebhu ungagcina nje i-URL ukuze i-daemon eyoyikekayo yenze yonke imisebenzi yee-URL kuluhlu. Kodwa nangona kunjalo, nalapha igama elithi "umgca" lizicebisa. Kwaye ukuba umgca uphunyeziwe, ke yonke imisebenzi inokwahlulwa kwaye yenziwe ubuncinci nge-asynchronously.

Isisombululo

Sebenzisa imigca kwaye wenze inkqubo eqhutywa sisiganeko ukulungiselela yonke imisebenzi. Kwaye kudala ndifuna ukuzama iRedis Streams ixesha elide.

Ukusebenzisa imilambo yeRedis kwi-PHP

Ngokuba Ekubeni isakhelo sam singesinye sezigebenga ezintathu iSymfony, Laravel, Yii, ndingathanda ukufumana ithala leencwadi elizimeleyo. Kodwa, njengoko kuye kwavela (kuviwo lokuqala), akunakwenzeka ukufumana amathala eencwadi anzima. Yonke into enxulumene nemigca inokuba yiprojekthi esuka kwisi-3 esenziwa kwiminyaka emihlanu eyadlulayo, okanye ibotshelelwe kwisikhokelo.

Ndive okuninzi malunga neSymfony njengomthengisi wezinto eziluncedo, kwaye sele ndisebenzisa ezinye zazo. Kwaye ezinye izinto ezivela kwiLaravel nazo zinokusetyenziswa, umzekelo i-ORM yazo, ngaphandle kobukho besakhelo ngokwaso.

symfony/messenger

Umgqatswa wokuqala kwangoko wabonakala efanelekile kwaye ngaphandle kwamathandabuzo ndiyifakile. Kodwa kuye kwaba nzima ngakumbi kwimizekelo kagoogle yokusetyenziswa ngaphandle kweSymfony. Indlela yokuhlanganisana ukusuka kwiqela leeklasi ezinamagama ehlabathi, amagama angenantsingiselo, ibhasi yokudlulisa imiyalezo, kunye nakwiRedis?

Ukutshintshela i-backend ye-PHP kwibhasi ye-Redis streams kwaye ukhethe ilayibrari ezimeleyo.

Amaxwebhu kwindawo esemthethweni ayeneenkcukacha ezininzi, kodwa ukuqaliswa kwachazwa kuphela kwi-Symfony kusetyenziswa i-YML yabo abayithandayo kunye nezinye iindlela zomlingo zalowo ungengo-symphonist. Andizange ndibe nomdla kwinkqubo yokufakela ngokwayo, ngakumbi ngexesha leeholide zoNyaka omtsha. Kodwa kwafuneka ndikwenze oku ixesha elide ngokungalindelekanga.

Ukuzama ukufumanisa indlela yokumisela inkqubo usebenzisa imithombo ye-Symfony nayo ayingowona msebenzi uncinci womhla wokugqibela:

Ukutshintshela i-backend ye-PHP kwibhasi ye-Redis streams kwaye ukhethe ilayibrari ezimeleyo.

Emva kokuphonononga yonke le nto kwaye ndizama ukwenza okuthile ngezandla zam, ndafikelela kwisigqibo sokuba ndenza uhlobo oluthile lweentonga kwaye ndagqiba ekubeni ndizame enye into.

ekhanyayo/emgceni

Kwavela ukuba eli thala leencwadi liboshwe ngokuqinileyo kwisiseko seLaravel kunye neqela lezinye izinto ezixhomekeke kuyo, ngoko andizange ndichithe ixesha elide kuyo: ndiyifake, ndiyijonge, ndabona ukuxhomekeka kwaye ndiyicimile.

yiisoft/yii2-umgca

Ewe, apha kwathathwa ngokukhawuleza kwigama, kwakhona, uxhulumaniso olungqongqo kwi-Yii2. Kwafuneka ndisebenzise eli thala leencwadi kwaye kwakungekho kubi, kodwa andizange ndicinge ngento yokuba ixhomekeke ngokupheleleyo kwiYii2.

Elinye

Yonke enye into endiyifumene kwi-GitHub yayingathembekanga, iphelelwe lixesha kwaye ishiywe iiprojekthi ngaphandle kweenkwenkwezi, iifolokhwe kunye nenani elikhulu lokuzibophelela.

Buyela kwi-symfony / isithunywa, iinkcukacha zobugcisa

Kwafuneka ndicinge eli thala leencwadi kwaye, emva kokuchitha ixesha elingakumbi, ndakwazi. Kwavela ukuba yonke into yayimfutshane kwaye ilula. Ukumisela ibhasi, ndenza umzi-mveliso omncinci, kuba... Bekufanele ukuba ndibe namatayara amaninzi kunye nabaphangi abohlukeneyo.

Ukutshintshela i-backend ye-PHP kwibhasi ye-Redis streams kwaye ukhethe ilayibrari ezimeleyo.

Amanyathelo ambalwa nje:

  • Senza abaphangi bemiyalezo ekufuneka bebizwe ngokulula
  • Sizisonga kwi-HandlerDescriptor (iklasi esuka kwithala leencwadi)
  • Sisonga ezi "Descriptors" kumzekelo we-HandlersLocator
  • Ukongeza i-HandlersLocator kumzekelo we-MessageBus
  • Sigqithisa iseti ye `SenderInterface` kuSendersLocator, kwimeko yam yeeklasi `RedisTransport`, eziqwalaselwe ngendlela ecacileyo.
  • Ukongeza i-SendersLocator kumzekelo we-MessageBus

MessageBus ine `->dispatch()` indlela ejonga phezulu abaphathi abafanelekileyo kwiHandlersLocator kwaye igqithise umyalezo kubo, isebenzisa ehambelanayo `SenderInterface` ukuthumela ngebhasi (Redis streams).

Kuqwalaselo lwesikhongozeli (kulo mzekelo php-di), lonke eli qela lingaqwalaselwa ngolu hlobo:

        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);
        },

Apha unokubona ukuba kwi-SendersLocator siye sabela "izithuthi" ezahlukeneyo kwimiyalezo emibini eyahlukeneyo, nganye inonxibelelwano lwayo kwimisinga ehambelana nayo.

Ndenze iprojekthi yedemo eyahlukileyo ebonisa ukusetyenziswa kweedemon ezintathu ezinxibelelana kunye zisebenzisa le bhasi ilandelayo: https://github.com/backend-university/products/tree/master/products/02-redis-streams-bus.

Kodwa ndiza kukubonisa indlela umthengi anokwakheka ngayo:

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();

Ukusebenzisa esi sibonelelo kwisicelo

Emva kokuphumeza ibhasi kwi-backend yam, ndahlula izigaba zomntu ngamnye kumyalelo omdala we-synchronous kwaye ndenza abaphathi abahlukeneyo, ngamnye esenza into yakhe.

Umbhobho wokongeza indawo entsha kuvimba weenkcukacha ujongeka ngolu hlobo:

Ukutshintshela i-backend ye-PHP kwibhasi ye-Redis streams kwaye ukhethe ilayibrari ezimeleyo.

Kwaye ngokukhawuleza emva koko, kwaba lula kakhulu kum ukongeza umsebenzi omtsha, umzekelo, ukukhupha kunye nokwahlula i-Rs. Ngokuba le nkqubo iphinda ifune umxholo wokuqala, emva koko i-RSS ikhonkco ye-extractor handler, njenge-WebsiteIndexHistoryPersistor, ibhalisela "Umxholo / i-HtmlContent" umyalezo, iwuqhube kwaye idlulise umyalezo ofunekayo kunye nombhobho wayo ngakumbi.

Ukutshintshela i-backend ye-PHP kwibhasi ye-Redis streams kwaye ukhethe ilayibrari ezimeleyo.

Ekugqibeleni, sagqiba ngeedemon ezininzi, nganye kuzo igcina unxibelelwano kuphela kwizixhobo eziyimfuneko. Umzekelo idemon abakhweli iqulathe bonke abaphathi abafuna ukuya kwi-Intanethi kumxholo, kunye nedaemon zingisa ibamba umdibaniso kwisiseko sedatha.

Ngoku, endaweni yokukhetha kwisiseko sedatha, ii-id ezifunekayo emva kokufakwa ngu-persister zithunyelwa ngokulula ngebhasi kubo bonke abaphethe abanomdla.

umthombo: www.habr.com

Yongeza izimvo