U wareejinta dhabarka dhabarka PHP ee baska durdurrada Redis iyo doorashada maktabad madax-bannaan qaab-dhismeedka

U wareejinta dhabarka dhabarka PHP ee baska durdurrada Redis iyo doorashada maktabad madax-bannaan qaab-dhismeedka

Horudhac

Mareegahayga, oo aan u maamulo hiwaayad ahaan, waxaa loogu talagalay inuu martigeliyo bogag guri oo xiiso leh iyo goobo gaar ah. Mawduucan waxa uu bilaabay in uu i xiiseeyo bilawgii safarkayga barnaamij-samaynta, wakhtigaas waxa aad ii soo jiitay in aan helo aqoonyahanno waaweyn oo wax ka qora naftooda, hiwaayadooda iyo mashaariicdooda. Caadada ah inaan ogaano iyaga naftayda ayaa weli ah ilaa maantadan la joogo: ku dhawaad ​​ganacsi kasta oo aan ahayn goob ganacsi, waxaan sii wadaa inaan raadiyo xiriirinta qorayaasha.

Hirgelinta fikradda

Nooca ugu horreeya wuxuu ahaa kaliya bog HTML ah oo ku yaal mareegahayga gaarka ah, halkaas oo aan ku dhejiyay xiriiriyeyaal saxiixyo leh liiska ul. Markii aan qoray 20 bog muddo wakhti ah, waxaan bilaabay inaan u maleeyo in tani aysan ahayn mid wax ku ool ah oo waxaan go'aansaday inaan isku dayo in aan si otomaatig ah u sameeyo habka. Markii qulqulka qulqulka, waxaan ogaaday in dad badani ay tilmaamayaan boggaga profiles-kooda, sidaa darteed waxaan ku qoray parser php, kaas oo si fudud u dhex maray profiles-ka, laga bilaabo kii ugu horreeyay (cinwaannada SO ilaa maanta waa sidan: `/users/1` Xidhiidhada laga soo saaray summada la rabay oo lagu daray SQLite.

Tan waxaa loogu yeeri karaa nooca labaad: ururinta tobanaan kun oo URL-yo ah oo ku jira miiska SQLite, kaas oo beddelay liiska taagan ee html. Waxaan ku sameeyay baaritaan fudud liiskan. Sababtoo ah waxaa jiray URL-yo kaliya, ka dib raadinta ayaa si fudud ku salaysan iyaga.

Marxaladdan ayaan ka tagey mashruucii oo aan ku noqday muddo dheer ka dib. Marxaladdan, waayo-aragnimadayda shaqadu waxay horeba u ahayd in ka badan saddex sano waxaanan dareemay in aan samayn karo wax ka sii daran. Intaa waxaa dheer, waxaa jiray rabitaan weyn oo lagu baranayo tignoolajiyada cusub.

Nooca casriga ah

Mashruuca oo la geeyay Docker, xog-ururinta waxaa loo wareejiyay mongoDb, dhawaanahan, dabocase ayaa lagu daray, kaas oo markii hore ahaa kaliya kaydinta. Mid ka mid ah mikroframeworks PHP ayaa loo isticmaalaa saldhig ahaan.

dhibaato

Goobaha cusub waxaa lagu daraa amarka console-ka kaas oo si isku mid ah u sameeya kuwan soo socda:

  • Waxa ku soo dejisa URL
  • Dejiya calan muujinaya in HTTPS la heli karo iyo in kale
  • Waxay ilaalisaa nuxurka mareegta
  • Isha HTML iyo madaxyada waxaa lagu keydiyay taariikhda "indexing".
  • Wuxuu falanqeeyaa nuxurka, soosaaraa Cinwaanka iyo Sharaxaada
  • Ku kaydiya xogta ururin gaar ah

Tani waxay ku filnayd in si fudud loo kaydiyo goobaha oo lagu soo bandhigo liiska:

U wareejinta dhabarka dhabarka PHP ee baska durdurrada Redis iyo doorashada maktabad madax-bannaan qaab-dhismeedka

Laakiin fikradda ah in si toos ah u tilmaanta, kala soocida iyo kala saraynta wax walba, wax walba ilaa taariikhda, si fiican uguma habboonayn jaantuskan. Xitaa si fudud loogu daro habka shabakada si loogu daro boggaga loo baahan yahay nuqul ka mid ah koodka iyo xannibaadda si looga fogaado suurtagalnimada DDoS.

Guud ahaan, dabcan, wax walba waa la samayn karaa si isku mid ah, iyo habka shabakadda waxaad si fudud u badbaadin kartaa URL si uu daemon-ka weyni u qabto dhammaan hawlaha URL-yada liiska. Laakiin weli, xitaa halkan ereyga "kuyuuga" ayaa laftiisa soo jeedinaya. Oo haddii safka la fuliyo, markaa dhammaan hawlaha waa la qaybin karaa oo waxaa la samayn karaa ugu yaraan si isku mid ah.

go'aanka

Hirgeli safafka oo samee nidaam ay wado dhacdo si loo habeeyo dhammaan hawlaha. Oo waxaan doonayay inaan tijaabiyo Redis Streams muddo dheer.

Isticmaalka qulqulka Redis ee PHP

Sababtoo ah Maadaama qaab-dhismeedkaygu aanu ahayn mid ka mid ah saddexda Rafaa ee Symfony, Laravel, Yii, waxaan jeclaan lahaa inaan helo maktabad madax-bannaan. Laakiin, sidii ay u soo baxday (imtixaanka koowaad), suurtagal maaha in la helo maktabado gaar ah oo halis ah. Wax kasta oo la xidhiidha safafka waa mashruuc ka yimid 3 shan sano ka hor, ama waxay ku xidhan yihiin qaabka.

Waxaan wax badan ka maqlay Symfony inay tahay bixiye ka kooban qaybo faa'iido leh oo shakhsi ah, waxaanan horay u isticmaalay qaar ka mid ah. Iyo sidoo kale waxyaabo ka mid ah Laravel sidoo kale waa la isticmaali karaa, tusaale ahaan ORM-kooda, iyada oo aan la helin qaab-dhismeedka laftiisa.

symfony/rasuul

Musharaxa ugu horeeya ayaa isla markiiba u muuqday mid ku haboon oo aan shaki ku jirin ayaan ku rakibay. Laakiin waxa ay noqotay mid aad u adag in Google-ka la isticmaalo tusaale ahaan meel ka baxsan Symfony. Sida loo ururiyo baska gudbinta fariimaha ka imanaya kooxo farabadan oo magacyo aan macno lahayn, iyo xataa Redis?

U wareejinta dhabarka dhabarka PHP ee baska durdurrada Redis iyo doorashada maktabad madax-bannaan qaab-dhismeedka

Dukumeentiyada ku yaal goobta rasmiga ah aad bay u tafatireen, laakiin bilawga waxaa lagu sifeeyay oo kaliya Symfony iyadoo la adeegsanayo YML-ka ay jecel yihiin iyo hababka kale ee sixirka ee aan calaamadaha ahayn. Wax xiiso ah uma hayn habka rakibidda laftiisa, gaar ahaan inta lagu jiro fasaxyada sanadka cusub. Laakiin waxay ahayd inaan tan sameeyo wakhti dheer oo lama filaan ah.

Isku dayga in la ogaado sida loo dedejiyo nidaamka isticmaalaya ilaha Symfony sidoo kale maaha hawsha ugu yar ee kama dambaysta ah:

U wareejinta dhabarka dhabarka PHP ee baska durdurrada Redis iyo doorashada maktabad madax-bannaan qaab-dhismeedka

Intaas oo dhan markaan dhex galay oo aan isku dayay in aan gacmahayga wax ku qabto, waxa aan gartay in aan samaynayo birta wax-u-socota oo aan go'aansaday in aan wax kale isku dayo.

iftiimay/ saf

Waxay soo baxday in maktabaddani ay si adag ugu xidhnayd kaabayaasha Laravel iyo tiro badan oo ku-tiirsanaan ah, sidaa darteed waqti badan kuma qaadanin: waan rakibay, eegay, waxaan arkay ku-tiirsanaanta oo tirtiray.

yiisoft/yii2-kuyuu

Hagaag, halkan ayaa isla markiiba laga soo qaatay magaca, mar labaad, xidhiidh adag oo la leh Yii2. Waa inaan isticmaalo maktabadan mana xuma, laakiin kama fikirin xaqiiqda ah inay si buuxda ugu xiran tahay Yii2.

Inta soo hartay

Wax kasta oo kale oo aan ka helay GitHub waxay ahaayeen kuwo aan la isku halleyn karin, kuwo duugoobay oo laga tagay oo aan xiddigo lahayn, fargeeto iyo tiro badan oo ballanqaad ah.

Ku soo noqo symfony/rasuul, faahfaahin farsamo

Waxaan ku qasbanaatay inaan ogaado maktabadan, ka dib markii aan waqti badan qaatay, waan awooday. Waxaa soo baxday in wax walba ay ahaayeen kuwo kooban oo fudud. Si aan u dedejiyo baska, waxaan sameeyay warshad yar, sababtoo ah... Waxay ahayd inaan haysto dhawr taayir iyo kuwo kala duwan leh.

U wareejinta dhabarka dhabarka PHP ee baska durdurrada Redis iyo doorashada maktabad madax-bannaan qaab-dhismeedka

Kaliya dhowr tillaabo:

  • Waxaan abuurnaa maamulayaal fariinta kuwaas oo ah in si fudud loo waci karo
  • Waxaan ku duubnaa HandlerDescriptor (fasalka maktabadda)
  • Waxaan ku duubnaa kuwan β€œSharaxaadayaasha” tusaale ahaan HandlerLocator
  • Ku darida HandlerLocator Tusaalaha MessageBus
  • Waxaan u gudbinaa qayb 'SenderInterface' SendersLocator, xaaladdeyda tusaale ahaan fasalada 'RedisTransport', kuwaas oo loo habeeyey si cad
  • Ku darista Soo-saareLocator tusaale ahaan MessageBus

MessageBus waxa uu leeyahay habka `->dispatch()` kaas oo eegaya hawl wadeenada ku haboon HandlerLocator oo u gudbiya fariinta iyaga, iyaga oo isticmaalaya 'SenderInterface' oo u dhiganta si loogu diro baska (Redis streams).

Qaabaynta weelka (kiiskan php-di), xidhmadan oo dhan waxa loo habayn karaa sidan:

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

Halkan waxaad ku arki kartaa in SendersLocator aan u xilsaarnay "gaadiid" kala duwan oo loogu talagalay laba farriimo oo kala duwan, kuwaas oo mid kastaa uu leeyahay xiriir u gaar ah oo ku saabsan durdurrada u dhigma.

Waxaan sameeyay mashruuc demo gaar ah oo muujinaya arjiga saddexda daem ee isgaadhsiinta iyaga oo isticmaalaya baska soo socda: https://github.com/backend-university/products/tree/master/products/02-redis-streams-bus.

Laakiin waxaan ku tusi doonaa sida macaamilka loo habayn karo:

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

Isticmaalka kaabayaashan codsi

Ka dib markii aan baska ka hirgeliyay dhabarkayga, waxaan ka soocay marxalado gaar ah iyo amarkii hore oo isku mid ah waxaanan sameeyay hawlwadeeno gaar ah, kuwaas oo mid kastaa uu sameeyo wax u gaar ah.

Dhuumaha loogu talagalay in lagu daro goob cusub database-ka ayaa u eeg sidan:

U wareejinta dhabarka dhabarka PHP ee baska durdurrada Redis iyo doorashada maktabad madax-bannaan qaab-dhismeedka

Isla markiiba ka dib, waxaa ii fududaaday inaan ku daro hawlqabad cusub, tusaale ahaan, soo saarista iyo kala saarista Rss. Sababtoo ah Habkani waxa kale oo uu u baahan yahay nuxurka asalka ah, ka dibna maamulaha soosaariyaha RSS, sida WebsiteIndexHistoryPersistor, wuxuu rukunsadaa fariinta "Content/HtmlContent", wuxuu farsameeyaa oo sii gudbiyaa fariinta la rabo iyada oo la sii wado dhuumaha.

U wareejinta dhabarka dhabarka PHP ee baska durdurrada Redis iyo doorashada maktabad madax-bannaan qaab-dhismeedka

Ugu dambeyntii, waxaan ku soo gabagabeynay dhowr daemons, kuwaas oo mid kastaa uu ilaaliyo xiriirka kaliya ee ilaha lagama maarmaanka ah. Tusaale ahaan jinni gurguurta waxaa ku jira dhammaan maamulayaasha u baahan in internetka loo aado nuxurka, iyo daemon-ka adkayso qabtaa xidhiidhka database-ka.

Hadda, halkii laga dooran lahaa kaydka xogta, ids-yada loo baahan yahay ka dib marka la geliyo ku adkaysiga waxa si fudud loogu gudbiyaa baska dhammaan hawl-wadeennada danaynaya.

Source: www.habr.com

Add a comment