AWS SNS和SQS的文档中有关于消息属性的章节。但是没有解释如何在将队列订阅到SNS主题时设置SQS的消息属性。
是否有一种方法可以配置AWS SNS以向通过订阅发送的SQS消息添加特定的消息属性?
AWS SNS和SQS的文档中有关于消息属性的章节。但是没有解释如何在将队列订阅到SNS主题时设置SQS的消息属性。
是否有一种方法可以配置AWS SNS以向通过订阅发送的SQS消息添加特定的消息属性?
根据 AWS 文档:
要在 Amazon SQS 端点中使用消息属性,您必须将订阅属性“原始消息传递”设置为 True。有关原始消息传递的详细信息,请参阅附录:大容量负载和原始消息传递。 https://docs.aws.amazon.com/sns/latest/dg/SNSMessageAttributes.html https://docs.aws.amazon.com/sns/latest/dg/large-payload-raw-message.html
下面是来自实际项目的示例 ,希望能帮助澄清问题。
发布到 SNS 主题的消息如下:
aws sns publish --topic-arn arn:aws:sns:us-west-2:xxx:pollution-event --message '{"operatorId":3375001,"eventTypeId":1,"eventLevelId":1,"validFrom":"2018-03-10T09:00:00Z","validTo":"2018-03-11T09:00:00Z"}' --message-attributes '{"Type" : { "DataType":"String", "StringValue":"Orchestration.Services.Model.Pollution.PollutionMessage"}}'
启用原始传递为 false(默认)。从 SQS 接收的消息仅包含内容,没有属性。
{
"Type": "Notification",
"MessageId": "78d5bc6f-142c-5060-a75c-ef29b774ec66",
"TopicArn": "arn:aws:sns:eu-west-2:xxx:pollution-event",
"Message": "{\"validFrom\": \"2018-03-10T09:00:00Z\",\"validTo\": \"2018-03-11T09:00:00Z\",\"eventLevelId\": 1,\"eventTypeId\": 1,\"operatorId\": 3375001}",
"Timestamp": "2018-04-17T11:33:44.770Z",
"SignatureVersion": "1",
"Signature": "xxx==",
"SigningCertURL": "https://sns.eu-west-2.amazonaws.com/SimpleNotificationService-xxx.pem",
"UnsubscribeURL": "https://sns.eu-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-2:xxx",
"MessageAttributes": {
"Type": {
"Type": "String",
"Value": "Orchestration.Services.Model.Pollution.PollutionMessage"
},
"AWS.SNS.MOBILE.MPNS.Type": {
"Type": "String",
"Value": "token"
},
"AWS.SNS.MOBILE.MPNS.NotificationClass": {
"Type": "String",
"Value": "realtime"
},
"AWS.SNS.MOBILE.WNS.Type": {
"Type": "String",
"Value": "wns/badge"
}
}
}
注意:查看其他答案以获得更好的响应,使用原始消息传递
aws sns publish --topic-arn arn:aws:sns:ap-southeast-2:123456789012:foo --message msg --subject subj --message-attributes '{"somename" : { "DataType":"String", "StringValue":"somevalue"}}'
我从aws cli中的map数据类型获得了语法帮助。
SQS中的结果消息将属性作为消息的一部分显示:
{
"Type" : "Notification",
"MessageId" : "53e3adad-723a-5eae-a7b7-fc0468ec2d37",
"TopicArn" : "arn:aws:sns:ap-southeast-2:123456789012:foo",
"Subject" : "subj",
"Message" : "msg",
"Timestamp" : "2017-05-29T12:48:22.186Z",
...
"MessageAttributes" : {
"somename" : {"Type":"String","Value":"somevalue"}
}
}
如果这些属性能够作为官方的SQS属性附加在消息中,那将会更好。但很遗憾,似乎并非如此。
network
与我的项目业务规则相关): MessageAttributes: {
network: {
DataType: 'String',
StringValue: messageBody.network,
},
},
- A Mehmeto如果您在这里是因为有一个已订阅SNS主题的SQS队列,您检查了您的订阅是否将原始消息传递
设置为True,但仍然无法读取SQS消息上的属性:
请确保您的SQS客户端没有过滤掉消息属性。
以下代码只在从SQS队列接收消息时包括myAttribute
:
SQS.receiveMessage({
QueueUrl: queueUrl,
VisibilityTimeout: 20,
WaitTimeSeconds: 10,
MessageAttributeNames: [
"myAttribute"
],
},...
如果您想读取除了myAttribute
以外的某些属性值,您将需要指定它们(白名单)或将"myAttribute"
替换为"All"
来包含所有SQS属性。
SQS.receiveMessage({
MessageAttributeNames: [
"myAttribute", "myOtherAttribute"
],
},...
参考文献:https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html
在为SNS内的主题添加SQS订阅时启用原始消息传递类型
path: foo
,而发送到同一SQS队列的另一个SNS主题会添加一个属性path: bar
。根据 http://docs.aws.amazon.com/sns/latest/dg/SNSMessageAttributes.html,似乎有一个参考文档,但没有其他记录。*重要提示*:要在Amazon SQS端点使用消息属性,必须将订阅属性“原始消息传递”设置为True。
- Evgeny