fix(user-creator-chat): Redis 전달 예외 fallback 범위를 좁힌다

This commit is contained in:
2026-06-19 05:35:53 +09:00
parent 07b93f3219
commit 6c252ee008
3 changed files with 130 additions and 20 deletions

View File

@@ -29,8 +29,10 @@ import kr.co.vividnext.sodalive.v2.usercreatorchat.repository.UserCreatorChatRoo
import kr.co.vividnext.sodalive.v2.usercreatorchat.websocket.UserCreatorChatPresenceService
import kr.co.vividnext.sodalive.v2.usercreatorchat.websocket.UserCreatorChatRoomMessageBroker
import kr.co.vividnext.sodalive.v2.usercreatorchat.websocket.UserCreatorChatWebSocketMessageType
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.ApplicationEventPublisher
import org.springframework.dao.DataAccessException
import org.springframework.data.domain.PageRequest
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
@@ -119,14 +121,8 @@ class UserCreatorChatService(
val message = saveTextMessage(context, textMessage)
val senderMessage = toMessageItemDto(message, sender)
val opponent = context.opponentParticipant.member
if (presenceService.hasPresence(roomId, opponent.id!!)) {
val opponentMessage = toMessageItemDto(message, opponent)
roomMessageBroker.publish(
roomId = roomId,
memberId = opponent.id!!,
payload = websocketMessagePayload(UserCreatorChatWebSocketMessageType.MESSAGE, roomId, opponentMessage)
)
} else {
val deliveredRealtime = deliverRealtime(message, opponent)
if (!deliveredRealtime) {
publishMessagePush(message, sender, opponent)
}
return senderMessage
@@ -190,18 +186,8 @@ class UserCreatorChatService(
): SendUserCreatorChatMessageResponse {
val opponent = opponentParticipant.member
val item = toMessageItemDto(message, member)
val opponentPresent = presenceService.hasPresence(message.chatRoom.id!!, opponent.id!!)
if (opponentPresent) {
val opponentMessage = toMessageItemDto(message, opponent)
roomMessageBroker.publish(
roomId = message.chatRoom.id!!,
memberId = opponent.id!!,
payload = websocketMessagePayload(
UserCreatorChatWebSocketMessageType.MESSAGE,
message.chatRoom.id!!,
opponentMessage
)
)
val deliveredRealtime = deliverRealtime(message, opponent)
if (deliveredRealtime) {
return SendUserCreatorChatMessageResponse(message = item, deliveredRealtime = true, pushSent = false)
}
@@ -209,6 +195,31 @@ class UserCreatorChatService(
return SendUserCreatorChatMessageResponse(message = item, deliveredRealtime = false, pushSent = true)
}
private fun deliverRealtime(message: UserCreatorChatMessage, opponent: Member): Boolean {
val roomId = message.chatRoom.id!!
val opponentId = opponent.id!!
return try {
if (!presenceService.hasPresence(roomId, opponentId)) {
return false
}
val opponentMessage = toMessageItemDto(message, opponent)
roomMessageBroker.publish(
roomId = roomId,
memberId = opponentId,
payload = websocketMessagePayload(UserCreatorChatWebSocketMessageType.MESSAGE, roomId, opponentMessage)
)
true
} catch (e: DataAccessException) {
logger.warn(
"유저-크리에이터 채팅 실시간 전달 Redis 오류로 푸시 fail-open 처리: roomId={}, opponentId={}, cause={}",
roomId,
opponentId,
e.message
)
false
}
}
private fun publishMessagePush(message: UserCreatorChatMessage, sender: Member, opponent: Member) {
val messageKey = if (message.messageType == UserCreatorChatMessageType.VOICE) {
"message.fcm.voice_received"
@@ -287,4 +298,8 @@ class UserCreatorChatService(
val senderParticipant: UserCreatorChatParticipant,
val opponentParticipant: UserCreatorChatParticipant
)
companion object {
private val logger = LoggerFactory.getLogger(UserCreatorChatService::class.java)
}
}