Ịnyefe azụ azụ PHP na bọs iyi iyi Redis na ịhọrọ ọba akwụkwọ nwere onwe ya

Ịnyefe azụ azụ PHP na bọs iyi iyi Redis na ịhọrọ ọba akwụkwọ nwere onwe ya

Okwu mmalite

Ebe nrụọrụ weebụ m, nke m na-agba ọsọ dị ka ihe ntụrụndụ, ka emebere iji kwado ibe ụlọ na saịtị ndị na-adọrọ mmasị. Isiokwu a malitere ịmasị m na mmalite nke njem mmemme m; n'oge ahụ enwere m mmasị na ịchọta ndị ọkachamara dị ukwuu na-ede banyere onwe ha, ihe omume ntụrụndụ ha na ọrụ ha. Àgwà nke ịchọpụta ha n'onwe m na-anọgide ruo taa: na ihe fọrọ nke nta ka ọ bụrụ azụmahịa ọ bụla na-abụghị nke azụmahịa, m na-anọgide na-ele anya n'okpuru ebe a na-achọ njikọ ndị na-ede akwụkwọ.

Mmejuputa echiche

Ụdị nke mbụ bụ naanị ibe html na webụsaịtị nke m, ebe m na-etinye njikọ na mbinye aka n'ime ndepụta ul. N'ịbụ onye pịnyere ibe 20 n'ime oge ụfọdụ, amalitere m iche na nke a adịghị arụ ọrụ nke ọma wee kpebie ịnwale ịmegharị usoro ahụ. Na stackoverflow, achọpụtara m na ọtụtụ ndị na-egosi saịtị na profaịlụ ha, ya mere m dere parser na php, nke na-agafe na profaịlụ, malite na nke mbụ (adreesị na SO ruo taa dị ka nke a: `/users/1` ), weputara njikọ na mkpado achọrọ wee tinye ya na SQLite.

Enwere ike ịkpọ nke a ụdị nke abụọ: nchịkọta iri puku URL na tebụl SQLite, nke dochie ndepụta static na html. Emere m ọchụchọ dị mfe na ndepụta a. N'ihi na enwere naanị URL, yabụ ọchụchọ dabere na ha.

N'oge a, agbapụrụ m ọrụ ahụ ma laghachi na ya ka ogologo oge gasịrị. N'oge a, ahụmịhe ọrụ m adịlarị ihe karịrị afọ atọ ma enwere m mmetụta na m nwere ike ịme ihe ka njọ. Tụkwasị na nke ahụ, e nwere nnukwu ọchịchọ ịmụta nkà na ụzụ ọhụrụ.

Ụdị ọgbara ọhụrụ

Ọrụ ahụ etinyere na Docker, ebufere nchekwa data na mongoDb, na nso nso a, radish agbakwunyere, nke na mbụ bụ naanị maka caching. A na-eji otu microframeworks PHP mee ihe ndabere.

nsogbu

A na-agbakwunye saịtị ọhụrụ site na iwu njikwa na-eme ihe ndị a na-emekọrịta ihe:

  • Ibudata ọdịnaya site na URL
  • Na-edozi ọkọlọtọ na-egosi ma HTTPS dị
  • Na-echekwa isi nke weebụsaịtị
  • A na-echekwa isi iyi HTML na nkụnye eji isi mee na akụkọ "indexing".
  • Na-enyocha ọdịnaya, wepụta aha na nkọwa
  • Na-echekwa data na nchịkọta dị iche

Nke a zuru ezu iji chekwaa saịtị wee gosipụta ha na ndepụta:

Ịnyefe azụ azụ PHP na bọs iyi iyi Redis na ịhọrọ ọba akwụkwọ nwere onwe ya

Mana echiche nke ịkọwapụta na akpaghị aka, ịkọwapụta na ọkwa ihe niile, idobe ihe niile ka oge na-aga, adabaghị nke ọma na usoro a. Ọbụlagodi naanị ịgbakwunye usoro webụ ka ịgbakwunye ibe koodu oyiri na igbochi iji zere DDoS nwere ike.

N'ozuzu, n'ezie, ihe niile nwere ike ime n'otu n'otu, na na usoro weebụ ị nwere ike ichekwa URL naanị ka nnukwu daemon na-arụ ọrụ niile maka URL site na listi ahụ. Ma ka, ọbụna ebe a okwu "quee" na-egosi onwe ya. Ma ọ bụrụ na etinyere kwụ n'ahịrị, mgbe ahụ enwere ike kewaa ọrụ niile ma rụọ ya ma ọ dịkarịa ala asynchronously.

mkpebi

Tinye usoro kwụ n'ahịrị ma mepụta usoro ihe omume maka ịhazi ọrụ niile. Achọkwara m ịnwale Redis Streams ogologo oge.

Iji Redis iyi na PHP

N'ihi na Ebe ọ bụ na usoro m abụghị otu n'ime nnukwu atọ Symfony, Laravel, Yii, ọ ga-amasị m ịchọta ọbá akwụkwọ nọọrọ onwe ya. Ma, dị ka ọ tụgharịrị (na nyocha mbụ), ọ gaghị ekwe omume ịchọta ọbá akwụkwọ dị egwu n'otu n'otu. Ihe niile metụtara kwụ n'ahịrị bụ ma ọ bụ ọrụ sitere na 3 mere afọ ise gara aga, ma ọ bụ jikọtara ya na usoro.

Anụla m ọtụtụ ihe gbasara Symfony dị ka onye na-eweta ngwa ndị bara uru nke ọ bụla, ejirila m ụfọdụ n'ime ha. Nakwa ihe ụfọdụ sitere na Laravel nwekwara ike iji, dịka ọmụmaatụ ORM ha, na-enweghị ọnụnọ nke usoro ahụ n'onwe ya.

symfony/onye ozi

Onye ndoro-ndoro ochichi nke mbụ yiri ka ọ dị mma na enweghị obi abụọ ọ bụla m tinyere ya. Mana ọ tụgharịrị bụrụ ihe siri ike karịa iji ihe atụ Google na mpụga Symfony. Otu esi ejikọta ụgbọ ala maka izipu ozi site na ụyọkọ klaasị nwere aha zuru ụwa ọnụ, enweghị isi na ọbụna na Redis?

Ịnyefe azụ azụ PHP na bọs iyi iyi Redis na ịhọrọ ọba akwụkwọ nwere onwe ya

Akwụkwọ ndị dị na saịtị gọọmentị nwere nkọwa zuru ezu, mana mbido mbụ ka akọwara maka Symfony site na iji YML ọkacha mmasị ha na ụzọ anwansi ndị ọzọ maka ndị na-abụghị symphonist. Enweghị m mmasị na usoro ntinye n'onwe ya, karịsịa n'oge ezumike Afọ Ọhụrụ. Ma aghaghị m ime nke a ruo ogologo oge na-atụghị anya ya.

Ịgbalị ịchọpụta otu esi eme ngwa ngwa site na iji Symfony isi mmalite abụghịkwa ọrụ kachasị mkpa maka oge njedebe:

Ịnyefe azụ azụ PHP na bọs iyi iyi Redis na ịhọrọ ọba akwụkwọ nwere onwe ya

Mgbe m nyochachara ihe a niile ma gbalịa iji aka m mee ihe, abịara m nkwubi na m na-eme ụdị crutches ma kpebie ịnwale ihe ọzọ.

ìhè/ kwụ n'ahịrị

Ọ tụgharịrị na ọbá akwụkwọ a nwere njikọ chiri anya na akụrụngwa Laravel na ọtụtụ ihe ndabere ndị ọzọ, yabụ etinyeghị m ogologo oge na ya: etinyere m ya, lelee ya, hụ ihe ndabere wee hichapụ ya.

yiisoft/yii2-queue

Ọfọn, ebe a ka ewepụtara ya ozugbo site na aha ahụ, ọzọ, njikọ siri ike na Yii2. Ekwesịrị m iji ọbá akwụkwọ a ma ọ bụghị ihe ọjọọ, mana echeghị m na ọ dabere kpamkpam na Yii2.

Ndị fọdụrụ

Ihe ọ bụla ọzọ m chọtara na GitHub bụ ihe a na-apụghị ịdabere na ya, ọrụ oge ochie na nke gbahapụrụ na-enweghị kpakpando, ndụdụ na ọnụ ọgụgụ buru ibu.

Laghachi na symfony/onye ozi, nkọwa teknụzụ

Ekwesịrị m ịchọpụta ọbá akwụkwọ a, mgbe m tinyekwuru oge, enwere m ike. Ọ tụgharịrị na ihe niile dị nkenke ma dị mfe. Iji mee ụgbọ ala ozugbo, emere m obere ụlọ ọrụ, n'ihi na ... Ekwesịrị m inwe ọtụtụ taya yana ndị nwere njikwa dị iche iche.

Ịnyefe azụ azụ PHP na bọs iyi iyi Redis na ịhọrọ ọba akwụkwọ nwere onwe ya

Naanị nzọụkwụ ole na ole:

  • Anyị na-emepụta ndị na-ahụ maka ozi kwesịrị ịdị na-akpọ naanị
  • Anyị kechie ha na HandlerDescriptor (klas si n'ọbá akwụkwọ)
  • Anyị kechie “Nkọwapụta” ndị a na ihe atụ HandlerLocator
  • Na-agbakwụnye HandlerLocator na ihe atụ MessageBus
  • Anyị na-ebufe otu 'SenderInterface' gaa na SendersLocator, n'ọnọdụ m nke klaasị 'RedisTransport', nke ahaziri n'ụzọ doro anya.
  • Na-agbakwụnye SenderLocator na ihe atụ MessageBus

MessageBus nwere usoro `-> izipu()` nke na-enyocha ndị na-ahụ maka njikwa kwesịrị ekwesị na HandlerLocator wee zigara ha ozi, na-eji `SenderInterface` kwekọrọ na izipu site na bọs (Redis streams).

N'ime nhazi akpa (na nke a php-di), enwere ike ịhazi ngwugwu a dịka nke a:

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

N'ebe a, ị nwere ike ịhụ na na SendersLocator anyị ekenyela "ụgbọ njem" dị iche iche maka ozi abụọ dị iche iche, nke ọ bụla nwere njikọ nke ya na iyi ndị kwekọrọ.

Emere m ihe ngosi ngosi dị iche iche na-egosipụta ngwa nke daemons atọ na-akpakọrịta n'etiti onwe ha site na iji ụgbọ ala ndị a: https://github.com/backend-university/products/tree/master/products/02-redis-streams-bus.

Mana m ga-egosi gị otu esi ahazi onye ahịa:

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

Iji akụrụngwa a na ngwa

N'ịbụ onye etinyere bọs na azụ azụ m, ekewapụrụ m usoro nke onye ọ bụla na iwu synchronous ochie ma mee ndị na-ahụ maka ọrụ dị iche iche, onye ọ bụla n'ime ha na-eme ihe nke ya.

Pipeline maka ịgbakwunye saịtị ọhụrụ na nchekwa data dị ka nke a:

Ịnyefe azụ azụ PHP na bọs iyi iyi Redis na ịhọrọ ọba akwụkwọ nwere onwe ya

Ma ozugbo nke ahụ gachara, ọ bịara dịrị m mfe ịgbakwunye ọrụ ọhụrụ, dịka ọmụmaatụ, wepụ na ịkọwa Rss. N'ihi na Usoro a na-achọkwa ọdịnaya mbụ, mgbe ahụ, onye na-ahụ maka njikọ njikọ RSS, dị ka WebsiteIndexHistoryPersistor, na-edebanye aha na ozi "Ọdịnaya/HtmlContent", na-edozi ya ma na-ebufe ozi achọrọ n'akụkụ pipeline ya n'ihu.

Ịnyefe azụ azụ PHP na bọs iyi iyi Redis na ịhọrọ ọba akwụkwọ nwere onwe ya

N'ikpeazụ, anyị kwụsịrị na ọtụtụ daemons, nke ọ bụla n'ime ha na-ejigide njikọ naanị na ihe ndị dị mkpa. Dịka ọmụmaatụ, mmụọ ọjọọ Ndị na-awagharị awagharị nwere ndị njikwa niile chọrọ ịga na ịntanetị maka ọdịnaya, yana daemon nọgidesie ike na-ejide njikọ na nchekwa data.

Ugbu a, kama ịhọrọ site na nchekwa data, ids achọrọ ka onye nrụnye tinyechara ya, a na-ebufe ya naanị site na bọs nye ndị niile nwere mmasị.

isi: www.habr.com

Tinye a comment