Skip to content

songyi00/library

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

35 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Armeria + Spring WebFlux + Coroutine

Armeria 라우터로부터 사용자의 요청을 받을 경우, ServiceRequestContext 를 통해 사용자 요청에 대한 정보를 저장할 수 있다.
비동기 시스템의 경우 하나의 요청에 대해 스레드가 변할 수 있기 때문에 스레드 로컬 기반으로 사용자의 요청 정보를 저장하면 데이터가 유실될 수 있다.
ServiceRequestContext를 통해 사용자의 요청 ID 를 저장할 수 있으며 이를 추적 ID로 사용할 수 있다.
grpc-kotlin 서비스의 suspend function을 사용하는 경우 CoroutineContextServiceRequestContext와 이벤트 루프 CoroutineDispatcher의 조합으로 ServiceRequestContext.current()를 사용하여 suspend 함수에서 ServiceRequestContext에 접근할 수 있다.

class ArmeriaRequestCoroutineContext internal constructor(
    private val requestContext: RequestContext,
) : ThreadContextElement<SafeCloseable>, AbstractCoroutineContextElement(Key) {
    companion object Key : CoroutineContext.Key<ArmeriaRequestCoroutineContext>

    override fun updateThreadContext(context: CoroutineContext): SafeCloseable {
        return requestContext.push()
    }

    override fun restoreThreadContext(
        context: CoroutineContext,
        oldState: SafeCloseable,
    ) {
        oldState.close()
    }
}

코루틴의 withContext를 사용한다면 RequestContext는 전파 가능하며 CoroutineScope와 같이 별도의 독립적인 코루틴을 만든다면 RequestContextCoroutineContext로 변환하여 컨텍스트로 함께 추가해주어야 한다.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages