400 에러 문의!

  • 뒤끝 SDK 버전 :
  • 프로젝트명 : 이세계 용사 이야기 : 방치형 키우기
  • 스테이터스 코드 : 400
  • 에러 코드 : ClientException
  • 에러 메시지 : Key already in the list\nParameter name: key (5)\n : Key already in the list\nParameter name: key (5)

위 에러 메시지가 언제 나오는 에러 메시지인지 궁금합니다.
매번 나오는 건 아니고 간헐적으로 나옵니다.

감사합니다.

안녕하세요 개발자님

해당 에러는 서버에서 리턴되는 값을 클라이언트에서 파싱하던 도중 발생하는 오류로 보입니다.(클라이언트 에러)

해당 에러가 특정 함수에서만 호출이 되나요?

로그 비용을 아끼기 위해 에러만 모아서 수집하고 있어서 어떤 함수에서 호출되고 있는지 모르겠습니다.

키 값이 겹치는 거 같지는 않은데… 사례를 좀 알려줄 수 있을까요 ?

확인해본 결과 UpdateV2에서 일부 유저에게 간혈적으로 발생하는 것으로 확인이 됩니다.

해당 에러는 현재까지 발생한 적 없는 에러여서 좀 더 확인이 필요할 것 같습니다.(보낸 Param등에 Key값이 겹친 것은 아닌것으로 확인)

잠시 기다려주시면 감사하겠습니다.

이거 아직 확인 중 이실까요… ?
혹시 원인 파악에 도움을 드리고자 현재 저희 상태와 에러 로그들 알려드립니다

에러 로그를 좀 더 명확하게 심고 확인해보니 특정 테이블이 아닌 간헐적으로 모든 테이블에서 발생하는 것으로 보아 아래 에러 로그들이 뜰 때 조건과 맞물려서 발생하는 것으로 추측 됩니다

[자주 뜨는 에러 모음]

  • 400:ClientException:Key already in the list\nParameter name: key (5)(문의 에러, 무슨 에러인지 감도 안잡히기에 문의를 남김)
  • 400:HttpRequestException:An error occurred while sending the request (2)\nThe operation has timed out.
  • 400:TransactionCanceledException:Transaction cancelled, please refer cancellation reasons for specific
    reasons [TransactionConflict]
  • 400:TransactionConflictException\nmessage : Transaction is ongoing for the item\n
  • 400:HttpRequestException\nmessage : An error occurred while sending the request (2)\nError: SecureChannelFailure (Unable to read data from the transport connection: Connection reset by peer.)\n
  • 408:Timeout:timeout error (1)
  • 500:InternalServerError:{“message”:“Request failed with status code 502”}
  • 502:BadGateway

[현재 저희가 사용하고 있는 뒤끝 저장 프로세스]
1.모든 저장 요청은 게임을 비정상 종료(갑자기 게임 종료) 외에 1초에 한 번 씩 큐 처리해서 보냄
1-1. 게임을 백그라운드로 최소화하거나 비정상 종료 시에는 중요하다고 판단하는 재화만 재빠르게 비동기로 던짐

  1. 아이템, 재화 등 중요 포인트를 제외 한 테이블에 경우 40~80초 사이에 매번 서로 다른 시간대에 분산 처리

  2. 아이템, 재화 등은 30~60초 사이로 조금 더 짧은 시간대에 저장

  3. 정말 중요한 유료 재화는 발생 시 바로 저장 시도(단, 1초에 한 번 씩만 요청을 보내는 건 동일)

  4. 뒤끝 SendQueue를 사용하지 않은 이유

  • 간헐적으로 위에 언급한 에러 로그들로 인해 요청이 밀리기 시작하면서 게임을 지속적으로 플레이하지 않으면 데이터 유실 발생
  • 차라리 사용자 코드에서 큐 처리 하고, 실패하더라도 무시하고 다음 저장 시간대를 확보하기 위함
  • 단, 너무 많은 요청을 하지 않기 위해 최대한 분산 처리 그리고 insert 등에 중복 처리를 막기 위해서 최소한에 guard 정책 있음

안녕하세요.

답변이 늦어 죄송합니다.

해당 에러 관련해서 답변드리도록 하겠습니다.

전체적으로 비동기 함수 동시 호출 시에 발생하는 오류가 많이 발생하는것으로 확인이 됩니다.(로그가 순차적으로 0.1초 차이로 발생). 1초마다 발생하는 큐 처리가 정상적으로 1초에 다른 비동기 요청과 겹치지 않고 발생하는지 확인해 주시기 바랍니다.

400:HttpRequestException:An error occurred while sending the request (2)\nThe operation has timed out.
원인 : 클라이언트의 네트워크 접속 불량으로 인해 서버로 데이터를 보내지 못했을 경우
해결 : 와이파이, LTE간 연결 변경시나 순간적인 네트워크 끊어짐으로 에러가 발생할 가능성이 높으므로, 바로 동일한 함수 1번 더 호출.

408, 500, 502 TimeOut Error
원인 : 서버의 일시적인 과부하 상태로 인해 해당 요청이 처리되지 않을 경우 발생합니다.
해결 : 30초 혹은 1분뒤에 동일한 함수 호출 2~3회 반복.

400 : An error occurred while sending the request (2) Error: ConnectFailure (mono-io-layer-error (103))
원인 : 해당 에러의 로그를 파악해본 결과, 0.1초 차이로 여러개의 요청이 보내졌으며 각각의 요청이 20~60초 정도의 응답시간이 발생하였습니다. 한번에 비동기 함수 호출을 많이 호출하여 발생한 것으로 추측됩니다.

** 400:TransactionConflictException\nmessage : Transaction is ongoing for the item\n**
원인 : 한 데이터에 대한 동시 변경이 발생하였을 경우
Backend.URank.User.UpdateUserScore 함수와 Backend.GameData.UpdateV2을 동시에 요청하게 될 경우, 변경중에 변경시도를 하게되며 해당 에러가 발생할 수 있습니다.
해결 : 순차적으로 함수 발생이 이루어지도록 개선

400:ClientException:Key already in the list\nParameter name:
해당 에러는 확인중이오나 아직 확실한 해답은 나오지 않은 상태입니다.

개발자님 말씀대로 모든 함수에서 간혈적으로 발생하며,
응답 메세지를 파싱하는 중 발생하는 에러로 확인이 되오며, 위 에러들과 같이 비동기 함수의 응답들과 겹쳐 발생하고 있는 것으로 추측이 됩니다.

위 비동기 함수 호출 부분을 어느정도 완화시키면 잇따라 완화될것으로 예측되오니 해당 부분 수정 후 다시 확인해주시면 감사하겠습니다.

관련해서 해당 에러가 재현될 수 있도록 여러 테스트를 진행해보겠습니다.

현재로서는 명쾌한 답변 드릴 수 없는 점 죄송합니다.