smartframe / queue-sqs
与Amazon SQS排队系统集成的laminas模块
Requires
- php: ^7.2 || ~8.0.0 || ~8.1.0
- aws/aws-sdk-php: ^3.140
- laminas/laminas-eventmanager: ^2.6 || ^3.0
- laminas/laminas-servicemanager: ^2.7 || ^3.0
- laminas/laminas-stdlib: ^2.2 || ^3.0
- slm/queue: ^2.0 || ^3.0
Requires (Dev)
- laminas/laminas-config: ^2.2 || ^3.0
- laminas/laminas-i18n: ^2.5 || ^3.0
- laminas/laminas-log: ^2.5 || ^3.0
- laminas/laminas-modulemanager: ^2.5 || ^3.0
- laminas/laminas-mvc: ^2.5 || ^3.0
- laminas/laminas-serializer: ^2.5 || ^3.0
- laminas/laminas-view: ^2.5 || ^3.0
- phpunit/phpunit: ^8
- squizlabs/php_codesniffer: ^2.1
This package is auto-updated.
Last update: 2024-09-20 18:44:04 UTC
README
版本 0.5.0 由Jurian Sluiman和Michaël Gallego创建
要求
待办事项
如果你喜欢这个模块,欢迎在这些领域提供帮助!
- 编写更多测试以断言队列按预期工作
- 更好的错误处理(目前,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的SQS队列接口,并提供了以下方法
- 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队列发送消息的自动去重(布尔值)(建议为您的队列启用
ContentBasedDeduplication,使用SHA-256哈希根据消息正文生成MessageDeduplicationId) - 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:从pop请求检索后,接收到的消息从后续检索请求中隐藏的时间(以秒为单位)
- wait_time_seconds:默认情况下,当我们请求一个作业时,它将进行“短轮询”,如果没有找到作业,将立即返回。Amazon SQS还支持“长轮询”。此值可以是1到20秒之间的任何值。这允许在此期间保持连接活动,从而减少空响应的数量。
batchPop
有效的选项是:
- max_number_of_messages:返回的最大作业数。截至今天,最大值可以是10。请记住,Amazon SQS不保证您将接收到确切的数量,而是您可以接收到多达n条消息。
- visibility_timeout:从pop请求检索后,接收到的消息从后续检索请求中隐藏的时间(以秒为单位)
- 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提供了一个命令行工具,可以用于pop和执行作业。您可以在您的Zend Framework 2应用程序的公共文件夹中键入以下命令:
php index.php queue sqs <queue> [--visibilityTimeout=] [--waitTime=]
队列名称是必填参数,而其他参数都是可选的。
- visibilityTimeout:从pop请求检索后,接收到的消息从后续检索请求中隐藏的时间(以秒为单位)
- 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配置示例以了解版本定义。