ecsimsw / daily-notes

val contents = myDailyNotes.filter { it.isPublic }
5 stars 0 forks source link

당근페이 - 확장성 있는 TCP 통신 시스템 구축하기 #47

Closed ecsimsw closed 1 month ago

ecsimsw commented 1 month ago

https://medium.com/daangn/%ED%99%95%EC%9E%A5%EC%84%B1-%EC%9E%88%EB%8A%94-tcp-%ED%86%B5%EC%8B%A0-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-981c230cdc77

ecsimsw commented 1 month ago

환경

image

@PostMapping("v1/telegram/abank")
fun aBank(@RequestBody request: TelegramDto): ABankTelegramPayload {
    // 공통부 Deserialize
    val ABank헤더 = request.parseHeader(ABankTelegramHeader::class.java)
    // 공통부에 존재하는 전문 코드 값으로 전문 클래스 포맷 조회
    val 전문Class = TelegramClassResolver.getTelegramClass(ABankTelegramHeader)
    // 전체 전문 Deserialize
    val 요청전문 = request.parseTelegram(ABankGetBalanceOutboundPayload::class.java)
    // ABank 전용으로 구성한 TcpClient로 요청
    val 응답전문 = aBankTcpClient.process(요청전문)

    return 응답전문
}
ecsimsw commented 1 month ago

재밌는 포인트 : 요청과 응답의 서버가 다를 수 있다?

비동기방식의 TCP 통신에서는 이러한 방식의 구현으로는 제대로 동작되지 않아요. 비동기방식의 통신에서는 요청을 보낸 세션으로 응답이 오지 않을 수 있기 때문이에요.

TCP Gateway와 마이크로 서비스 간 유실이 발생한 경우

통지를 받아야 할 마이크로 서비스에 장애가 발생할 경우 TCP Gateway가 전달한 전문들이 그대로 유실될 수 있어요. 따라서 TCP Gateway는 통지 전문에 한해서 전문을 미리 저장소에 저장해 두고, 재처리 가능한 기능을 제공했어요.