chore: 完善捞瓶重试配置与超时
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user