happyr/bref-messenger-failure-strategies

确保您可以使用 Bref Symfony Messenger 失败策略

0.5.0 2024-03-13 18:15 UTC

This package is auto-updated.

Last update: 2024-09-13 19:29:29 UTC


README

所以你已经爱上了 Bref 并真的想使用 Symfony 的优秀 Messenger 组件。你可能也已经安装了 Bref Symfony Messenger 扩展包,它允许你在 SQS 和 SNS 等平台上发布消息。但是你还缺少一些东西... 你想要使用 Symfony Messenger 重试策略,对吧?

这就是为你准备的包!

安装

composer require happyr/bref-messenger-failure-strategies

现在你有一个名为 Happyr\BrefMessenger\SymfonyBusDriver 的类,它实现了 Bref\Symfony\Messenger\Service\BusDriver。请随意使用这个新类来配置你的消费者。

示例

在每一个消费者中,你可以选择让 Symfony 处理失败,如文档中所述

# config/packages/messenger.yaml

framework:
    messenger:
        failure_transport: failed
        transports:
            failed: 'doctrine://default?queue_name=failed'
            workqueue:
              dsn: 'https://sqs.us-east-1.amazonaws.com/123456789/my-queue'
              retry_strategy:
                  max_retries: 3
                  # milliseconds delay
                  delay: 1000
                  multiplier: 2
                  max_delay: 60

services:
    Happyr\BrefMessenger\ExceptionLogger:
        autowire: true
        autoconfigure: true

    Happyr\BrefMessenger\SymfonyBusDriver:
        autowire: true

    Bref\Symfony\Messenger\Service\Sqs\SqsConsumer:
        arguments:
            - '@Happyr\BrefMessenger\SymfonyBusDriver'
            - '@messenger.routable_message_bus'
            - '@Symfony\Component\Messenger\Transport\Serialization\SerializerInterface'
            - 'my_sqs' # Same as transport name

# ...

延迟仅在 SQS "普通队列" 上受支持。如果你使用 SNS 或 SQS FIFO,你应该直接使用失败队列。

# config/packages/messenger.yaml

framework:
    messenger:
        failure_transport: failed
        transports:
            failed: 'doctrine://default?queue_name=failed'
            workqueue:
              dsn: 'sns://arn:aws:sns:us-east-1:1234567890:foobar'
              retry_strategy:
                  max_retries: 0
services:
    # ...

确保你定期重新运行失败队列。以下配置将在每30分钟运行一次5秒的脚本。即使没有消息失败,它也会运行5秒。

# serverless.yml

functions:
    website:
        # ...
    consumer:
        # ...

    console:
        handler: bin/console
        Timeout: 120 # in seconds
        layers:
            - ${bref:layer.php-74}
            - ${bref:layer.console}
        events:
            - schedule:
                  rate: rate(30 minutes)
                  input:
                      cli: messenger:consume failed --time-limit=5 --limit=50