일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 리팩토링 2판
- 원격 브랜 삭제
- multipart테스트
- ksql
- HandlerMethodArgumentResolver
- Linux
- 백명석님
- 마이크로 서비스
- intellij 즐겨찾기
- 자바 ORM 표준 JPA 프로그래밍 정리
- Stream
- @TransactionalEventListener
- #docker compose
- Spring Cloud Netflix
- java
- 리눅스
- findTopBy
- javascript case
- intellij favorites
- vue.js
- git
- intellij 핵심 단축키
- CompletableFuture
- 자바 ORM 표준 JPA 프로그래밍
- aws
- @Transactional Propagation
- IntelliJ
- 친절한 SQL 튜닝
- ksqldb
- JPA
- Today
- Total
시그마 삽질==six 시그마
AmazonSNSException: Throttling 본문
회사에서 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측에 TPS upgrade를 요 청하면 되고
신청내역 진행상황은
우측 상단 지원->지원센터->Your supprot cases에서 확인할 수 있다.
보통은 변경사유를 집요하게 물어봐서 영어로 핑퐁을 하게 된다. 피드백은 빠르다.
그런데 이번 건은 비지니스 로직상 문제가 있었던 것이었다.
하단의 로직을 보자.
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번만 반복 작업으로 변경했고 에러는 사라졌다.
'프로그래밍 > AWS' 카테고리의 다른 글
Cloudfront Access-Control-Allow-Origin 오류 (0) | 2020.03.16 |
---|---|
The MySQL server is running with the --read-only option so it cannot execute this statement (0) | 2020.03.08 |
CDN SSL Expired (0) | 2020.03.03 |
amazonaws.services.sns 오류들 (0) | 2020.03.01 |