AWS S3 事件转发到 SQS 最终会成为不同于 S3 到 SNS 到 SQS 的消息吗?
Will AWS S3 event forwarding to SQS will end up being a different message than S3 to SNS to SQS?
我正在使用 Splunk 技术插件,它将从 SQS 队列中提取消息。虽然TA建议使用S3转发到SNS,并且订阅了SQS,但也有S3直接转发到SQS的可能。
SNS 会改变 S3 发送给它的内容吗?还是对 SQS 完全透明的传输方法?
是的,默认情况下,S3 → SQS 和 S3 → SNS → SQS 会导致 SQS 消息体中有两个不同的数据 structures/formats。
这是因为 SNS 订阅提供 metadata 每条消息传递 -- SNS MessageId
,一个 Signature
来验证真实性,一个 Timestamp
当 SNS最初接受的消息,以及其他属性。原始消息在这个外部 JSON 结构的 Message
属性中编码为 JSON 字符串。
因此直接使用 SQS,您将使用(伪代码)...
提取 S3 事件
s3event = JSON.parse(sqsbody)
...但使用 SNS 到 SQS...
s3event = JSON.parse(JSON.parse(sqsbody).Message)
您可以通过在 SNS 主题的 SQS 订阅上启用原始消息传递来禁用其他结构并让 SNS 仅发送原始负载。
https://docs.aws.amazon.com/sns/latest/dg/sns-large-payload-raw-message-delivery.html
启用原始消息传递后,S3 → SQS 和 S3 → SNS → SQS 的内容变得相同。
原始消息传递的缺点是您会丢失原始消息传递中可能有用的故障排除信息,例如 SNS 消息 ID 和 SNS 发布的时间戳。
另一方面,如果接收服务(SQS 消费者)假设消息总是通过 SNS 传入,并希望在 SQS 消息体中找到 SNS 数据结构,那么直接发送 S3 → SQS 将导致消费者发现来自 SQS 的消息正文与其预期不符。
我正在使用 Splunk 技术插件,它将从 SQS 队列中提取消息。虽然TA建议使用S3转发到SNS,并且订阅了SQS,但也有S3直接转发到SQS的可能。
SNS 会改变 S3 发送给它的内容吗?还是对 SQS 完全透明的传输方法?
是的,默认情况下,S3 → SQS 和 S3 → SNS → SQS 会导致 SQS 消息体中有两个不同的数据 structures/formats。
这是因为 SNS 订阅提供 metadata 每条消息传递 -- SNS MessageId
,一个 Signature
来验证真实性,一个 Timestamp
当 SNS最初接受的消息,以及其他属性。原始消息在这个外部 JSON 结构的 Message
属性中编码为 JSON 字符串。
因此直接使用 SQS,您将使用(伪代码)...
提取 S3 事件s3event = JSON.parse(sqsbody)
...但使用 SNS 到 SQS...
s3event = JSON.parse(JSON.parse(sqsbody).Message)
您可以通过在 SNS 主题的 SQS 订阅上启用原始消息传递来禁用其他结构并让 SNS 仅发送原始负载。
https://docs.aws.amazon.com/sns/latest/dg/sns-large-payload-raw-message-delivery.html
启用原始消息传递后,S3 → SQS 和 S3 → SNS → SQS 的内容变得相同。
原始消息传递的缺点是您会丢失原始消息传递中可能有用的故障排除信息,例如 SNS 消息 ID 和 SNS 发布的时间戳。
另一方面,如果接收服务(SQS 消费者)假设消息总是通过 SNS 传入,并希望在 SQS 消息体中找到 SNS 数据结构,那么直接发送 S3 → SQS 将导致消费者发现来自 SQS 的消息正文与其预期不符。