Inneall PHP a aistriú chuig bus sruthanna Redis agus leabharlann creat-neamhspleách a roghnú

Inneall PHP a aistriú chuig bus sruthanna Redis agus leabharlann creat-neamhspleách a roghnú

Réamhrá

Tá mo shuíomh Gréasáin, a ritheann mé mar chaitheamh aimsire, deartha chun leathanaigh baile agus suíomhanna pearsanta suimiúla a óstáil. Chuir an topaic seo spéis ag tús mo thurais ríomhchlárúcháin; ag an nóiméad sin bhí an-suim agam le daoine gairmiúla den scoth a aimsiú a scríobhann fúthu féin, faoina gcuid caitheamh aimsire agus faoina dtionscadail. Is é an nós fós iad a fháil amach dom féin go dtí an lá inniu: ar beagnach gach suíomh tráchtála agus nach bhfuil an-tráchtála, leanaim orm ag breathnú sa bhuntásc ar thóir naisc leis na húdair.

Cur i bhfeidhm an smaoineamh

Ní raibh sa chéad leagan ach leathanach html ar mo shuíomh Gréasáin pearsanta, áit ar chuir mé naisc le sínithe isteach i liosta ul. Tar éis dom 20 leathanach a chlóscríobh thar thréimhse ama, thosaigh mé ag smaoineamh nach raibh sé seo an-éifeachtach agus chinn mé iarracht a dhéanamh an próiseas a uathoibriú. Ar stackoverflow, thug mé faoi deara go léiríonn go leor daoine suíomhanna ina bpróifílí, agus mar sin scríobh mé parsálaí i php, a chuaigh go simplí trí na próifílí, ag tosú leis an gcéad cheann (seoltaí ar SO go dtí an lá atá inniu ann mar seo: `/users/1` ), bhaintear naisc as an gclib atá ag teastáil agus cuireadh leis in SQLite é.

Is féidir an dara leagan a thabhairt air seo: bailiúchán de na mílte URL i dtábla SQLite, a tháinig in ionad an liosta statach i HTML. Rinne mé cuardach simplí ar an liosta seo. Mar ní raibh ach URLanna, ansin bhí an cuardach bunaithe go simplí orthu.

Ag an gcéim seo thréig mé an tionscadal agus d'fhill mé air tar éis tamaill fhada. Ag an gcéim seo, bhí mo thaithí oibre níos mó ná trí bliana cheana féin agus bhraith mé go bhféadfainn rud éigin níos tromchúisí a dhéanamh. Ina theannta sin, bhí fonn mór chun máistreacht a dhéanamh ar theicneolaíochtaí réasúnta nua.

Leagan nua-aimseartha

Tionscadail imscaradh i Docker, aistríodh an bunachar sonraí go mongoDb, agus le déanaí, cuireadh raidis leis, a bhí ar dtús ach le haghaidh taisce. Úsáidtear ceann de na microframeworks PHP mar bhunús.

fadhb

Cuirtear suíomhanna nua leis trí ordú consól a dhéanann na rudaí seo a leanas go sioncronach:

  • Íoslódáil ábhar trí URL
  • Socraíonn sé bratach a thugann le fios an raibh HTTPS ar fáil
  • Caomhnaíonn sé croílár an láithreáin ghréasáin
  • Sábháiltear an fhoinse HTML agus na ceanntásca sa stair “innéacsú”.
  • Parsálann ábhar, sleachta Teideal agus Cur síos
  • Sábhálann sonraí chuig bailiúchán ar leith

Ba leor é seo chun suíomhanna a stóráil agus iad a thaispeáint i liosta:

Inneall PHP a aistriú chuig bus sruthanna Redis agus leabharlann creat-neamhspleách a roghnú

Ach níor tháinig an smaoineamh ar gach rud a innéacsú go huathoibríoch, a chatagóiriú agus a rangú, gach rud a choinneáil cothrom le dáta, go maith leis an paradigm seo. Fiú amháin trí mhodh gréasáin a chur leis chun leathanaigh a chur leis is gá dúbailt cód agus blocáil chun DDoS féideartha a sheachaint.

Go ginearálta, ar ndóigh, is féidir gach rud a dhéanamh go sioncrónach, agus ar an modh gréasáin is féidir leat an URL a shábháil go simplí ionas go gcomhlíonfaidh an deamhan monstrous na tascanna go léir do na URLanna ón liosta. Ach fós féin, fiú anseo tá an focal “scuaine” le fios é féin. Agus má chuirtear scuaine i bhfeidhm, ansin is féidir na tascanna go léir a roinnt agus a dhéanamh go asincrónach ar a laghad.

cinneadh

Cuir scuainí i bhfeidhm agus déan córas imeacht-tiomáinte chun gach tasc a phróiseáil. Agus tá mé ag iarraidh triail a bhaint as Redis Streams le fada an lá.

Ag baint úsáide as sruthanna Redis i PHP

Mar Ós rud é nach bhfuil mo chreat ar cheann de na trí fhathach Symfony, Laravel, Yii, ba mhaith liom leabharlann neamhspleách a fháil. Ach, mar a d'éirigh sé amach (ar an gcéad scrúdú), tá sé dodhéanta leabharlanna tromchúiseacha aonair a aimsiú. Is tionscadal ó 3 tiomantas cúig bliana ó shin é gach rud a bhaineann le scuainí, nó tá sé ceangailte leis an gcreat.

Chuala mé go leor faoi Symfony mar sholáthraí comhpháirteanna úsáideacha aonair, agus úsáidim cuid acu cheana féin. Agus is féidir roinnt rudaí ó Laravel a úsáid freisin, mar shampla a n-ORM, gan láithreacht an chreata féin.

symfony/teachtaire

Bhí cuma idéalach ar an gcéad iarrthóir láithreach agus gan amhras chuir mé isteach é. Ach d'éirigh sé níos deacra samplaí úsáide lasmuigh de Symfony a google. Conas teacht le chéile ó sraith ranganna le hainmneacha uilíocha gan brí, bus chun teachtaireachtaí a rith, agus fiú ar Redis?

Inneall PHP a aistriú chuig bus sruthanna Redis agus leabharlann creat-neamhspleách a roghnú

Bhí an doiciméadú ar an suíomh oifigiúil mionsonraithe go leor, ach níor cuireadh síos ar an inisealú ach amháin le haghaidh Symfony ag baint úsáide as a n-YML is fearr leo agus modhanna draíochta eile don neamhshiansach. Ní raibh suim ar bith agam sa phróiseas suiteála féin, go háirithe le linn laethanta saoire na Bliana Nua. Ach bhí orm é seo a dhéanamh ar feadh i bhfad gan choinne.

Ní hé an tasc is fánach le haghaidh spriocdháta teann a dhéanamh amach conas córas a chur ar an toirt ag baint úsáide as foinsí Symfony:

Inneall PHP a aistriú chuig bus sruthanna Redis agus leabharlann creat-neamhspleách a roghnú

Tar éis dom dul i ngleic leis seo go léir agus iarracht a dhéanamh rud éigin a dhéanamh le mo lámha, tháinig mé ar an tátal go raibh mé ag déanamh crutches de chineál éigin agus chinn mé triail a bhaint as rud éigin eile.

soilsithe/scuaine

Tharla sé go raibh an leabharlann seo ceangailte go dlúth le bonneagar Laravel agus le roinnt spleáchais eile, mar sin níor chaith mé mórán ama air: shuiteáil mé é, d'fhéach mé air, chonaic mé na spleáchais agus scrios mé é.

yiisoft/yii2-scuaine

Bhuel, anseo glacadh leis láithreach ón ainm, arís, nasc docht le Yii2. Bhí orm an leabharlann seo a úsáid agus ní raibh sé go dona, ach níor smaoinigh mé ar an bhfíric go mbraitheann sé go hiomlán ar Yii2.

An chuid eile

Bhí gach rud eile a fuair mé ar GitHub ina thionscadail neamhiontaofa, as dáta agus tréigthe gan réaltaí, forcanna agus líon mór gealltanais.

Fill ar symfony/teachtaire, sonraí teicniúla

Bhí orm an leabharlann seo a dhéanamh amach agus, tar éis níos mó ama a chaitheamh, bhí mé in ann. Iompaigh sé amach go raibh gach rud gonta agus simplí. Chun an bus a chur ar an toirt, rinne mé monarcha bheag, mar... Bhí mé ag ceapadh go mbeadh roinnt boinn agam agus láimhseálaithe éagsúla.

Inneall PHP a aistriú chuig bus sruthanna Redis agus leabharlann creat-neamhspleách a roghnú

Níl ann ach cúpla céim:

  • Cruthaímid láimhseálaithe teachtaireachtaí ar cheart go mbeidís inghlaoite go simplí
  • Fillteaimid iad i HandlerDescriptor (rang ón leabharlann)
  • Fillteaimid na “Tuairisceoirí” seo i gcás HandlersLocator
  • HandlersLocator á chur leis an ásc MessageBus
  • Cuirimid sraith `SenderInterface` ar aghaidh chuig SendersLocator, i mo chás-se ranganna `RedisTransport`, atá cumraithe ar bhealach soiléir
  • Ag cur SendersLocator leis an ásc MessageBus

Tá modh `->seolta()` ag MessageBus a fhéachann suas na láimhseálaithe cuí sa HandlersLocator agus a sheolann an teachtaireacht chucu, ag baint úsáide as an `SenderInterface` comhfhreagrach chun é a sheoladh tríd an mbus (sruthanna Redis).

I gcumraíocht an choimeádáin (php-di sa chás seo), is féidir an beart iomlán seo a chumrú mar seo:

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

Anseo, is féidir leat a fheiceáil go bhfuil “iompair” éagsúla sannta againn i SendersLocator le haghaidh dhá theachtaireacht dhifriúla, a bhfuil a nasc féin ag gach ceann acu leis na sruthanna comhfhreagracha.

Rinne mé tionscadal taispeána ar leith ag léiriú feidhmchlár de thrí dheamhan ag déanamh cumarsáide lena chéile ag baint úsáide as an mbus seo a leanas: https://github.com/backend-university/products/tree/master/products/02-redis-streams-bus.

Ach taispeánfaidh mé duit conas is féidir struchtúr a chur ar thomhaltóir:

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

Ag baint úsáide as an mbonneagar seo in iarratas

Tar éis dom an bus a chur i bhfeidhm i mo chúl, scar mé céimeanna aonair ón sean-ordú sioncronach agus rinne mé láimhseálaithe ar leith, agus déanann gach duine acu a rud féin.

Bhí cuma mar seo ar an bpíblíne chun suíomh nua a chur leis an mbunachar sonraí:

Inneall PHP a aistriú chuig bus sruthanna Redis agus leabharlann creat-neamhspleách a roghnú

Agus díreach ina dhiaidh sin, bhí sé i bhfad níos éasca dom feidhmiúlacht nua a chur leis, mar shampla, RS a bhaint agus a pharsáil. Mar Éilíonn an próiseas seo freisin an t-ábhar bunaidh, ansin déanann an láimhseálaí eastósctha nasc RSS, cosúil le WebsiteIndexHistoryPersistor, síntiús don teachtaireacht “Ábhar / Ábhar HTML”, próiseálann é agus cuireann sé an teachtaireacht atá ag teastáil ar aghaidh níos faide ar aghaidh.

Inneall PHP a aistriú chuig bus sruthanna Redis agus leabharlann creat-neamhspleách a roghnú

Sa deireadh, chríochnaigh muid suas le roinnt deamhan, gach ceann acu a choimeádann naisc amháin leis na hacmhainní riachtanacha. Mar shampla diabhal scríobhtá ina bhfuil na láimhseálaithe go léir a dteastaíonn uathu dul chuig an Idirlíon le haghaidh ábhar, agus an deamhan seasfaidh siad tá nasc aige leis an mbunachar sonraí.

Anois, in ionad roghnú ón mbunachar sonraí, tarchuirtear na haitheantais riachtanacha tar éis iad a chur isteach tríd an mbus chuig gach láimhseálaí leasmhara.

Foinse: will.com

Add a comment