Fa'aliliuina le pito i tua o le PHP i le pasi a le Redis ma filifili se faletusi-tuto'atasi

Fa'aliliuina le pito i tua o le PHP i le pasi a le Redis ma filifili se faletusi-tuto'atasi

Upu Tomua

O laʻu 'upega tafaʻilagi, lea ou te tamoe o se mea e fiafia i ai, ua mamanuina e faʻafeiloaʻi ai itulau manaia o fale ma nofoaga patino. O lenei autu na amata ona ou fiafia i ai i le amataga lava o laʻu faigamalaga polokalame; i lena taimi sa ou fiafia i le sailia o polofesa sili e tusitusi e uiga ia i latou lava, a latou mea e fiafia i ai ma galuega faatino. O le masani o le mauaina o latou mo aʻu lava e tumau pea e oʻo mai i le aso: toetoe lava o pisinisi uma ma e le o faʻatau pisinisi, o loʻo faʻaauau pea ona ou vaʻavaʻai i le vae i le sailiga o fesoʻotaʻiga i tusitala.

Fa'atinoina o le manatu

O le lomiga muamua na o se itulau html i luga o laʻu upega tafaʻilagi patino, lea ou te tuʻuina ai sootaga ma saini i totonu o se lisi ul. O le taina o itulau 20 i luga o se vaitaimi, na amata ona ou manatu e le aoga tele lenei mea ma filifili ai e taumafai e faʻautometi le faagasologa. I luga o le stackoverflow, na ou matauina le tele o tagata o loʻo faʻaalia nofoaga i totonu o latou talaaga, o lea na ou tusia ai se parser i le php, lea na na o le faʻaogaina o faʻamatalaga, amata i le muamua (tuatusi i luga ole SO e oʻo mai i le aso e pei o lenei: `/users/1` ), maua mai sootaga mai le pine manaʻomia ma faʻaopoopo i SQLite.

E mafai ona taʻua lenei mea o le lomiga lona lua: o se aofaʻiga o le fiasefulu afe o URL i totonu ole laulau SQLite, lea na suia ai le lisi faʻamau i le html. Sa ou faia se sailiga faigofie i lenei lisi. Aua sa i ai na'o URL, ona fa'atatau lea o le sailiga.

I lenei laʻasaga na ou lafoaia le poloketi ma toe foi i ai ina ua mavae se taimi umi. I lenei laʻasaga, o loʻu poto masani i galuega ua silia ma le tolu tausaga ma sa ou lagona e mafai ona ou faia se mea e sili atu ona ogaoga. E le gata i lea, sa i ai se manaʻoga tele e faʻatautaia tekinolosi fou.

Faiga fa'aonaponei

Проект faʻapipiʻiina i Docker, o le database na tuʻuina atu i mongoDb, ma talu ai nei, na faʻaopoopoina ai le radish, lea na muamua mo le faʻaogaina. O se tasi o PHP microframeworks o loʻo faʻaaogaina e fai ma faavae.

faafitauli

O nofoaga fou e faʻaopoopoina e se faʻatonuga faʻamafanafana e faia faʻatasi mea nei:

  • La'uina i lalo mea e ala ile URL
  • Seti se fu'a e fa'ailoa ai pe na maua le HTTPS
  • Faasaoina le ute o le upega tafaʻilagi
  • O le puna HTML ma ulutala o loʻo faʻasaoina i le "faasino igoa" talafaasolopito
  • Fa'asalalau mea e aofia ai, fa'asolo mai Igoa ma Fa'amatalaga
  • Fa'asaoina fa'amaumauga i se fa'aputuga ese

Na lava lea e na o le teuina o nofoaga ma faʻaalia i se lisi:

Fa'aliliuina le pito i tua o le PHP i le pasi a le Redis ma filifili se faletusi-tuto'atasi

Ae o le manatu o le faʻavasegaina otometi, faʻavasegaina ma faʻavasega mea uma, tausia mea uma i le taimi nei, e leʻi fetaui lelei i lenei faʻataʻitaʻiga. E oʻo lava i le faʻaopoopoina o se auala i luga ole laiga e faʻaopoopo ai itulau manaʻomia le faʻasologa o tulafono ma poloka e aloese ai mai DDoS.

I se tulaga lautele, ioe, o mea uma e mafai ona faia faʻatasi, ma i luga o le upega tafaʻilagi e mafai ona e faʻasaoina le URL ina ia mafai ai e le daemon mataʻutia ona faia uma galuega mo URL mai le lisi. Ae ui i lea, e oʻo lava i le upu "queue" o loʻo faʻaalia ai lava. Ma afai e faʻatinoina se laina, ona mafai lea ona vaevaeina galuega uma ma faʻatino a itiiti ifo i le asynchronously.

faaiuga

Fa'atino laina ma fai se faiga e fa'atupu mea e fa'atino ai galuega uma. Ma sa ou manaʻo e faʻataʻitaʻi Redis Streams mo se taimi umi.

Faʻaaogaina o vaitafe Redis ile PHP

Aua Talu ai o laʻu faʻavae e le o se tasi o le tolu sauai Symfony, Laravel, Yii, ou te manaʻo e suʻe se faletusi tutoʻatasi. Ae, e pei ona i ai (i le suʻega muamua), e le mafai ona maua ni faletusi ogaoga taʻitasi. O mea uma e feso'ota'i ma fa'asologa o se poloketi mai le 3 faia i le lima tausaga talu ai, pe o lo'o noatia i le fa'avae.

Ua ou faalogo i le tele o mea e uiga ia Symfony o se sapalai o vaega aoga taitasi, ma ua uma ona ou faaaogaina nisi o ia mea. Ma o nisi foi mea mai Laravel e mafai foi ona faʻaaogaina, mo se faʻataʻitaʻiga o latou ORM, e aunoa ma le i ai o le faʻavae lava ia.

symfony / avefeau

O le sui muamua na vave foliga lelei ma e aunoa ma se masalosalo na ou faʻapipiʻiina. Ae na sili atu ona faigata i google faʻataʻitaʻiga o le faʻaogaina i fafo atu o Symfony. E faʻafefea ona faʻapipiʻi se pasi mo le feʻaveaʻi o feʻau mai le tele o vasega ma igoa lautele, leai se uiga, ma e oʻo lava ile Redis?

Fa'aliliuina le pito i tua o le PHP i le pasi a le Redis ma filifili se faletusi-tuto'atasi

O faʻamaumauga i luga o le 'upega tafaʻilagi aloaia na matua auiliiliina, ae o le amataga na faʻamatalaina mo Symfony e faʻaaoga ai le latou YML sili ona fiafia i ai ma isi togafiti faʻataulāitu mo le tagata e le o le symphonist. Ou te leʻi fiafia i le faʻapipiʻiina o ia lava, aemaise lava i aso malolo o le Tausaga Fou. Ae sa tatau ona ou faia lenei mea mo se taimi umi e lei mafaufauina.

O le taumafai e mafaufau pe faʻafefea ona faʻapipiʻi se faiga e faʻaaoga ai punaoa a Symfony e le o se galuega sili ona taua mo se taimi umi:

Fa'aliliuina le pito i tua o le PHP i le pasi a le Redis ma filifili se faletusi-tuto'atasi

Ina ua uma ona ou suʻesuʻeina nei mea uma ma taumafai e fai se mea i oʻu lima, na ou oʻo mai i le faaiuga o loʻo ou faia se ituaiga o tootoo ma filifili e faʻataʻitaʻi se isi mea.

fa'amalamalama/tulaga

Na aliali mai o lenei faletusi na fusia mau i le Laravel infrastructure ma le tele o isi faʻalagolago, o lea na ou le faʻaaluina ai se taimi tele i ai: Na ou faʻapipiʻiina, tilotilo i ai, vaʻai i faʻalagolago ma tapeina.

yiisoft/yii2-queue

Ia, o iinei na vave faʻaaogaina mai le igoa, toe, o se fesoʻotaʻiga malosi i Yii2. Sa tatau ona ou faʻaogaina lenei faletusi ma e leʻo leaga, ae ou te leʻi mafaufau i le mea moni e faʻalagolago atoa i Yii2.

O le malologa

O isi mea uma na ou mauaina i luga ole GitHub e le faʻatuatuaina, tuai ma lafoaia galuega faatino e aunoa ma fetu, tui ma le tele o tautinoga.

Toe fo'i ile symfony/messenger, fa'amatalaga fa'apitoa

Sa tatau ona ou suʻeina lenei faletusi ma, ina ua uma ona faʻaalu sina taimi, sa mafai. Na aliali mai o mea uma sa fai si pupuu ma faigofie. Ina ia faʻavave le pasi, na ou faia ai se tamai fale gaosimea, aua ... Sa tatau ona tele a'u pa'u ma e eseese fo'i le au.

Fa'aliliuina le pito i tua o le PHP i le pasi a le Redis ma filifili se faletusi-tuto'atasi

Na'o ni nai laasaga:

  • Matou te faia ni au fe'au e tatau ona faigofie ona vala'au
  • Matou te afifiina i le HandlerDescriptor (vasega mai le faletusi)
  • Matou te afifiina nei "Descriptors" i se faʻataʻitaʻiga HandlersLocator
  • Fa'aopoopoina HandlersLocator ile fa'ata'ita'iga MessageBus
  • Matou te tuʻuina atu se seti o le 'SenderInterface' i le SendersLocator, i loʻu tulaga faʻataʻitaʻiga o vasega 'RedisTransport', o loʻo faʻatulagaina i se auala manino.
  • Fa'aopoopo le SendersLocator ile fa'ata'ita'iga MessageBus

O le MessageBus o loʻo i ai le '-> dispatch ()' auala e suʻe ai le aufaipisinisi talafeagai i le HandlersLocator ma pasi atu le feʻau ia i latou, e faʻaaoga ai le 'SenderInterface' e fetaui ma le pasi (Redis streams).

I le faʻatulagaina o pusa (i lenei tulaga php-di), e mafai ona faʻapipiʻiina lenei fusi atoa e pei o lenei:

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

O iinei e mafai ona e vaʻai ai i le SendersLocator ua matou tuʻuina atu "feʻaveaʻi" eseese mo feʻau eseese e lua, o ia mea taʻitasi e iai lona lava fesoʻotaʻiga i vaitafe tutusa.

Na ou faia se isi faʻataʻitaʻiga faʻataʻitaʻiga e faʻaalia ai se faʻaoga o le tolu daemons e fesoʻotaʻi ma le tasi ma le isi e faʻaaoga ai le pasi lea: https://github.com/backend-university/products/tree/master/products/02-redis-streams-bus.

Ae o le a ou faʻaali atu ia te oe le auala e mafai ai ona faʻatulagaina se tagata faʻatau:

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

Fa'aaogāina o lenei atina'e i se fa'aoga

I le faʻatinoina o le pasi i loʻu pito i tua, sa ou vavaeeseina laʻasaga taʻitasi mai le faʻatonuga tuai ma faia ni tagata taʻitoʻatasi, e faia e i latou uma a latou lava mea.

O le paipa mo le faʻaopoopoina o se nofoaga fou i le database e pei o lenei:

Fa'aliliuina le pito i tua o le PHP i le pasi a le Redis ma filifili se faletusi-tuto'atasi

Ma i le taimi lava na maeʻa ai, na sili atu ona faigofie mo aʻu le faʻaopoopoina o galuega fou, mo se faʻataʻitaʻiga, suʻeina ma faʻasalalau Rss. Aua e mana'omia fo'i e lenei faiga le ulua'i anotusi, ona fa'auluina lea e le RSS link extractor handler, pei o le WebsiteIndexHistoryPersistor, i le "Content/HtmlContent" fe'au, fa'agasolo ma pasi atu le fe'au mana'omia i lana paipa.

Fa'aliliuina le pito i tua o le PHP i le pasi a le Redis ma filifili se faletusi-tuto'atasi

I le iʻuga, na matou faʻamaeʻaina le tele o daemons, o ia mea taʻitasi o loʻo tausia naʻo fesoʻotaʻiga i punaoa talafeagai. Mo se faataitaiga o se temoni crawlers o loʻo i ai uma tagata faʻatautaia e manaʻomia le alu i luga ole Initaneti mo mea e aofia ai, ma le daemon tumau umia se sootaga i le database.

I le taimi nei, nai lo le filifilia mai le database, o id mana'omia pe a uma ona fa'aofiina e le persister e na'o le tu'uina atu e ala i le pasi i tagata uma e fiafia i ai.

puna: www.habr.com

Faaopoopo i ai se faamatalaga