Ukudlulisa i-backend ye-PHP ebhasini le-Redis streams nokukhetha umtapo wezincwadi ozimele

Ukudlulisa i-backend ye-PHP ebhasini le-Redis streams nokukhetha umtapo wezincwadi ozimele

Isibikezelo

Iwebhusayithi yami, engiyiqhuba njengento yokuzilibazisa, yakhelwe ukusingatha amakhasi asekhaya athakazelisayo nezingosi zomuntu siqu. Lesi sihloko saqala ukungithakazelisa ekuqaleni kohambo lwami lokuhlela; ngaleso sikhathi ngahlabeka umxhwele ngokuthola ochwepheshe abakhulu ababhala ngabo, izinto abazithandayo namaphrojekthi. Umkhuba wokuzitholela wona usekhona nanamuhla: cishe kuzo zonke izizinda zezohwebo nezingezona ezohwebo kakhulu, ngiyaqhubeka nokubheka unyaweni ngifuna izixhumanisi zababhali.

Ukuqaliswa komqondo

Inguqulo yokuqala kwakuyikhasi le-html kuwebhusayithi yami yomuntu siqu, lapho ngifaka khona izixhumanisi namasignesha ohlwini lwe-ul. Ngemva kokuthayipha amakhasi angu-20 isikhathi eside, ngaqala ukucabanga ukuthi lokhu akuphumelelanga kakhulu futhi nganquma ukuzama ukwenza inqubo ngokuzenzakalelayo. Ekugelezeni kwe-stackover, ngiqaphele ukuthi abantu abaningi bakhombisa amasayithi kumaphrofayili abo, ngakho-ke ngibhale umhlaseli ku-php, ovele wadlula kumaphrofayili, aqala ngeyokuqala (amakheli ku-SO kuze kube namuhla anjena: `/users/1` ), ikhiphe izixhumanisi kumaka oyifunayo futhi yawengeza ku-SQLite.

Lokhu kungabizwa ngokuthi inguqulo yesibili: iqoqo lamashumi ezinkulungwane zama-URL kuthebula le-SQLite, elithathe indawo yohlu olumile ku-HTML. Ngenze ukusesha okulula kulolu hlu. Ngoba kwakukhona ama-URL kuphela, bese ukusesha kwakusekelwe kuwo.

Kuleli qophelo ngiwuyekile lo msebenzi ngabuyela kuwo ngemuva kwesikhathi eside. Kulesi sigaba, ulwazi lwami lomsebenzi lwase lungaphezu kweminyaka emithathu futhi ngaba nomuzwa wokuthi ngingenza into engathi sΓ­na. Ngaphezu kwalokho, kwakunesifiso esikhulu sokuthola ulwazi ngobuchwepheshe obusha.

Inguqulo yesimanje

Le phrojekthi ifakwe ku-Docker, i-database idluliselwe ku-mongoDb, futhi muva nje, i-radish yengezwe, ekuqaleni eyayiyi-caching. Enye yama-microframeworks e-PHP isetshenziswa njengesisekelo.

Inkinga

Amasayithi amasha engezwa ngomyalo wekhonsoli owenza ngokuhambisanayo okulandelayo:

  • Ilanda okuqukethwe nge-URL
  • Isetha ifulegi elibonisa ukuthi i-HTTPS iyatholakala yini
  • Ilondoloza ingqikithi yewebhusayithi
  • I-HTML yomthombo kanye nezihloko kulondolozwe emlandweni "wokukhomba".
  • Ihlaziya okuqukethwe, kukhishwe Isihloko Nencazelo
  • Ilondoloza idatha eqoqweni elihlukile

Lokhu bekwanele ukugcina amasayithi futhi uwabonise ohlwini:

Ukudlulisa i-backend ye-PHP ebhasini le-Redis streams nokukhetha umtapo wezincwadi ozimele

Kodwa umqondo wokufaka inkomba ngokuzenzakalelayo, ukuhlukanisa nokubeka yonke into ngezigaba, ukugcina yonke into isesikhathini, ayizange ingene kahle kule paradigm. Ngisho nokwengeza indlela yewebhu yokwengeza amakhasi adinga impinda yekhodi nokuvinjwa ukuze kugwenywe i-DDoS engaba khona.

Ngokuvamile, konke kungenziwa ngokuhambisanayo, futhi endleleni yewebhu ungamane ulondoloze i-URL ukuze i-daemon esabekayo yenze yonke imisebenzi yama-URL asohlwini. Kodwa noma kunjalo, nalapha igama elithi "umugqa" liziphakamisa ngokwalo. Futhi uma ulayini usetshenziswa, khona-ke yonke imisebenzi ingahlukaniswa futhi yenziwe okungenani ngokulinganayo.

Isixazululo

Sebenzisa imigqa futhi wenze uhlelo oluqhutshwa umcimbi lokucubungula yonke imisebenzi. Futhi kade ngifuna ukuzama i-Redis Streams isikhathi eside.

Ukusebenzisa ukusakaza kwe-Redis ku-PHP

Ngoba Njengoba uhlaka lwami lungelona olunye lwemidondoshiya emithathu iSymfony, Laravel, Yii, ngingathanda ukuthola umtapo wolwazi ozimele. Kodwa, njengoba kwavela (ekuhlolweni kokuqala), akunakwenzeka ukuthola imitapo yolwazi yomuntu ngamunye. Yonke into ehlobene nolayini iphrojekthi evela koku-3 eyenziwa eminyakeni emihlanu edlule, noma iboshelwe ohlakeni.

Ngizwe okuningi nge-Symfony njengomhlinzeki wezinto eziwusizo ngazinye, futhi sengivele ngizisebenzisa ezinye zazo. Futhi ezinye izinto ezivela kuLaravel nazo zingasetshenziswa, ngokwesibonelo i-ORM yazo, ngaphandle kokuba khona kohlaka ngokwalo.

symfony/messenger

Ikhandidethi lokuqala labonakala lilungile ngokushesha futhi ngaphandle kokungabaza ngalifaka. Kepha kube nzima kakhulu ku-google izibonelo zokusetshenziswa ngaphandle kwe-Symfony. Ungahlangana kanjani esixukwini samakilasi anamagama ajwayelekile, angasho lutho, ibhasi lokudlulisa imiyalezo, ngisho nakuRedis?

Ukudlulisa i-backend ye-PHP ebhasini le-Redis streams nokukhetha umtapo wezincwadi ozimele

Amadokhumenti kusayithi elisemthethweni ayenemininingwane eminingi, kodwa ukuqaliswa kwachazwa kuphela ku-Symfony kusetshenziswa i-YML yabo eyintandokazi nezinye izindlela zomlingo zabangahlanganisi nama-symphonist. Ngangingenaso isithakazelo enqubweni yokufaka ngokwayo, ikakhulukazi ngesikhathi samaholide oNyaka Omusha. Kodwa kwadingeka ngikwenze lokhu isikhathi eside ngingalindele.

Ukuzama ukuthola ukuthi ungaluqinisa kanjani uhlelo usebenzisa imithombo ye-Symfony futhi akuwona umsebenzi omncane kakhulu womnqamulajuqu oqinile:

Ukudlulisa i-backend ye-PHP ebhasini le-Redis streams nokukhetha umtapo wezincwadi ozimele

Ngemva kokuhlolisisa konke lokhu futhi ngizama ukwenza okuthile ngezandla zami, ngafinyelela esiphethweni sokuthi ngangenza uhlobo oluthile lwezinduku futhi nganquma ukuzama enye into.

okukhanyayo/umugqa

Kuvele ukuthi lo mtapo wezincwadi uboshelwe ngokuqinile nengqalasizinda yeLaravel kanye nenqwaba yezinye izinto ezincikile, ngakho angizange ngichithe isikhathi esiningi kuyo: Ngiyifake, ngiyibuke, ngabona ukuncika futhi ngiyisuse.

yiisoft/yii2-umugqa

Hhayi-ke, lapha kwathathwa ngokushesha egameni, futhi, ukuxhumana okuqinile ku-Yii2. Kwadingeka ngisebenzise lomtapo wolwazi futhi kwakungekubi, kodwa angizange ngicabange ngeqiniso lokuthi kuncike ngokuphelele ku-Yii2.

Abanye

Konke okunye engikuthole ku-GitHub bekungathembeki, kuphelelwe yisikhathi futhi kulahliwe amaphrojekthi angenazinkanyezi, amafoloko kanye nenani elikhulu lokuzibophezela.

Buyela ku-symfony/messenger, imininingwane yobuchwepheshe

Kwadingeka ngithole lo mtapo wolwazi, futhi ngemva kokuchitha isikhathi esengeziwe, ngakwazi. Kwavela ukuthi konke kwakumfushane futhi kulula. Ukuze ngiqinise ibhasi, ngenza imboni encane, ngoba... Bekufanele ngibe namathayi amaningana kanye nezibambi ezihlukene.

Ukudlulisa i-backend ye-PHP ebhasini le-Redis streams nokukhetha umtapo wezincwadi ozimele

Izinyathelo ezimbalwa nje:

  • Sakha izibambi zemiyalezo okufanele zishayeleke kalula
  • Siwagoqa nge-HandlerDescriptor (ikilasi elisuka kulabhulali)
  • Sigoqa lezi "Descriptors" kusibonelo se-HandlersLocator
  • Ukwengeza i-HandlersLocator kusibonelo se-MessageBus
  • Sidlulisa isethi ethi `SenderInterface` ku-SendersLocator, esimweni sami samakilasi `RedisTransport`, acushwa ngendlela esobala.
  • Ukwengeza i-SendersLocator kusibonelo se-MessageBus

I-MessageBus inendlela ethi `->dispatch()` ebheka izibambi ezifanele ku-HandlersLocator bese idlulisela umlayezo kubo, isebenzisa `SenderInterface` ehambisanayo ukuthumela ngebhasi (Redis streams).

Ekucushweni kwesiqukathi (kulokhu php-di), yonke le nqwaba ingalungiswa kanje:

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

Lapha ungabona ukuthi ku-SendersLocator sinikeze "izithuthi" ezihlukene zemilayezo emibili ehlukene, ngamunye onoxhumano lwawo emifudlaneni ehambisanayo.

Ngenze iphrojekthi yedemo ehlukile ebonisa ukusetshenziswa kwama-daemon amathathu axhumana wodwa kusetshenziswa ibhasi elilandelayo: https://github.com/backend-university/products/tree/master/products/02-redis-streams-bus.

Kodwa ngizokukhombisa ukuthi umthengi angahlelwa kanjani:

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 le ngqalasizinda ohlelweni lokusebenza

Ngemva kokusebenzisa ibhasi endaweni yami engemuva, ngahlukanisa izigaba ngazinye kumyalo omdala wokuvumelanisa futhi ngenza izibambi ezihlukene, ngamunye owenza okwakhe.

Ipayipi lokwengeza isayithi elisha kusizindalwazi libukeke kanje:

Ukudlulisa i-backend ye-PHP ebhasini le-Redis streams nokukhetha umtapo wezincwadi ozimele

Futhi ngokushesha ngemva kwalokho, kwaba lula kakhulu kimi ukungeza ukusebenza okusha, isibonelo, ukukhipha nokwehlukanisa ama-Rs. Ngoba le nqubo futhi idinga okuqukethwe kwasekuqaleni, bese isibambi sesixhumi sesixhumanisi se-RSS, njenge-WebsiteIndexHistoryPersistor, sibhalisela umlayezo othi β€œOkuqukethwe/HtmlContent”, siwucubungule futhi sidlulise umlayezo owufunayo ngokuqhubekayo.

Ukudlulisa i-backend ye-PHP ebhasini le-Redis streams nokukhetha umtapo wezincwadi ozimele

Ekugcineni, sagcina sesinamademoni amaningana, ngalinye eligcina ukuxhumana kuphela ezinsizeni ezidingekayo. Ngokwesibonelo idimoni crawlers iqukethe zonke izibambi ezidinga ukuya ku-inthanethi ukuze uthole okuqukethwe, kanye ne-daemon phikelela inokuxhumana kusizindalwazi.

Manje, esikhundleni sokukhetha ku-database, ama-id adingekayo ngemva kokufakwa yi-persister avele adluliselwe ngebhasi kubo bonke ababambi abanentshisekelo.

Source: www.habr.com

Engeza amazwana