플러팅 AI/Flask Server

Socket.IO 클라이언트가 메시지를 일부만 수신하는 문제

Solo.dev 2024. 11. 27. 19:22

문제 설명:

Flask-SocketIO 기반의 서버와 Node.js 클라이언트를 사용하여 WebSocket으로 데이터를 송수신하는 시스템을 개발 중입니다. 서버는 클라이언트로부터 이미지를 업로드받고, 처리 후 각 클라이언트에 실시간으로 스트리밍 응답(gpt_response 이벤트)을 전송

문제는 서버에서 각 클라이언트의 SID에 맞춰 메시지를 전송했음이 로그에서 확인되지만, 일부 클라이언트는 메시지를 수신하지 못하는 상황이 발생합니다. 예를 들어, 5개의 클라이언트를 실행했을 때 서버는 모두에게 메시지를 전송했지만, 클라이언트 로그에서는 2~3개만 응답을 받는 문제가 있다.


서버 환경:

Flask-SocketIO와 gevent를 사용 중이며, 메시지를 각 클라이언트의 SID에 맞춰 전송합니다.

flask_server.py (관련 코드):

@socketio.on('connect', namespace='/')
def handle_connect():
    logger.info(f"WebSocket connected: {request.sid}")
    emit('response', {'sid': request.sid})

def stream_gpt_response(conversation_text, partner_name, client_id):
    try:
        response = openai_client.chat.completions.create(
            model="gpt-4o-mini",
            messages=messages,
            stream=True,
        )
        for chunk in response:
            if hasattr(chunk, 'choices') and chunk.choices:
                for choice in chunk.choices:
                    if hasattr(choice.delta, 'content'):
                        content = choice.delta.content
                        if content:
                            socketio.emit('gpt_response', {'data': content}, to=client_id, namespace='/')
                            logger.info(f"Sent chunk to SID {client_id}: {content}")
    except Exception as e:
        logger.error(f"Error streaming response: {e}")
        socketio.emit('gpt_response', {'data': f"Error: {e}"}, to=client_id, namespace='/')

클라이언트 환경:

Node.js socket.io-client를 사용하여 WebSocket 이벤트를 수신하고 있습니다.

app.js (관련 코드):

const io = require('socket.io-client');
const websocketListener = (clientId) => {
    const socket = io(SOCKET_SERVER, {
        transports: ['websocket'],
        reconnection: true,
    });

    socket.on('connect', () => {
        console.log(`[Client ${clientId}] Connected.`);
    });

    socket.on('response', (data) => {
        serverSids[clientId] = data.sid;
    });

    socket.on('gpt_response', (data) => {
        if (data && data.data) {
            console.log(`[Client ${clientId}] Received: ${data.data}`);
        } else {
            console.error(`[Client ${clientId}] Invalid response: ${JSON.stringify(data)}`);
        }
    });

    return socket;
};

지금까지 확인한 내용:

  1. 서버 로그를 통해 모든 SID로 메시지가 전송되었음을 확인했습니다.
  2. 클라이언트가 올바르게 연결되었고 각 클라이언트의 SID를 수신했음을 확인했습니다.
  3. 클라이언트의 재연결 및 타임아웃 설정을 늘려보았지만 문제는 해결되지 않았습니다.

 


참고

  • 서버에서는 각 SID로 메시지가 정확히 전송되었음을 아래와 같이 확인했습니다.
  • 서버로그클라 로그
  • Sent chunk to SID 12345: "response chunk 1" Sent chunk to SID 67890: "response chunk 2"
  • [Client 0 | SID: lFuhZIsBoPdGnOSEAAAB] [DEBUG] Received SID from server: lFuhZIsBoPdGnOSEAAAB[Client 1 | SID: 0p_2Ej-EjkoPkA_LAAAH] [DEBUG] Received SID from server: 0p_2Ej-EjkoPkA_LAAAH[Client 4 | SID: Z5WicRjm_c2pWPP2AAAN] [DEBUG] Received SID from server: Z5WicRjm_c2pWPP2AAAN[Client 2 | SID: HLW4oQGmFJ9Llm3CAAAE] [DEBUG] Received SID from server: HLW4oQGmFJ9Llm3CAAAE[Client 0 | SID: lFuhZIsBoPdGnOSEAAAB] [DEBUG] Using server-assigned SID: lFuhZIsBoPdGnOSEAAAB[Client 2 | SID: HLW4oQGmFJ9Llm3CAAAE] [DEBUG] Using server-assigned SID: HLW4oQGmFJ9Llm3CAAAE[Client 3 | SID: axlOYliojSbIF2zHAAAF] [DEBUG] Received SID from server: axlOYliojSbIF2zHAAAF[Client 3 | SID: axlOYliojSbIF2zHAAAF] [DEBUG] Using server-assigned SID: axlOYliojSbIF2zHAAAF
  • [Client 3 | SID: axlOYliojSbIF2zHAAAF] [DEBUG] Successfully connected to the server.
  • [Client 4 | SID: Z5WicRjm_c2pWPP2AAAN] [DEBUG] Using server-assigned SID: Z5WicRjm_c2pWPP2AAAN
  • [Client 1 | SID: 0p_2Ej-EjkoPkA_LAAAH] [DEBUG] Using server-assigned SID: 0p_2Ej-EjkoPkA_LAAAH
  • [Client 2 | SID: HLW4oQGmFJ9Llm3CAAAE] [DEBUG] Successfully connected to the server.
  • [Client 4 | SID: Z5WicRjm_c2pWPP2AAAN] [DEBUG] Successfully connected to the server.
  • [Client 1 | SID: 0p_2Ej-EjkoPkA_LAAAH] [DEBUG] Successfully connected to the server.
  • [Client 0 | SID: lFuhZIsBoPdGnOSEAAAB] [DEBUG] Successfully connected to the server.
  •  

다음엔 해결 한후 올리자