我正在开发一个使用SNS和SQS在boto3实体之间发布主题的应用。该设置非常普遍,其中一个进程已订阅该主题并正在等待活动。第二个过程就是向主题发布消息,我希望看到已发布的消息到达收听作业,但一切都没有。 SQS仪表板显示没有待处理或待命的消息。队列和主题都有完全权限。我是所有这一切的新手,所以它可能很简单。
听力工作:
# Create topic
sns_game_topic = sns_client.create_topic(Name='My_Topic')
# Create queue
queue = sqs_client.create_queue(QueueName='My_Queue.fifo', Attributes={'FifoQueue':'true', 'ContentBasedDeduplication': 'true'})
sqs_arn = sqs_client.get_queue_attributes(QueueUrl=queue['QueueUrl'], AttributeNames=['QueueArn'])['Attributes']['QueueArn']
sns_arn = sns_topic['TopicArn']
sns_client.subscribe(TopicArn=sns_arn, Protocol='sqs', Endpoint=sqs_arn)
发送工作:
queue = self.sqs_client.create_queue(QueueName='Battleship_Registration.fifo', Attributes={'FifoQueue':'true', 'ContentBasedDeduplication': 'true'})
sqs_arn = self.sqs_client.get_queue_attributes(QueueUrl=queue['QueueUrl'], AttributeNames=['QueueArn'])['Attributes']['QueueArn']
# This topic should already exist but creation is idempotent and we need the arn to subscribe to it
topic = self.sns_client.create_topic(Name='My_Topic')
sns_arn = topic['TopicArn']
# Connect topic to queue
self.sns_client.subscribe(TopicArn=sns_arn, Protocol='sqs', Endpoint=sqs_arn)
pub = self.sns_client.publish(TopicArn=<SNS ARN goes here>, Message='Hello World')
由于我希望所有邮件都通过,因此没有激活过滤器策略。
我有两个问题: 为什么简单的发布没有通过?
为了发布或订阅,我需要知道sns和sqs的arn值。我知道获取它们的最佳方法是调用create_(topic / queue),即使实体已经存在。这些调用是幂等的,所以它应该是安全的,但这是获得arn值的最佳实践吗?
答案 0 :(得分:1)
发现问题。 SNS不适用于FIFO队列。订阅行为不起作用,因此主题和队列之间从未存在过连接。
请注意
Amazon SNS目前不兼容FIFO队列。