문제 설명:
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;
};
지금까지 확인한 내용:
- 서버 로그를 통해 모든 SID로 메시지가 전송되었음을 확인했습니다.
- 클라이언트가 올바르게 연결되었고 각 클라이언트의 SID를 수신했음을 확인했습니다.
- 클라이언트의 재연결 및 타임아웃 설정을 늘려보았지만 문제는 해결되지 않았습니다.
참고
- 서버에서는 각 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.
다음엔 해결 한후 올리자
'플러팅 AI > Flask Server' 카테고리의 다른 글
| 다중 워커 간 메모리 공유 문제 이해 (0) | 2024.11.30 |
|---|---|
| # Flask-SocketIO에서 `connected_clients` 상태 관리 문제 해결 (0) | 2024.11.30 |
| Flask 서버에서 SocketIO를 이용한 개별 응답 처리 방법 (0) | 2024.11.22 |
| flask 서버 Docker로 패키징 (2) | 2024.11.20 |
| Yolov5 docker 배포할때 windows path 문제 (3) | 2024.11.20 |