slm/queue-sqs

该软件包已被废弃,不再维护。未建议替代软件包。

集成到Amazon SQS队列系统的Zend Framework 2模块

v2.0.0 2020-12-04 15:39 UTC

README

Build Status Latest Stable Version Latest Unstable Version Total Downloads

版本 0.5.0 由Jurian Sluiman和Michaël Gallego创建

项目状态:寻找贡献者和维护者

该项目不再处于积极开发状态。如果您使用SlmQueueSqs并希望进一步开发它,请通过寻找维护者问题通知我们。

需求

待办事项

如果您喜欢此模块,请随时在这些领域提供帮助!

  • 编写更多测试以断言队列按预期工作
  • 更好的错误处理(目前,可能会由SQS客户端返回的错误完全被忽略,我们希望抛出异常,以便人们可以在他们的代码中处理它们)
  • 更多程序化队列处理支持:目前SlmQueueSqs提供的创建新队列的选项非常有限(我们假设人们从Amazon控制台或直接通过SDK创建它们)。提供更好的集成可能很有用,这样SlmQueueSqs也提供创建新队列的优美界面。

安装

首先,安装SlmQueue(说明见此处)。然后,将以下行添加到您的composer.json文件中

"require": {
	"slm/queue-sqs": "^1.0"
}

然后,通过在您的application.config.php文件中添加SlmQueueSqs来启用该模块(您还必须添加AwsModule键以启用AWS ZF2模块)。

从0.3.0版本开始,SlmQueueSqs现在内部使用官方的AWS Zend Framework 2模块,因此您只需为所有AWS服务配置一次凭证。

配置AWS

AWS SQS必须指定版本!

<?php
return [
    'aws' => [
        'credentials' => [
            'key' => 'ACCESS_KEY_GOES_HERE',
            'secret' => 'SECRET_KEY_GOES_HERE'
        ],
        'region' => 'us-east-1', ## or your region ##
        'Sqs' => [
            'version' => '2012-11-05' ## suggested to code this to a specific version of the SQS API.
        ]
    ]
];

文档

在阅读SlmQueueSqs文档之前,请先阅读SlmQueue文档

SlmQueueSqs不提供创建队列的功能。您应使用官方的SQS SDK或使用AWS控制台。

设置您的AWS凭证

请参阅官方AWS ZF2模块的文档

设置元数据

与其他SlmQueue提供者一样,您可以为作业设置特定的元数据。请注意,这与2014年5月引入SQS的内置消息属性不同。SlmQueueSqs目前不支持此功能,但与SlmQueue中的元数据非常相似。

请注意,当使用工作器检索作业时,从SQS中拉取的一些元数据将自动注入到您的作业中。因此,您被鼓励不要使用这些键,因为您的元数据将覆盖SQS元数据

  • id:这是SQS消息ID。
  • receiptHandle:这是SQS接收处理句柄,用于删除作业等操作。
  • md5:这是由AWS计算的消息MD5签名。您可以使用它来验证您的消息。

添加队列

SlmQueueSqs提供了一个接口,用于扩展SlmQueue\Queue\QueueInterface,并提供了以下方法

  • batchPush(array $jobs, array $options = array()): 一次性将多个作业插入队列。请注意,如果您需要指定选项,作业和选项的索引键必须匹配。
  • batchDelete(array $jobs): 一次性从队列中删除多个作业。

实现此接口的具体类包括:SlmQueueSqs\Queue\SqsQueue,并提供了一个工厂来创建Sqs队列。因此,如果您想要一个名为"newsletter"的队列,只需在您的module.config.php文件中添加以下行

<?php
return array(
    'slm_queue' => array(
        'queue_manager' => array(
            'factories' => array(
                'newsletter' => 'SlmQueueSqs\Factory\SqsQueueFactory'
            )
        )
    )
);

因此,可以从QueuePluginManager类中获取此队列。

队列操作

选项的名称与Amazon AWS SDK的名称相匹配。

push / batchPush

有效的选项是

  • delay_seconds:消息延迟的持续时间(以秒为单位)
  • message_group_id:标签,指定消息属于特定消息组(用于FIFO队列)
  • enable_auto_deduplication:为FIFO队列启用自动去重(布尔值),建议为使用SHA-256哈希生成MessageDeduplicationId的队列启用ContentBasedDeduplication(对于FIFO队列发送的消息启用自动去重)
  • message_deduplication_id:用于FIFO队列发送消息去重的令牌。如果提供,则禁用自动去重。

示例

$queue->push($job, array(
    'delay_seconds' => 20,
    'message_group_id' => 'foo',
    'enable_auto_deduplication' => false,
    'message_deduplication_id' => 'bar',
));

pop

有效的选项是

  • visibility_timeout:接收消息在检索请求后隐藏的持续时间(以秒为单位)
  • wait_time_seconds:默认情况下,当我们请求一个作业时,它将执行“短轮询”,如果没有找到作业,它将立即返回。Amazon SQS还支持“长轮询”。此值可以是1到20秒之间的任意值。这允许在此期间保持连接活跃,从而减少空响应的数量。

batchPop

有效的选项是

  • max_number_of_messages:返回的最大作业数。截至目前,最大值可以是10。请记住,Amazon SQS不保证您将收到确切的数量,而是可以收到多达n条消息。
  • visibility_timeout:接收消息在检索请求后隐藏的持续时间(以秒为单位)
  • wait_time_seconds:默认情况下,当我们请求一个作业时,它将执行“短轮询”,如果没有找到作业,它将立即返回。Amazon SQS还支持“长轮询”。此值可以是1到20秒之间的任意值。这允许在此期间保持连接活跃,从而减少空响应的数量。

配置队列

您可能希望显式设置队列URL,而不是自动通过其名称获取它(如果您想在不同生产环境和测试环境中使用不同的队列,同时在代码中使用相同的队列名称,这很有用)。为此,请添加以下配置

<?php
return array(
    'slm_queue' => array(
        'queues' => array(
            'worker-queue' => array(
                'queue_url' => 'http://sqs.amazonaws.com/my-queue'
            )
        )
    )
);

现在,这个URL将被复用,而不是从AWS服务器获取。

执行作业

SlmQueueSqs提供了一个命令行工具,可用于弹出和执行作业。您可以在您的Zend Framework 2应用程序的公共文件夹中输入以下命令

php index.php queue sqs <队列名称> [--visibilityTimeout=] [--waitTime=]

队列名称是必填参数,而其他参数都是可选的

  • visibilityTimeout:消息被检索请求获取后,从后续检索请求中隐藏的时间(以秒为单位)
  • waitTime:在返回之前,调用等待作业到达队列的时间(以秒为单位)

故障排除

问题

no instance returnedMissing required client configuration options:

version: (string)

  A "version" configuration value is required. Specifying a version constraint
  ensures that your code will not be affected by a breaking change made to the
  service. For example, when using Amazon S3, you can lock your API version to
  "2006-03-01".

  Your build of the SDK has the following version(s) of "sqs": * "2012-11-05"

  You may provide "latest" to the "version" configuration value to utilize the
  most recent available API version that your client's API provider can find.
  Note: Using 'latest' in a production application is not recommended.

  A list of available API versions can be found on each client's API documentation
  page: http://docs.aws.amazon.com/aws-sdk-php/v3/api/index.html. If you are
  unable to load a specific API version, then you may need to update your copy of
  the SDK.======================================================================
   The application has thrown an exception!
======================================================================
 Zend\ServiceManager\Exception\ServiceNotCreatedException
 The factory was called but did not return an instance.

解决方案:请参阅上面的AWS配置示例中的版本定义。