Python boto3 和 SQS 不接收消息

use*_*801 2 python amazon-sqs boto3

我正在尝试使用 Amazon 的 SQS 在 Python 中实现发送和接收消息,但我没有做任何事情使代码的接收端检索我发送的消息,我做错了什么?

发送.py:

SESSIONS_ACCESS_KEY = "************" 
SESSIONS_SECRET_KEY = "************"
sess = boto3.session.Session(aws_access_key_id=SESSIONS_ACCESS_KEY, aws_secret_access_key=SESSIONS_SECRET_KEY, region_name='eu-central-1')
sqs = sess.resource("sqs")
queue = sqs.get_queue_by_name(QueueName='myTestQueue.fifo')
response = queue.send_message(
    MessageBody="TEST 123",
    MessageGroupId='messageGroup1'
)

print(response.get('MessageId'))
print(response.get('MD5OfMessageBody'))
Run Code Online (Sandbox Code Playgroud)

记录.py:

import time
import boto3
   
SESSIONS_ACCESS_KEY = "************" 
SESSIONS_SECRET_KEY = "************"
sess = boto3.session.Session(aws_access_key_id=SESSIONS_ACCESS_KEY, aws_secret_access_key=SESSIONS_SECRET_KEY, region_name='eu-central-1')
sqs = sess.resource("sqs")

queue = sqs.get_queue_by_name(QueueName='myTestQueue.fifo')

# Process messages by printing out body
while True:
    messages = queue.receive_messages()
    print('Amount of existing Queue messages',len(messages))
    for message in messages:
        print('msg:',message.body)
        message.delete()
    time.sleep(5)
Run Code Online (Sandbox Code Playgroud)

运行 send.py python 文件时,我得到以下信息:

1451fdb5-0f95-45d6-b1c1-76d9092fb49a
911e12e2292eb0914f39540ae513721c
Run Code Online (Sandbox Code Playgroud)

但是rec.py python文件我不断在队列通知中收到0条消息:

Amount of existing Queue messages 0
Amount of existing Queue messages 0
Amount of existing Queue messages 0
Amount of existing Queue messages 0
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我也应该在接收端设置 MessageGroupId 吗?我应该使用其他命令来发送或接收消息吗?

Joh*_*ein 5

当我运行你的send.py代码时,我收到一条错误消息:

botocore.exceptions.ClientError:调用 SendMessage 操作时发生错误 (InvalidParameterValue):队列应启用 ContentBasedDeduplication 或显式提供 MessageDeduplicationId

这是FIFO 队列的一个功能,可以避免重复消息。我不确定您在队列上配置了什么,所以我激活了ContentBasedDeduplication,然后收到了一条与您显示的类似的日志消息。

然后我能够重现您未收到消息的情况。

但是,鉴于ContentBasedDeduplication已启用该功能,我随后进行了修改send.py

response = queue.send_message(
    MessageBody="TEST 123"+ str(random.random()),
    MessageGroupId='messageGroup1'
)
Run Code Online (Sandbox Code Playgroud)

当使用此代码发送消息时,该消息已成功接收rec.py

底线: FIFO 队列正在过滤重复的消息,这可能就是您配置它的方式。