向标准SNS主题发送带特定标识的消息无通知,是否属预期行为?
问题:标准SNS主题带MessageGroupId/MessageDeduplicationId发送邮件订阅无通知,移除后正常?
我创建了一个标准SNS主题并添加了电子邮件订阅,用以下代码调用PublishBatchCommand批量发消息:
const command = new PublishBatchCommand({ TopicArn: "myStandardTopicArn", PublishBatchRequestEntries: messages.map(message => { return { MessageGroupId: "someGroupID", MessageDeduplicationId: getUUID(), Id: getUUID(), Message: JSON.stringify(message.data), }; }), }); try { await this.snsClient.send(command); } catch (e) { // 未抛出异常 throw e; }
执行时没有报错,但收不到邮件通知;移除MessageGroupId和MessageDeduplicationId这两个属性后,就能正常收到邮件了。
想问这是预期行为吗?我原本以为要么抛出异常,要么忽略这两个属性正常发通知,但在相关文档里没找到这个行为说明,也没看到FIFO主题仅支持SQS订阅的明确说明。
回答
这是预期行为,核心原因如下:
MessageGroupId和MessageDeduplicationId是SNS FIFO主题的专属属性,标准主题本身并不支持这两个参数。- 当你给标准主题的发布请求带上这两个FIFO属性时,SNS会将这条消息标记为「FIFO类型消息」,但标准主题的电子邮件订阅不兼容这类消息的投递逻辑——只有SQS订阅能接收标准主题中附带FIFO属性的消息,邮件、SMS等其他订阅类型会直接丢弃这类消息,且不会返回错误(因为请求格式本身合法,只是投递环节做了过滤)。
补充说明:
- SNS的设计逻辑里,标准主题允许传入FIFO属性但不会主动校验拦截,这确实容易造成误解;官方文档关于这部分的兼容性说明比较隐晦,需要结合主题类型和订阅类型的匹配规则来看。
- 若要给标准主题的邮件订阅发送消息,必须移除这两个FIFO专属属性,确保消息按标准类型投递。
内容的提问来源于stack exchange,提问作者zlZimon
相关产品推荐
相关产品推荐

