Canja wurin bayan PHP zuwa bas ɗin rafukan Redis da zabar ɗakin karatu mai zaman kansa

Canja wurin bayan PHP zuwa bas ɗin rafukan Redis da zabar ɗakin karatu mai zaman kansa

Magana

Gidan yanar gizona, wanda nake gudana azaman abin sha'awa, an ƙera shi don ɗaukar bakuncin shafukan gida masu ban sha'awa da shafukan sirri. Wannan batu ya fara ba ni sha'awa a farkon tafiya ta shirye-shirye, a lokacin na yi sha'awar samun ƙwararrun ƙwararru waɗanda ke yin rubuce-rubuce game da kansu, abubuwan sha'awarsu da ayyukansu. Halin gano su da kaina ya kasance har zuwa yau: a kusan kowane shafin kasuwanci kuma ba kasuwanci ba ne, na ci gaba da duba cikin gindin neman hanyoyin haɗi zuwa marubuta.

Aiwatar da ra'ayin

Sigar farko shine kawai shafin html akan gidan yanar gizona na sirri, inda na sanya hanyoyin haɗi tare da sa hannu a cikin jerin ul. Bayan buga shafuka 20 na tsawon lokaci, na fara tunanin cewa wannan ba shi da tasiri sosai kuma na yanke shawarar gwada sarrafa kansa. A kan tashe-tashen hankula, na lura cewa mutane da yawa suna nuna shafuka a cikin bayanansu, don haka na rubuta parser a cikin php, wanda kawai ya shiga cikin bayanan martaba, farawa da farko (adiresoshin SO har yau kamar haka: `/users/1` ), fitar da hanyoyin haɗin kai daga alamar da ake so kuma ƙara shi a cikin SQLite.

Ana iya kiran wannan siga ta biyu: tarin dubun-dubatar URLs a cikin tebur na SQLite, wanda ya maye gurbin jeri na tsaye a HTML. Na yi bincike mai sauƙi akan wannan jeri. Domin akwai URLs kawai, sannan binciken ya dogara kawai akan su.

A wannan matakin na watsar da aikin na dawo gare shi bayan dogon lokaci. A wannan mataki, aikina ya riga ya wuce shekaru uku kuma na ji cewa zan iya yin wani abu mafi mahimmanci. Bugu da kari, akwai babban sha'awar sanin sabbin fasahohi.

Sigar zamani

Wannan aikin An tura shi a Docker, an canza ma'aunin bayanai zuwa mongoDb, kuma kwanan nan, an ƙara radish, wanda da farko shine kawai don caching. Ana amfani da ɗaya daga cikin microframeworks na PHP azaman tushe.

matsala

Ana ƙara sabbin rukunin yanar gizo ta hanyar umarnin wasan bidiyo wanda ke yin aiki tare:

  • Zazzage abun ciki ta URL
  • Yana saita tuta mai nuna ko akwai HTTPS
  • Yana kiyaye ainihin gidan yanar gizon
  • Ana ajiye tushen HTML da masu kai a cikin tarihin "fididdigar".
  • Fassara abun ciki, cire Take da Bayani
  • Ajiye bayanai zuwa tarin daban

Wannan ya isa kawai don adana shafuka da nuna su cikin jeri:

Canja wurin bayan PHP zuwa bas ɗin rafukan Redis da zabar ɗakin karatu mai zaman kansa

Amma ra'ayin yin lissafi ta atomatik, rarrabawa da martaba komai, kiyaye komai har zuwa yau, bai dace da wannan yanayin ba. Ko da ƙara hanyar yanar gizo kawai don ƙara kwafin lambar da ake buƙata da kuma toshewa don guje wa yuwuwar DDoS.

Gabaɗaya, ba shakka, ana iya yin komai tare da juna, kuma a cikin hanyar yanar gizo za ku iya kawai adana URL ɗin don mugun daemon ya yi duk ayyukan URLs daga jerin. Amma duk da haka, ko da a nan kalmar "layin layi" tana nuna kanta. Kuma idan an aiwatar da jerin gwano, to ana iya raba dukkan ayyuka kuma a yi aƙalla asynchronously.

yanke shawara

Aiwatar da layukan layi da yin tsarin gudanar da taron don sarrafa duk ayyuka. Kuma na dade ina son gwada Redis Streams.

Yin amfani da rafukan Redis a cikin PHP

Domin Tunda tsarina baya ɗaya daga cikin ƙattai uku Symfony, Laravel, Yii, Ina so in sami ɗakin karatu mai zaman kansa. Amma, kamar yadda ya juya (a farkon jarrabawar), ba shi yiwuwa a sami ɗayan manyan ɗakunan karatu. Duk abin da ke da alaƙa da layi ko dai aikin daga 3 ya yi shekaru biyar da suka gabata, ko kuma an ɗaure shi da tsarin.

Na ji abubuwa da yawa game da Symfony a matsayin mai ba da kayan haɗin kai masu amfani, kuma na riga na yi amfani da wasu daga cikinsu. Hakanan ana iya amfani da wasu abubuwa daga Laravel, misali ORM ɗin su, ba tare da kasancewar tsarin kanta ba.

symfony/manzo

Dan takara na farko nan da nan ya yi kama da manufa kuma ba tare da wata shakka ba na shigar da shi. Amma ya zama mafi wahala ga google misalan amfani a wajen Symfony. Yadda ake haɗawa daga gungun azuzuwan tare da sunaye na duniya, marasa ma'ana, bas don aika saƙonni, har ma akan Redis?

Canja wurin bayan PHP zuwa bas ɗin rafukan Redis da zabar ɗakin karatu mai zaman kansa

Takaddun da ke kan rukunin yanar gizon sun cika daki-daki, amma ƙaddamarwar an bayyana shi ne kawai don Symfony ta amfani da YML da suka fi so da sauran hanyoyin sihiri don waɗanda ba su da alama. Ba ni da sha'awar tsarin shigarwa kanta, musamman a lokacin bukukuwan Sabuwar Shekara. Amma dole na yi wannan na dogon lokaci ba zato ba tsammani.

Ƙoƙarin gano yadda ake aiwatar da tsarin ta amfani da kafofin Symfony shima ba shine mafi ƙarancin aiki ba don ƙayyadaddun lokaci:

Canja wurin bayan PHP zuwa bas ɗin rafukan Redis da zabar ɗakin karatu mai zaman kansa

Bayan na zurfafa cikin wannan duka da ƙoƙarin yin wani abu da hannuna, sai na yanke shawarar cewa ina yin wani nau'i na ƙugiya kuma na yanke shawarar gwada wani abu dabam.

haske / jerin gwano

Ya bayyana cewa wannan ɗakin karatu yana daure sosai da kayan aikin Laravel da ɗimbin sauran abubuwan dogaro, don haka ban ɓata lokaci mai yawa akansa ba: Na shigar da shi, na duba, na ga abubuwan dogaro kuma na share shi.

yisoft/yii2-queue

Da kyau, nan da nan an ɗauka daga sunan, kuma, ƙaƙƙarfan haɗi zuwa Yii2. Dole ne in yi amfani da wannan ɗakin karatu kuma ba shi da kyau, amma ban yi tunanin gaskiyar cewa gaba ɗaya ya dogara da Yii2 ba.

Sauran

Duk sauran abubuwan da na samo akan GitHub sun kasance marasa dogaro, daɗaɗɗen ayyukan da aka yi watsi da su ba tare da tauraro ba, cokali mai yatsu da adadi mai yawa na aikatawa.

Koma zuwa symfony/manzo, cikakkun bayanai na fasaha

Dole ne in gano wannan ɗakin karatu kuma, bayan ɗan ƙara ɗan lokaci, na sami damar. Sai ya juya cewa duk abin da aka quite a takaice da kuma sauki. Don gaggawar bas ɗin, na yi ƙaramin masana'anta, saboda ... Ya kamata in sami tayoyi da yawa kuma tare da ma'aikata daban-daban.

Canja wurin bayan PHP zuwa bas ɗin rafukan Redis da zabar ɗakin karatu mai zaman kansa

Matakai kaɗan:

  • Mun ƙirƙiri masu sarrafa saƙo waɗanda yakamata su zama abin kira kawai
  • Mun kunsa su a HandlerDescriptor (aji daga ɗakin karatu)
  • Muna kunsa waɗannan “Masu Bayani” a cikin misalin HandlerLocator
  • Ƙara HandlerLocator zuwa misalin MessageBus
  • Mun ƙaddamar da saitin 'SenderInterface' zuwa SendersLocator, a cikin yanayin da nake yi na azuzuwan 'RedisTransport', waɗanda aka tsara su a bayyane.
  • Ƙara SendersLocator zuwa misalin MessageBus

MessageBus yana da hanyar `-> aikawa ()` wanda ke duba masu dacewa a cikin HandlersLocator kuma ya tura musu saƙon, ta amfani da 'SenderInterface' mai dacewa don aikawa ta hanyar bas (Redis streams).

A cikin saitin kwantena (a cikin wannan yanayin php-di), ana iya daidaita wannan duka duka kamar haka:

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

Anan za ku iya ganin cewa a cikin SendersLocator mun sanya nau'ikan "transporting" daban-daban don saƙonni biyu daban-daban, kowannensu yana da nasa haɗin kai zuwa magudanar ruwa.

Na yi wani aikin demo daban wanda ke nuna aikace-aikacen daemons uku suna sadarwa da juna ta amfani da bas mai zuwa: https://github.com/backend-university/products/tree/master/products/02-redis-streams-bus.

Amma zan nuna muku yadda za a iya tsara mabukaci:

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

Amfani da wannan kayan aikin a cikin aikace-aikacen

Bayan aiwatar da bas ɗin a bayana, na ware matakai ɗaya daga tsohon umarni na daidaitawa kuma na yi masu sarrafa daban-daban, kowannensu yana yin nasa.

Bututun don ƙara sabon rukunin yanar gizon zuwa ma'ajin bayanai yayi kama da haka:

Canja wurin bayan PHP zuwa bas ɗin rafukan Redis da zabar ɗakin karatu mai zaman kansa

Kuma nan da nan bayan haka, ya zama mafi sauƙi a gare ni don ƙara sababbin ayyuka, misali, cirewa da rarraba Rss. Domin wannan tsari kuma yana buƙatar ainihin abun ciki, sannan mai sarrafa hanyar haɗin RSS, kamar WebsiteIndexHistoryPersistor, yana biyan saƙon "Content/HtmlContent", yana sarrafa shi kuma yana ƙaddamar da saƙon da ake so tare da bututun sa gaba.

Canja wurin bayan PHP zuwa bas ɗin rafukan Redis da zabar ɗakin karatu mai zaman kansa

A ƙarshe, mun ƙare da daemons da yawa, kowannensu yana kula da haɗin kai kawai ga albarkatun da ake bukata. Misali aljani mahaukata ya ƙunshi duk ma'aikatan da ke buƙatar zuwa Intanet don abun ciki, da kuma daemon nace yana riƙe haɗi zuwa bayanan bayanai.

Yanzu, maimakon zaɓi daga ma'ajin bayanai, ids ɗin da ake buƙata bayan shigar da mai dagewa ana watsa shi ta hanyar bas ɗin zuwa duk masu sha'awar.

source: www.habr.com

Add a comment