slm / queue-sqs
集成到Amazon SQS队列系统的Zend Framework 2模块
Requires
- php: ^7.2
- ext-json: *
- aws/aws-sdk-php-zf2: ^3.0 || ^4.0
- laminas/laminas-eventmanager: ^3.2.1
- laminas/laminas-servicemanager: ^3.3.1
- laminas/laminas-stdlib: ^3.2
- slm/queue: ^2.0
Requires (Dev)
- laminas/laminas-config: ^3.3
- laminas/laminas-i18n: ^2.10
- laminas/laminas-log: ^2.12
- laminas/laminas-modulemanager: ^2.9
- laminas/laminas-mvc: ^3.1
- laminas/laminas-serializer: ^2.9
- laminas/laminas-view: ^2.11
- php-coveralls/php-coveralls: ^2.4
- phpunit/phpunit: ^8.5
- squizlabs/php_codesniffer: ^3.5
This package is auto-updated.
Last update: 2022-02-14 08:16:15 UTC
README
版本 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配置示例中的版本定义。