Task 2-2: Retry Strategy cho Node Server Callbacks
Phase: 2 - Resilience Priority: Medium Depends on: Không có Reference: docs/BountyHunter-Backend/details/feature-payment-marketplace/SPEC.md
Background
NodeServerService nhận callbacks từ node server (NFT transfer, mint confirm). Nếu node server retry callback khi nhận timeout, backend phải handle idempotently. Ngoài ra, backend cũng có thể cần retry calls tới node server.
Tasks
DI Note:
NodeServerServicecần inject HTTP client (xác nhận làRestTemplatehayWebClient). Nếu dùng Spring Retry (@Retryable): đảm bảo@EnableRetrycó trong@Configurationclass vàspring-retrydependency trongpom.xml.@Recovermethod phải cùng class, cùng return type, thêm exception type làm tham số đầu tiên.
-
[ ] Audit tất cả calls từ backend tới
NodeServerService:Xác nhận:grep -rn "confirmSolanaNftRental\|transferNft\|mintCompressNft" application-core/confirmSolanaNftRental(),transferNft(),mintCompressNft()— các method khác nếu có -
[ ] Thêm retry với exponential backoff cho outbound calls (cần
spring-retrydependency):// Đảm bảo @EnableRetry trên @Configuration class @Retryable( value = {RestClientException.class}, maxAttempts = 3, backoff = @Backoff(delay = 1000, multiplier = 2) // 1s, 2s, 4s ) public void confirmSolanaNftRental(String orderId, String tokenId, String renterAddress) { // call node server } @Recover public void confirmSolanaNftRentalFallback(RestClientException e, String orderId, String tokenId, String renterAddress) { LOGGER.error("[NODE_SERVER] Failed to confirm rental after 3 retries. orderId={}", orderId, e); // Store for manual retry / alert ops team } -
[ ] Apply tương tự cho
transferNft()vàmintCompressNft() - [ ] Document callback idempotency: node server có thể retry → backend phải idempotent (task-1-1 đã cover inbound idempotency)
Verification / Acceptance Criteria
- [ ]
spring-retrydependency tồn tại trongpom.xml(nếu dùng@Retryable) - [ ]
@EnableRetrytồn tại trong một@Configurationclass - [ ] Khi node server trả 5xx/timeout → retry tối đa 3 lần với backoff
- [ ] Sau 3 lần fail →
@Recovermethod được gọi, error được log với orderId - [ ] Happy path: retry không ảnh hưởng khi call thành công lần đầu
Files to Modify
application-core/service/node_server/NodeServerService.java