Mamindra ny backend PHP mankany amin'ny bus redis streams ary misafidy tranomboky tsy miankina amin'ny framework

Mamindra ny backend PHP mankany amin'ny bus redis streams ary misafidy tranomboky tsy miankina amin'ny framework

sasin-teny

Ny tranokalako, izay ataoko ho fialamboly, dia natao hampiantrano pejy mahaliana sy tranokala manokana. Nanomboka nahaliana ahy ity lohahevitra ity tamin'ny fiandohan'ny diako fandaharana; tamin'izay fotoana izay dia nahavariana ahy ny nahita matihanina matihanina izay manoratra momba ny tenany, ny fialamboliny ary ny tetikasany. Ny fahazarana mahita azy ireo ho ahy dia mbola mitoetra mandraka androany: saika amin'ny tranokala ara-barotra rehetra fa tsy tena ara-barotra, dia manohy mijery ny footer aho amin'ny fitadiavana rohy mankany amin'ireo mpanoratra.

Fampiharana ny hevitra

Ny dikan-teny voalohany dia pejy html fotsiny ao amin'ny tranokalako manokana, izay nametrahako rohy misy sonia ao anaty lisitra ul. Rehefa nitendry pejy 20 tao anatin'ny fe-potoana iray aho, dia nanomboka nieritreritra aho fa tsy dia mandaitra loatra izany ary nanapa-kevitra ny hanandrana hanao automatique ny dingana aho. Tamin'ny stackoverflow dia nahatsikaritra aho fa maro ny olona manondro tranokala ao amin'ny mombamomba azy, ka nanoratra parser amin'ny php aho, izay nandalo fotsiny ny mombamomba azy, nanomboka tamin'ny voalohany (ny adiresy ao amin'ny SO hatramin'izao dia toy izao: `/users/1` ), naka rohy avy amin'ny tenifototra tiana ary nampidirina tao amin'ny SQLite.

Ity dia azo antsoina hoe dikan-teny faharoa: fitambarana URL an'aliny ao anaty latabatra SQLite, izay nisolo ny lisitra static amin'ny html. Nanao fikarohana tsotra aho tamin'ity lisitra ity. SATRIA URL ihany no nisy, dia nifototra tamin'izy ireo fotsiny ny fikarohana.

Tamin'ity dingana ity dia nandao ny tetikasa aho ary niverina tamin'izany rehefa ela ny ela. Tamin'ity dingana ity dia efa mihoatra ny telo taona ny traikefako amin'ny asa ary nahatsapa aho fa afaka manao zavatra matotra kokoa. Ankoatra izany, dia nisy faniriana lehibe hifehy ny teknolojia somary vaovao.

Dika maoderina

Ny tetikasa napetraka tao amin'ny Docker, nafindra tany mongoDb ny angon-drakitra, ary vao haingana dia nampiana radish, izay natao ho an'ny caching fotsiny. Ny iray amin'ireo PHP microframeworks dia ampiasaina ho fototra.

olana

Ny tranokala vaovao dia ampiana amin'ny baiko console izay manao izao manaraka izao:

  • Misintona votoaty amin'ny URL
  • Mametraka saina manondro raha misy HTTPS
  • Mitahiry ny votoatin'ny tranokala
  • Ny loharano HTML sy ny lohateny dia voatahiry ao amin'ny tantaran'ny "indexing".
  • Mamadika votoaty, maka ny lohateny sy ny famaritana
  • Mitahiry angona amina fanangonana misaraka

Ampy izany mba hitehirizana tranokala tsotra sy hanehoana azy ireo anaty lisitra:

Mamindra ny backend PHP mankany amin'ny bus redis streams ary misafidy tranomboky tsy miankina amin'ny framework

Saingy ny hevitra momba ny fanondroana ho azy, ny fanasokajiana ary ny fanasokajiana ny zava-drehetra, ny fitazonana ny zava-drehetra ho an'ny daty, dia tsy nifanaraka tsara tamin'ity paradigma ity. Na dia manampy fomba tranonkala fotsiny aza mba hanampiana pejy dia ilaina ny fandikana kaody sy fanakanana mba hisorohana ny mety ho DDoS.

Amin'ny ankapobeny, mazava ho azy, ny zava-drehetra dia azo atao miaraka, ary amin'ny fomba tranonkala dia azonao atao ny mitahiry ny URL fotsiny mba hahafahan'ny daemon goavambe manao ny asa rehetra ho an'ny URL avy amin'ny lisitra. Na izany aza, na dia eto aza ny teny hoe "filaharana" dia manondro ny tenany. Ary raha misy filaharana apetraka, dia azo zaraina sy atao asynchronously ny asa rehetra.

fanapahan-kevitra

Mampihatra filaharana ary manaova rafitra entin'ny hetsika amin'ny fanodinana ny asa rehetra. Ary efa ela aho no te hanandrana ny Redis Streams.

Mampiasa ny renirano Redis amin'ny PHP

SATRIA Satria tsy iray amin'ireo goavam-be telo Symfony, Laravel, Yii ny framework-ko, te-hahita tranomboky tsy miankina aho. Saingy, araka ny hita (tamin'ny fanadinana voalohany), dia tsy azo atao ny mahita tranomboky matotra. Ny zava-drehetra mifandraika amin'ny filaharana dia tetikasa avy amin'ny 3 commit dimy taona lasa izay, na mifamatotra amin'ny rafitra.

Naheno zavatra maro momba an'i Symfony aho amin'ny maha mpamatsy kojakoja ilaina tsirairay, ary efa mampiasa ny sasany amin'izy ireo aho. Ary koa ny zavatra sasany avy amin'i Laravel dia azo ampiasaina, ohatra, ny ORM, raha tsy misy ny rafitra.

symfony/messenger

Ny kandidΓ  voalohany dia toa tonga lafatra avy hatrany ary tsy isalasalana fa nametraka azy io aho. Saingy lasa sarotra kokoa ny google ohatra ny fampiasana ivelan'ny Symfony. Ahoana no hivondrona avy amin'ny andiana kilasy misy anarana tsy misy dikany, fiara fitateram-bahoaka handefasana hafatra, ary na dia amin'ny Redis aza?

Mamindra ny backend PHP mankany amin'ny bus redis streams ary misafidy tranomboky tsy miankina amin'ny framework

Ny antontan-taratasy ao amin'ny tranonkala ofisialy dia tena antsipirihany, fa ny fanombohana dia nofaritana ho an'ny Symfony fotsiny amin'ny fampiasana ny YML tiany indrindra sy ny fomba mahagaga hafa ho an'ny tsy symphonist. Tsy liana tamin'ny fizotry ny fametrahana mihitsy aho, indrindra nandritra ny fialantsasatry ny Taom-baovao. Tsy maintsy nanao izany anefa aho nandritra ny fotoana tsy nampoizina.

Ny fiezahana hamantatra ny fomba fametrahana rafitra iray amin'ny fampiasana loharano Symfony dia tsy asa faran'izay kely indrindra amin'ny fe-potoana henjana:

Mamindra ny backend PHP mankany amin'ny bus redis streams ary misafidy tranomboky tsy miankina amin'ny framework

Rehefa avy nandinika an'izany rehetra izany aho ary nanandrana nanao zavatra tamin'ny tanako, dia tonga tamin'ny fanatsoahan-kevitra aho fa nanao karazana tehina aho ary nanapa-kevitra ny hanandrana zavatra hafa.

hazavana / filaharana

Hita fa nifamatotra mafy tamin'ny fotodrafitrasa Laravel sy ny fiankinan-doha hafa ity tranomboky ity, ka tsy nandany fotoana firy aho: nametraka azy aho, nijery azy, nahita ny fiankinan-doha ary nofafako.

yiisoft/yii2-filaharana

Eny ary, eto dia noraisina avy hatrany avy amin'ny anarana, indray, fifandraisana henjana amin'ny Yii2. Tsy maintsy nampiasa ity tranomboky ity aho ary tsy ratsy izany, saingy tsy nieritreritra ny hoe miankina tanteraka amin'ny Yii2 izany.

Ny ambiny

Ny zavatra hafa rehetra hitako tao amin'ny GitHub dia tetik'asa tsy azo ianteherana, lany andro ary nilaozana tsy misy kintana, forks ary fanoloran-tena marobe.

Miverena any amin'ny symfony/messenger, antsipiriany ara-teknika

Tsy maintsy nikaroka ity tranomboky ity aho ary, rehefa avy nandany fotoana bebe kokoa, dia afaka. Hita fa tena fohy sy tsotra ny zava-drehetra. Mba hanamafisana ny fiara fitateram-bahoaka dia nanao orinasa kely aho, satria... Tokony nanana pneu maromaro aho ary samy hafa mpitantana.

Mamindra ny backend PHP mankany amin'ny bus redis streams ary misafidy tranomboky tsy miankina amin'ny framework

Dingana vitsivitsy monja:

  • Mamorona mpitantana hafatra izay tokony ho azo antsoina tsotra izao izahay
  • Nofonosinay amin'ny HandlerDescriptor (kilasy avy amin'ny tranomboky) izy ireo.
  • Nofonosinay amin'ny ohatra HandlersLocator ireo "Descriptors".
  • Manampy HandlersLocator amin'ny ohatra MessageBus
  • Mampita andiana `SenderInterface` mankany amin'ny SendersLocator izahay, raha ny tranga misy ahy amin'ny kilasy `RedisTransport`, izay namboarina amin'ny fomba mazava.
  • Manampy SendersLocator amin'ny ohatra MessageBus

MessageBus dia manana fomba `-> dispatch()` izay mijery ireo mpitantana mety ao amin'ny HandlersLocator ary mampita ny hafatra amin'izy ireo, amin'ny fampiasana ny `SenderInterface` mifanaraka amin'izany handefasana amin'ny fiara fitateram-bahoaka (Redis streams).

Ao amin'ny configuration container (amin'ity tranga ity php-di), ity fonosana manontolo ity dia azo amboarina toy izao:

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

Eto ianao dia afaka mahita fa ao amin'ny SendersLocator dia nanendry "fitaterana" samihafa izahay ho an'ny hafatra roa samy hafa, izay samy manana ny fifandraisany amin'ireo renirano mifanaraka aminy.

Nanao tetik'asa demo mitokana aho mampiseho fampiharana daemon telo mifampiresaka amin'ny alalan'ity fiara fitateram-bahoaka manaraka ity: https://github.com/backend-university/products/tree/master/products/02-redis-streams-bus.

Fa hasehoko anao ny fomba mety handrafetana ny mpanjifa:

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

Mampiasa ity fotodrafitrasa ity amin'ny fampiharana iray

Rehefa nampihatra ny fiara fitateram-bahoaka tao an-damosiko aho, dia nanasaraka ny dingana tsirairay tamin'ny baiko synchronous taloha aho ary nanao mpanelanelana manokana, izay samy manao ny azy avy.

Toy izao ny fantsona fampidirana tranokala vaovao amin'ny angon-drakitra:

Mamindra ny backend PHP mankany amin'ny bus redis streams ary misafidy tranomboky tsy miankina amin'ny framework

Ary avy hatrany taorian'izay dia nanjary mora kokoa ho ahy ny manampy fiasa vaovao, ohatra, ny fitrandrahana sy ny fanaparitahana Rss. SATRIA Ity dingana ity ihany koa dia mitaky ny votoaty voalohany, avy eo ny mpitrandraka rohy RSS, toy ny WebsiteIndexHistoryPersistor, dia misoratra anarana amin'ny hafatra "Content/HtmlContent", manodina azy ary mampita ny hafatra tiana amin'ny fantsona azy bebe kokoa.

Mamindra ny backend PHP mankany amin'ny bus redis streams ary misafidy tranomboky tsy miankina amin'ny framework

Tamin'ny farany, niafara tamin'ny daemon maromaro izahay, izay samy tsy mifandray afa-tsy amin'ireo loharano ilaina. Ohatra ny demonia mpandady dia ahitana ny mpitantana rehetra izay mila mandeha amin'ny Internet ho an'ny atiny, ary ny daemon maharitra mitana fifandraisana amin'ny angon-drakitra.

Ankehitriny, raha tokony hifidy avy amin'ny angon-drakitra, ny id ilaina aorian'ny fampidirana ataon'ny mpitaky dia ampitaina amin'ny alΓ lan'ny fiara fitateram-bahoaka fotsiny amin'ireo mpitantana liana rehetra.

Source: www.habr.com

Add a comment