aws-sdk-php v3.44无法将sendMessage发送到SQS FIFO队列:MessageGroupId丢失了吗?

时间:2017-12-01 00:16:30

标签: php queue amazon-sqs fifo aws-php-sdk

我正在使用亚马逊SDK for PHP版本3.44(2017-11-30发布)。我可以连接到我的Amazon SQS帐户并执行listQueues(),getQueueUrl(),getQueueAttributes()和receiveMessage()命令。但是,sendMessage()命令始终失败,并显示以下消息:

  

请求必须包含参数MessageGroupId。

我绝对包含这个参数。我使用的aws-sdk-php API版本似乎无关紧要,这条消息不断回归。这是我的代码:

$queue = SqsClient::factory([
    'profile'     => $profile,
    'region'      => $region,
    'version'     => '2012-11-05',
    'credentials' => $credentials,
]);
$queue_list = $queue->listQueues(); // ok
$url        = $queue->getQueueUrl(['QueueName'=>$queue_name]); // ok
$received   = $queue->receiveMessage(['QueueUrl'=>$url->get('QueueUrl')]); // ok
$response   = $queue->sendMessage([
    'MessageBody'    => $message,
    'MessageGroupId' => $message_group_id,
    'QueueUrl'       => $url->get('QueueUrl'),
]); // fails with message indicating MessageGroupId is missing

我花了几个小时搜索通过PHP SDK将消息发送到Amazon SQS FIFO队列的工作示例,并开始相信这是不可能的。有没有人能够让aws-sdk-php库与SQS FIFO队列一起工作?

3 个答案:

答案 0 :(得分:0)

第一行是创建SqsClient的实例,而不是创建SQS队列。您仍然需要调用$ queue-> createQueue。请参阅文档。对于fifo队列,您需要启用" FifoQueue" to" true",并设置" ContentBasedDeduplication"在创建队列时。发送邮件时,根据您创建的队列的ContentBasedDeduplication设置,您可能也可能不需要发送" MessageDeduplicationId"以及" MessageGroupId"。

从您的代码中,我无法看到您是如何创建队列的。

  • 您是否使用属性" FifoQueue"启用了fifo队列? => "真"
  • 您是否设置了" ContentBasedDeduplication"到"真"或"假" ?
  • 您是否使用扩展程序" .fifo"命名您的队列? ?

我做了所有这些事情,并将我的队列配置为ContentBasedDeduplication设置为" false"。当我发送邮件时,我发送给您的唯一其他属性(以及MessageGroupId)是MessageDeduplicationId。我可以使用sdk 3.44将消息发送到fifo队列。

答案 1 :(得分:0)

看起来亚马逊已经悄悄地解决了阻止我的API调用的任何错误。我没有更改队列设置或代码。上周导致错误消息的相同API调用现在运行正常。

答案 2 :(得分:0)

我在3.3.0上遇到了这个问题。在我的情况下,我只需要升级到3.44.2,然后传递MessageDeduplicationId和MessageGroupId。如果遇到这个问题,我可能会仔细检查您的SDK版本。