Symfony Messenger : Regrouper les messages

Parfois, vous voulez vous assurer que les messages dans Symfony Messenger sont envoyés au consommateur par lots plutôt que individuellement. Nous avons récemment eu besoin d'envoyer des lignes de texte mises à jour de nos programmes à un fournisseur de services de traduction via Messenger.





- . , : , , , 100 .





, :





// Symfony Messenger Message:
class TranslationUpdate
{
    public function __construct(
        public string $locale,
        public string $key,
        public string $value,
    ) {
    }
}
      
      



class TranslationUpdateHandler implements MessageHandlerInterface
{
    private const BUFFER_TIMER = 10; // in seconds
    private const BUFFER_LIMIT = 100;
    private array $buffer = [];

    public function __construct(
        private MessageBusInterface $messageBus,
    ) {
        pcntl_async_signals(true);
        pcntl_signal(SIGALRM, \Closure::fromCallable([$this, 'batchBuffer']));
    }

    public function __invoke(TranslationUpdate $message): void
    {
        $this->buffer[] = $message;

        if (\count($this->buffer) >= self::BUFFER_LIMIT) {
            $this->batchBuffer();
        } else {
            pcntl_alarm(self::BUFFER_TIMER);
        }
    }

    private function batchBuffer(): void
    {
        if (0 === \count($this->buffer)) {
            return;
        }

        $translationBatch = new TranslationBatch($this->buffer);
        $this->messageBus->dispatch($translationBatch);
        $this->buffer = [];

    }
}
      
      



Messenger, , ( ).





, . 100 , batchBuffer



.





pcntl_alarm, batchBuffer



.





PHP- PCNTL ( PHP, , ). , SIGALRM . , , , pcntl_signal. , .





batchBuffer



Messenger (. dispatch



), , PCNTL, Messenger .





class TranslationBatch
{
    /**
     * @param TranslationUpdate[] $notifications
     */
    public function __construct(
        private array $notifications,
    ) {
    }
}
      
      



class TranslationBatchHandler implements MessageHandlerInterface
{
    public function __invoke(TranslationBatch $message): void
    {
      // handle all our messages
    }
}
      
      



, , . Messenger , cron.





.  — . , , Redis.






"Symfony Framework". - « -». :

— Symfony ClickHouse ( , ClickHouse). Business Intelligence- ,

— API,

— .

.








All Articles