home

Sqs의 messageattributes와 주의점

SQS로 메시지를 보낼 때 MessageAttributes 라는 것을 동봉해서 보낼 수 있습니다.

_, err = p.client.SendMessage(
		&sqs.SendMessageInput{
			MessageBody:            aws.String(string(message)),
			QueueUrl:               aws.String(p.queueURL),
			MessageGroupId:         aws.String(groupId),
			MessageDeduplicationId: aws.String(duplicateMessageId),
			MessageAttributes:      messageAttributes, // << 여기
		},
	)

MessageAttributes에는 이러한 데이터를 보낼 수 있습니다.

MessageAttributes: map[string]types.MessageAttributeValue{
    "Key": {
        DataType:    aws.String("String"),     // 또는 "Number", "Binary"
        StringValue: aws.String("value"),      // DataType이 String 또는 Number일 때
        BinaryValue: []byte{...},              // DataType이 Binary일 때
    },
}

이런 식으로 DataType 에 String이나 Number, Binary를 넣을 수 있습니다. 여기서 중요한 것은 Number의 경우에 NumberValue가 아니라 StringValue 를 사용해야 합니다. 이 값은 무조건 넣어야 합니다!

또 중요한 것은 한 메시지에 최대 10개의 MessageAttributes를 추가할 수 있습니다.

attrs := map[string]types.MessageAttributeValue{
    "EventType": {
        DataType:    aws.String("String"),
        StringValue: aws.String("OrderCreated"),
    },
    "UserId": {
        DataType:    aws.String("Number"),
        StringValue: aws.String("12345"),
    },
}

그래서 대충 이런 식으로 메시지의 메타데이터를 넣을 수도 있고, 비지니스와 관련된 데이터도 넣는 경우가 많다고 합니다.

여기서 중요한 것이 컨슈머에서 MessageAttributes 값을 얻으려면 꼭 MessageAttributeNames 파라미터를 추가하고 메서드를 호출해야 합니다.

# python boto3 receive_message 메서드

messages = self.sqs.receive_message(
                    QueueUrl=self.queue_url,
                    MaxNumberOfMessages=5,
                    WaitTimeSeconds=15,
                    MessageAttributeNames=['All']
                )

여기에서 특정 MessageAttribute의 키만 넣을 수 있고, All 을 넣으면 모든 MessageAttribute를 수신합니다.

이것을 넣지 않으면 메시지에는 MessageAttributes를 제외한 채로 가져옵니다. 매우 중요!!