시그마 삽질==six 시그마

AmazonSNSException: Throttling 본문

프로그래밍/AWS

AmazonSNSException: Throttling

Ethan Matthew Hunt 2020. 3. 1. 10:49

회사에서 AWS sdk를 사용해서 앱 푸시 메시지를 보내는데 발송 완료까지 시간이 많이 걸려서

 

멀티 쓰레드를 사용하게 되었다.

 

그 결과 시간은 많이 단축되었으나 실패율이 90%로 증가하면서 하단과 같은 에러가 발생했다.

 

com.amazonaws.services.sns.model.AmazonSNSException: Rate exceeded (Service: AmazonSNS; Status Code: 400; Error Code: Throttling

 

원인은 Amazon SNS API는  request에 대한 TPS 제한을(Transactions per Second )하고 있는데 거기에 걸린 것이었다.

 

(자세한 내용은 요기요기를 참조)

 

 

 

AWS Service Quotas

 

만약 애플리케이션의 비지니스 로직상에 문제가 없다면

 

요기 에 접속하여 AWS측에 TPS upgrade를 요 청하면 되고

 

신청내역 진행상황은

 

우측 상단 지원->지원센터->Your supprot cases에서 확인할 수 있다.

 

보통은 변경사유를 집요하게 물어봐서 영어로 핑퐁을 하게 된다. 피드백은 빠르다.

 

AWS 지원센터

 

 

그런데 이번 건은 비지니스 로직상 문제가 있었던 것이었다.

 

 

하단의 로직을 보자.

 

	public void notification(Platform platform
			, String principal
			, String credential
			, String platformToken
			, String applicationName
			, Map<Platform, Map<String, MessageAttributeValue>> attrsMap
			,Object vo) {
		//1. Create Platform Application. This corresponds to an app on a platform.
		CreatePlatformApplicationResult platformApplicationResult = createPlatformApplication(applicationName, platform, principal, credential);
		

		//2. The Platform Application Arn can be used to uniquely identify the Platform Application.
		String platformApplicationArn = platformApplicationResult.getPlatformApplicationArn();

		//3. Create an Endpoint. This corresponds to an app on a device.
		CreatePlatformEndpointResult platformEndpointResult = createPlatformEndpoint(
				platform,
				"CustomData - Useful to store endpoint specific data",
				platformToken, platformApplicationArn);
		

		//4. Publish a push notification to an Endpoint.
		PublishResult publishResult = publish(platformEndpointResult.getEndpointArn(), platform, attrsMap, vo);
		
		//5. Delete the Platform Application since we will no longer be using it.
		deletePlatformApplication(platformApplicationArn);
	}

 

(API 설명은 요기를 참조하자)

 

우리는 푸시 메시지 1개를 보낼때 1번~5번 과정을 반복하고 있었다.

 

즉 메시지 한개를 보낼때마다 플랫폼을 생성하고, 그 arn을 가져다가 엔드포인트를 생성해서 메세지 발송하고 그 플랫폼을 삭제하는 비효율적인 일을 반복하고 있었던 것이었다. 

 

멀티쓰레드로 위와 같이하니 병목현상으로 인한 TPS 초과 에러를 내뱉고 있을 수밖에 없는 상황이었다.

 

그리하여 3번과 4번만 반복 작업으로 변경했고 에러는 사라졌다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Comments