- Notifications
You must be signed in to change notification settings - Fork 878
Open
Description
Retry Mechanism for Failed Proxy Requests
We need a retry mechanism to handle temporary service unavailability and connection failures during proxy requests, something like 'ECONNREFUSED'
Current Behavior
- Single attempt to connect to microservices
- Returns 503 on ECONNREFUSED
- No retry logic for failed requests
Proposed Changes
-
Add retry configuration:
- Maximum 1-3 retry attempts (configurable)
- manual delay b/w each failed retry (1s, 2s, 4s) (configurable)
- 10s timeout per request (configurable)
- A handler to decide on what basis the retry mechanism will work.
-
Handle specific error cases:
- ECONNREFUSED
- ECONNRESET
- ETIMEDOUT
-
Add response statuses:
- 503 Service Unavailable (temporary)
- 504 Gateway Timeout
- 500 Internal Server Error (other cases)
Code Example
const service_proxy_middleware = (target_url) => { const proxy = createProxyMiddleware({ target: "http://localhost:3002/api/v0/endpoint", changeOrigin: true, logger: console, selfHandleResponse: true, retry: { attempts: 3, delay: 1000, factor: 2, retryCondition: (err) => { return ( err.code === "ECONNREFUSED" || err.code === "ECONNRESET" || err.code === "ETIMEDOUT" ); }, }, on: { proxyReq: fixRequestBody, proxyRes: responseInterceptor(save_to_cache), error: (err, req, res) => { if (err.code === "ECONNREFUSED") { res.status(503).json({ status: "error", message: "Service temporarily unavailable / is restarting, please try again", code: "SERVICE_UNAVAILABLE", }); } else { res.status(500).json({ status: "error", message: "Internal server error", code: "PROXY_ERROR", }); } }, }, }); return proxy; };Related issue: #176
Additional context (optional)
"http-proxy-middleware": "^3.0.3",
"node": ">=22.0.0",
"express": "^4.21.2"
MichiK, Jaakkonen, foxaltus and CoderViki
Metadata
Metadata
Assignees
Labels
No labels