我正在使用Splunk技术插件,该插件将从SQS队列中提取消息。尽管TA建议使用S3转发到SNS并已订阅了SQS,但是S3也有可能直接转发到SQS。
SNS会对S3发送给它的内容进行任何更改吗?还是对SQS完全透明的传输方法?
答案 0 :(得分:2)
是的,默认情况下,S3→SQS和S3→SNS→SQS将在SQS消息主体内产生两种不同的数据结构/格式。
这是因为SNS订阅向metadata提供了每条传递的消息-SNS >>> print(df)
0 EmpID FirstName LastName Relationship
0 1 Ax Bx 1A
1 1 Cx Dx 1B
,MessageId
以验证真实性,Signature
是SNS最初接受的时间消息和其他属性。原始消息在此外部JSON结构的Timestamp
属性内被编码为JSON字符串。
因此,直接使用SQS,您将使用(伪代码)提取S3事件...
Message
...但是从SNS到SQS ...
s3event = JSON.parse(sqsbody)
您可以禁用其他结构,并通过对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的邮件正文与预期不符。