chore: 完善捞瓶重试配置与超时

This commit is contained in:
root
2026-09-15 21:44:39 +08:00
parent c94d7b1af0
commit 11fcdb5307
3 changed files with 147 additions and 10 deletions
+25 -10
View File
@@ -119,12 +119,18 @@ export class MatchService {
} catch (error) {
if (error instanceof DomainException) {
if (error.code === ErrorCode.BOTTLE_POOL_EMPTY) {
const winner = await this.readWinnerUntil(
pickerId,
requestId,
Math.min(deadline, performance.now() + 250),
);
if (winner) return winner;
try {
const winner = await this.readWinnerUntil(
pickerId,
requestId,
Math.min(deadline, performance.now() + 250),
);
if (winner) return winner;
} catch (readError) {
if (classifyPickError(readError) === "SERVICE_UNAVAILABLE")
throw error;
throw readError;
}
}
throw error;
}
@@ -133,7 +139,7 @@ export class MatchService {
if (action === "SERVICE_UNAVAILABLE") break;
if (action === "READ_WINNER") {
try {
const winner = await this.readWinner(pickerId, requestId);
const winner = await this.readWinner(pickerId, requestId, deadline);
if (winner) return winner;
} catch (readError) {
if (classifyPickError(readError) === "SERVICE_UNAVAILABLE") break;
@@ -180,8 +186,17 @@ export class MatchService {
});
}
private async readWinner(pickerId: string, requestId: string) {
const previous = await this.findPrevious(this.prisma, pickerId, requestId);
private async readWinner(
pickerId: string,
requestId: string,
deadline: number,
) {
const limits = transactionLimits(this.retry, performance.now(), deadline);
if (!limits) return null;
const previous = await this.prisma.$transaction(
(tx) => this.findPrevious(tx, pickerId, requestId),
{ isolationLevel: "ReadCommitted", ...limits },
);
if (previous?.lease) {
try {
const token = decryptLeaseToken(
@@ -206,7 +221,7 @@ export class MatchService {
deadline: number,
) {
while (performance.now() < deadline) {
const winner = await this.readWinner(pickerId, requestId);
const winner = await this.readWinner(pickerId, requestId, deadline);
if (winner) return winner;
await new Promise((resolve) => setTimeout(resolve, 5));
}