Ray Serve WebSocket-Bereitstellung: Fehler „ASGI Callable zurückgegeben, ohne Handshake zu senden“ für mehr als 5 VerbinPython

Python-Programme
Guest
 Ray Serve WebSocket-Bereitstellung: Fehler „ASGI Callable zurückgegeben, ohne Handshake zu senden“ für mehr als 5 Verbin

Post by Guest »

Ich entwickle einen FastAPI-WebSocket-Server, der mit Ray Serve bereitgestellt wird, um mehrere WebSocket-Verbindungen zu verwalten. Die Anwendung ist so konzipiert, dass sie eine Echtzeitkommunikation mit bis zu 50.000 gleichzeitigen Benutzern ermöglicht. Nach der Integration von Ray Serve für Multiprocessing stoße ich jedoch auf ein Problem:
Die Anwendung funktioniert für die ersten 5 Benutzer wie erwartet.
Wenn ein 6. Benutzer eine Verbindung herstellt, erhalte ich der folgende Fehler:

Code: Select all

ERROR:    ASGI callable returned without sending handshake.
(ProxyActor pid=1264842) Task exception was never retrieved
(ProxyActor pid=1264842) future: 
(ProxyActor pid=1264842) Traceback (most recent call last):
(ProxyActor pid=1264842)   File "/home/[email protected]/miniconda3/envs/clonehub/lib/python3.11/site-packages/ray/serve/_private/proxy_response_generator.py", line 116, in _await_response_anext
(ProxyActor pid=1264842)     return await self._response.__anext__()
(ProxyActor pid=1264842)            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(ProxyActor pid=1264842)   File "/home/[email protected]/miniconda3/envs/clonehub/lib/python3.11/site-packages/ray/serve/handle.py", line 559, in __anext__
(ProxyActor pid=1264842)     replica_result = await self._fetch_future_result_async()
(ProxyActor pid=1264842)                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
(ProxyActor pid=1264842)   File "/home/[email protected]/miniconda3/envs/clonehub/lib/python3.11/site-packages/ray/serve/handle.py", line 280, in _fetch_future_result_async
(ProxyActor pid=1264842)     raise RequestCancelledError(self.request_id) from None
(ProxyActor pid=1264842) ray.serve.exceptions.RequestCancelledError: Request e85273c8-f582-49a4-8dbe-0a86b464ad90 was cancelled.
(ProxyActor pid=1264842) Task exception was never retrieved
(ProxyActor pid=1264842) future: 
(ProxyActor pid=1264842) Traceback (most recent call last):
(ProxyActor pid=1264842)   File "/home/[email protected]/miniconda3/envs/clonehub/lib/python3.11/site-packages/uvicorn/protocols/websockets/websockets_impl.py", line 258, in run_asgi
(ProxyActor pid=1264842)     self.send_500_response()
(ProxyActor pid=1264842)   File "/home/[email protected]/miniconda3/envs/clonehub/lib/python3.11/site-packages/uvicorn/protocols/websockets/websockets_impl.py", line 222, in send_500_response
(ProxyActor pid=1264842)     self.transport.write(b"".join(content))
(ProxyActor pid=1264842)   File "uvloop/handles/stream.pyx", line 678, in uvloop.loop.UVStream.write
(ProxyActor pid=1264842)   File "uvloop/handles/handle.pyx", line 159, in uvloop.loop.UVHandle._ensure_alive
(ProxyActor pid=1264842) RuntimeError: unable to perform operation on ; the handler is closed
Code: Hauptanwendung mit Ray Serve-Bereitstellung:

Code: Select all

from fastapi import FastAPI, WebSocket
from ray import serve

app = FastAPI()

@serve.deployment
@serve.ingress(app)
class FastAPIDeployment:
def __init__(self):
self.connections = {}

@app.websocket("/ws")
async def websocket_endpoint(self, websocket: WebSocket):
await websocket.accept()
# Connection handling logic
WebSocket Manager:
Ein Redis-basierter WebSocket-Manager zum Verfolgen von Verbindungen.
Gibt es in Ray ein bekanntes Limit für gleichzeitige WebSocket-Verbindungen? Serve oder FastAPI, die mir fehlen?
Wie kann ich den Fehler „ASGI Callable zurückgegeben ohne Senden eines Handshakes“ debuggen und beheben?
Könnte dies mit dem WebSocket-Verbindungsstatus in Redis oder der Funktionsweise von Ray Serve zusammenhängen? verwaltet den Status?
Ich verwende: Python 3.11, ray[serve]==2.40.0, fastapi==0.115.5, uvicorn==0.32.1, asyncio==3.4. 3
Was ich versucht habe:
Überprüfte Redis-Verbindung und aktive WebSocket-Verwaltungslogik. Erhöhte http_options in Serve.start():

Code: Select all

serve.start(http_options={
"host": "0.0.0.0",
"port": 8000,
"keep_alive_timeout": 60,
"max_keep_alive_requests": 10
})

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post