ct-study / designing-data-intensive-applications

2 stars 0 forks source link

[5주차] 적절한 timeout 계산하기 #34

Open SuyeonChoi opened 10 months ago

SuyeonChoi commented 10 months ago

본인의 서비스에서 외부 노드를 호출할 때 설정하는 timeout 기준은 어떻게 판단하셨나요? 캐테(tn-web-catchtable)은 ExternalApiHttpTemplate에서 픽업 및 웨이팅 서버 호출 시 5초로 걸어줬던데 어떤 기준으로 설정했는지 아시는분..?

wbluke commented 10 months ago

보통은 권위있는 시니어가 하라는대로...

wad-sunyesung commented 10 months ago

평균 응답속도을 보고 타임아웃을 설정하면 이후에는 그 이상 걸린 시간이 측정이 안된다 SLO 응답시간 응답 성공률와 관련이 있을 것 같다

타임아웃 설정했는데 정상 처리가 됐지만 타임아웃으로 성공 응답을 못받을 경우 문제가 생길 수 있지 않을까 애플리케이션에서 중복 요청 방지 로직을 단다

hagyutae commented 10 months ago

MySQL에서 INSERT 작업을 성공적으로 수행했지만 클라이언트가 성공 여부를 전달 받지 못하는 상황은 네트워크 지연, 타임아웃, 또는 서버와 클라이언트 사이의 연결 문제 등 다양한 이유로 발생할 수 있습니다. 이런 문제를 극복하려면 여러 방법을 사용할 수 있습니다:

  1. 트랜잭션 관리:

    • INSERT 작업을 트랜잭션으로 묶어 수행하고, 작업이 성공적으로 완료된 후에만 트랜잭션을 커밋(commit)하세요. 만약 오류가 발생하면 트랜잭션을 롤백(rollback)하여 데이터 일관성을 유지하세요.
  2. 응답 확인:

    • 클라이언트는 INSERT 작업의 성공 여부를 확인하기 위해 별도의 확인 요청을 전송할 수 있습니다. 이를 위해 클라이언트는 SELECT 문을 사용하여 새로 삽입된 레코드를 조회할 수 있습니다.
  3. 중복 검사:

    • 중복 삽입을 피하려면 UNIQUE 제약 조건을 사용하여 중복 레코드를 방지하고, INSERT IGNORE 또는 INSERT ... ON DUPLICATE KEY UPDATE 문을 사용하여 중복 키를 처리하세요.
  4. 로깅과 모니터링:

    • 서버와 클라이언트 모두에서 로깅 및 모니터링을 설정하여 INSERT 작업의 성공 여부를 추적하고, 오류와 예외를 기록하세요.
  5. 재시도 메커니즘:

    • 클라이언트는 INSERT 작업의 성공 여부를 받지 못할 경우 재시도 메커니즘을 구현하여 작업을 다시 시도할 수 있습니다. 그러나 이 방법은 중복 삽입과 같은 다른 문제를 유발할 수 있으므로 주의가 필요합니다.
  6. 비동기 처리:

    • 작업의 성공 여부를 클라이언트에 즉시 전달할 필요가 없는 경우, 비동기 처리를 사용하여 서버에서 INSERT 작업을 처리하고 클라이언트에 결과를 나중에 전달할 수 있습니다.

이러한 방법들은 서로 조합되어 사용될 수 있으며, 구체적인 문제와 요구 사항에 따라 적절한 해결책을 선택해야 합니다.

MySQL에서 자동 생성(auto generated) 키, 특히 AUTO_INCREMENT 키를 사용할 때, 이 키는 주로 기본 키(primary key)로 사용되며, 각 새로운 레코드에 대해 유니크한 값을 자동으로 생성합니다. 이 경우, 중복 레코드를 방지하고 클라이언트에게 성공 여부를 전달하는 몇 가지 방법이 있습니다:

  1. LAST_INSERT_ID 함수 사용:

    • LAST_INSERT_ID() 함수는 최근에 생성된 AUTO_INCREMENT 값을 반환합니다. 이를 통해 클라이언트는 삽입 작업이 성공적으로 이루어졌는지 확인하고, 새로 생성된 레코드의 ID를 가져올 수 있습니다.
  2. 트랜잭션 사용:

    • 트랜잭션을 시작하고, INSERT 작업을 수행한 후에 트랜잭션을 커밋합니다. 오류가 발생하면 롤백하여 데이터의 일관성을 유지하세요. 이 방법은 INSERT 작업의 성공 여부를 클라이언트에게 정확하게 전달하도록 도와줍니다.
  3. 응답 확인과 로깅:

    • 클라이언트는 삽입 작업 후에 별도의 확인 요청을 전송하여 INSERT 작업의 성공 여부를 확인할 수 있습니다. 또한, 서버와 클라이언트 모두에서 로깅을 사용하여 작업의 성공, 실패 및 오류를 기록하고 모니터링할 수 있습니다.
  4. 에러 핸들링:

    • 클라이언트와 서버 모두에서 적절한 에러 핸들링 메커니즘을 구현하여 네트워크 문제, 타임아웃, 데이터베이스 오류 등을 처리하세요.
  5. 비동기 처리:

    • 비동기 처리를 사용하여 서버에서 INSERT 작업을 처리하고, 작업이 완료되면 클라이언트에 결과를 전달할 수 있습니다.
  6. 유니크한 비즈니스 로직 기반의 키 생성:

    • 가능하다면, 유니크한 비즈니스 로직을 기반으로 키를 생성하는 방법을 고려하세요. 이 방법은 클라이언트가 예상 가능한 키를 가질 수 있도록 하여 INSERT 작업의 성공 여부를 확인하는 데 도움이 될 수 있습니다.

이러한 방법들은 개별적으로 또는 함께 사용하여, 클라이언트가 INSERT 작업의 성공 여부를 더 잘 이해하고 처리할 수 있게 도와줍니다.