오픈소스 인사이트
home
오픈소스 기술 동향
home
💡

JBoss EAP 8.1 세션 락 개선과 infinispan 분산 캐시 설정 주의사항

들어가며

EAP(JBoss Enterprise Application Platform)를 운영하다 보면 클러스터 환경에서 세션 관련 성능 이슈를 한 번쯤 마주치게 됩니다.
특히 EAP 7.x 시절, 동시 요청이 몰릴 때 아래와 같은 에러를 경험한 분들이 있을 겁니다.
ERROR [org.infinispan.interceptors.impl.InvocationContextInterceptor] ISPN000136: Error executing command GetKeyValueCommand org.infinispan.util.concurrent.TimeoutException: ISPN000299: Unable to acquire lock after 15 seconds for key
Plain Text
복사
이 문제를 해결하기 위해 READ_COMMITTED / NONE 설정을 적용한 사례가 많았습니다. 그런데 EAP 8.1 릴리즈 노트를 보면 세션 락 아키텍처가 개선되었다고 합니다. 그렇다면 기존 설정을 재검토해볼 여지가 생긴 게 아닐까요?
직접 테스트해봤습니다.

EAP 8.1 세션 락 개선 내용

Red Hat 공식 문서에 따르면 EAP 8.1부터 세션 락 동작이 다음과 같이 변경되었습니다.
"Locking sessions per request was not a true goal of the prior implementation in EAP 8.0 (and even earlier), but rather a consequence of ensuring that the state of a session was consistent with a previous request. EAP 8.1+ no longer has this limitation provided that the previous request was handled by the same cluster member."
요약하면:
이전 버전의 세션 락은 의도한 동시성 제어가 아니라 부작용으로 생긴 락이었다
EAP 8.1부터는 이 제한이 개선되었다
그렇다면 실제로 어떻게 달라졌는지 직접 확인해보겠습니다.

테스트: 실제로 어디까지 개선됐나

테스트 시나리오

세션 락을 20초간 보유한 채로 동시에 같은 세션에 쓰기 요청을 보내는 시나리오입니다.
1. node1에서 세션 발급 2. node1: 세션 setAttribute 후 20초 sleep (락 보유 중) 3. 동시에 쓰기 요청 → 락 대기 15초 후 결과 확인
Plain Text
복사

케이스 1: 같은 노드(node1 → node1)

EAP 8.0 (이전 버전):
Lock is held by: GlobalTransaction{addr=server11, remote=false} Requested by: GlobalTransaction{addr=server11, remote=false} → ISPN000299 발생! 같은 노드 내에서도 락 경합
Plain Text
복사
EAP 8.1:
→ 에러 없음 ✅ 락 공유로 정상 처리
Plain Text
복사
같은 노드 내 동시 요청에 대한 개선이 확인됩니다.

케이스 2: 다른 노드(node1 → node2)

EAP 8.1:
Lock is held by: GlobalTransaction{addr=server1-1, remote=false} Requested by: GlobalTransaction{addr=server1-2, remote=true} → ISPN000299 발생! 다른 노드 간 락은 여전히 발생
Plain Text
복사
다른 노드 간 요청은 여전히 락 경합이 발생합니다.

그렇다면 스티키 세션이 필수

테스트 결과를 보면 한 가지가 명확해집니다.
같은 노드 내 동시 요청 → 락 공유 ✅ (8.1 개선) 다른 노드 간 요청 → 락 경합 ❌ (여전히 발생)
Plain Text
복사
스티키 세션으로 동일 사용자의 요청이 항상 같은 노드로 가도록 보장해야 8.1의 개선 효과를 제대로 누릴 수 있습니다.
스티키 세션 없이는 같은 세션 ID 요청이 서로 다른 노드로 분산될 수 있고, 이 경우 여전히 ISPN000299 에러가 발생합니다.

그렇다면 READ_COMMITTED/NONE 설정은?

READ_COMMITTED / NONE 설정은 락을 완전히 완화해서 다른 노드 간 동시 접근도 허용하는 방식이었습니다. 락 타임아웃 에러를 없애는 데는 효과적이었지만 대신 세션 변경마다 즉시 복제가 일어나는 비용이 따릅니다.
BATCH: 요청 1개 = 복제 1번 (응답 직전 한 번에) NONE: setAttribute() 1번 = 복제 1번 (즉시) → 세션 변경이 잦을수록 NONE의 복제 비용이 커짐
Plain Text
복사
EAP 8.1 + 스티키 세션 조합이라면 어떨까요?
스티키 세션 → 같은 노드로 요청 집중 → 노드 간 락 경합 없음 BATCH → 요청당 복제 1번 → 복제 비용 최소화
Plain Text
복사
READ_COMMITTED / NONE 처럼 락을 완전히 포기하는 방식은 아니지만, 스티키 세션을 전제로 한다면 REPEATABLE_READ / BATCH가 동시성과 안전성을 함께 고려할 수 있는 조합이 될 수 있습니다.
기존에 READ_COMMITTED / NONE을 사용 중이라면 한 번쯤 검토해볼 만한 선택지입니다.

정리

EAP 8.0 이하
EAP 8.1 이상
같은 노드 동시 요청
락 경합 발생
락 공유
다른 노드 간 요청
락 경합 발생
락 경합 발생
스티키 세션 필요성
필요
더욱 중요
EAP 8.1에서 세션 락이 개선된 것은 맞지만, 스티키 세션이 전제되어야 합니다. 스티키 세션을 잘 적용하고 있다면 REPEATABLE_READ / BATCH 조합으로의 전환을 고려해보는 것도 좋은 선택이 될 수 있습니다.

참고

한정상 프로
에스코어에서 미들웨어 엔지니어로 근무하며, 삼성 그룹사를 비롯한 국내 주요 대기업과 공공기관의 미들웨어 설계 및 기술지원을 담당하고 있어요