kaliop / queueingbundle-sqs
Kaliop 队列处理包 - AMAZON SQS 插件
Requires
- aws/aws-sdk-php: ^3.0
- kaliop/queueingbundle: ~0.8
- symfony/config: ^2.4 || ^3.0 || ^4.0
- symfony/dependency-injection: ^2.4 || ^3.0 || ^4.0
- symfony/http-kernel: ^2.4 || ^3.0 || ^4.0
Requires (Dev)
- phpunit/phpunit: ^5.7 || ^7.5
README
将 AWS 简单队列服务支持添加到 Kaliop 队列处理包
参考:http://aws.amazon.com/sqs/ 和 http://aws.amazon.com/sqs/ 分别。
因为它比基本队列处理包有更高的要求,所以它拥有自己的包
安装
-
使用 Composer 安装该包。
-
在您的内核类注册Bundles()中启用 KaliopQueueingPluginsSQSBundle 包。
-
如果不是开发环境,请清除所有缓存
用法
-
如果您没有 AWS 账户,请在 http://aws.amazon.com/ 注册一个
-
使用网页界面创建 SQS 队列: https://console.aws.amazon.com/sqs/home
-
根据您的 AWS 账户设置配置
- 编辑此包中的 parameters.yml 参数
-
检查您是否可以列出队列
php app/console kaliop_queueing:managequeue list -isqs php app/console kaliop_queueing:managequeue info -isqs <queue>
-
向队列推送消息
php app/console kaliop_queueing:queuemessage -isqs <queue> <jsonpayload>
-
从队列接收消息
php app/console kaliop_queueing:consumer -isqs <queue>
运行测试
如果您想在 Travis 之外运行测试套件,您需要
-
拥有 AWS SQS 账户
-
设置以下环境变量:
SYMFONY__SQS__KEY
SYMFONY__SQS__SECRET
(注意,目前的测试配置默认使用 us-east-1 区域) -
在某个地方检出此包(不需要安装完整的 Symfony 环境)
-
运行
composer install
-
运行
php vendor/phpunit/phpunit/phpunit Tests/phpunit
注意事项
-
SQS 并没有像 RabbitMQ 那样原生支持路由键,也没有交换/队列拓扑分离。此包确实添加了对路由键的支持,但并不理想;您被鼓励设置多个队列,而不是使用多个消费者来消费基于路由键的消息,尤其是在并行传输大量消息时。
此包支持路由键的方式如下
- 如果生产者设置了路由键,它将在发送消息时将其添加到消息属性中
- 每个消费者总是请求队列中所有可用的消息
- 如果消费者设置了路由键,并且消息在消息属性中也有一个,则进行匹配
- 在匹配的情况下,进行标准处理:消费者向 SQS 发送 ACK 调用来表示接收消息
- 在没有匹配的情况下,消费者不会向 SQS 发送 ACK 请求;SQS 将等待一段时间,然后将消息放回队列中(它等待的时间可以按队列配置)
如果您发现 RabbitMQ 和此包中匹配路由键的方式有任何差异,请将其作为错误报告。
-
SQS 不支持为每条消息设置 TTL,只支持为每个队列设置,因此所有具有 TTL 参数的公共方法的 MessageProducers 在使用 SQS 驱动时都会忽略它
-
SQS不能保证消息以发送时的相同顺序交付,除非您使用FIFO队列。要使用FIFO队列:- 创建FIFO队列 - 在捆绑配置中,为您的队列设置
message_group_id
设置值 - 如果您使用自定义唯一消息ID,您将不得不设置一个实现MessageDeduplicationIdCalculatorInterface接口的服务,并通过使用队列的message_deduplication_id_calculator
设置将其连接起来 -
SQS保证消息交付,但它不能保证每条消息只交付一次。如果这种约束很重要,请在您的应用程序中构建唯一消息ID并管理它们 - 或者使用FIFO队列。
-
要深入了解SQS和RabbitMQ的比较,请参阅例如http://blog.turret.io/rabbitmq-vs-amazon-sqs-a-short-comparison/