perf: improve compression reliability and deployment safety

This commit is contained in:
237899745
2026-07-25 10:29:49 +08:00
parent 06220ca921
commit 9d7668bdee
34 changed files with 1391 additions and 1042 deletions

View File

@@ -15,8 +15,8 @@ pub enum Scope {
#[derive(Debug)]
pub enum BeginResult {
Acquired { expires_at: DateTime<Utc> },
Replay { response_status: i32, response_body: JsonValue },
Acquired,
Replay { response_body: JsonValue },
InProgress,
}
@@ -25,7 +25,6 @@ struct IdemRow {
request_hash: String,
response_status: i32,
response_body: Option<JsonValue>,
expires_at: DateTime<Utc>,
}
pub fn sha256_hex(parts: &[&[u8]]) -> String {
@@ -45,13 +44,22 @@ pub async fn begin(
ttl_hours: i64,
) -> Result<BeginResult, AppError> {
if idempotency_key.trim().is_empty() {
return Err(AppError::new(ErrorCode::InvalidRequest, "Idempotency-Key 不能为空"));
return Err(AppError::new(
ErrorCode::InvalidRequest,
"Idempotency-Key 不能为空",
));
}
if idempotency_key.len() > 128 {
return Err(AppError::new(ErrorCode::InvalidRequest, "Idempotency-Key 过长"));
return Err(AppError::new(
ErrorCode::InvalidRequest,
"Idempotency-Key 过长",
));
}
if request_hash.len() != 64 {
return Err(AppError::new(ErrorCode::InvalidRequest, "request_hash 不合法"));
return Err(AppError::new(
ErrorCode::InvalidRequest,
"request_hash 不合法",
));
}
let now = Utc::now();
@@ -108,12 +116,12 @@ pub async fn begin(
.map_err(|err| AppError::new(ErrorCode::Internal, "写入幂等记录失败").with_source(err))?;
if inserted.rows_affected() > 0 {
return Ok(BeginResult::Acquired { expires_at });
return Ok(BeginResult::Acquired);
}
let row = get_row(state, scope, idempotency_key, now).await?;
let Some(row) = row else {
return Ok(BeginResult::Acquired { expires_at });
return Ok(BeginResult::Acquired);
};
if row.request_hash != request_hash {
@@ -128,7 +136,6 @@ pub async fn begin(
}
Ok(BeginResult::Replay {
response_status: row.response_status,
response_body: row.response_body.unwrap_or(JsonValue::Null),
})
}
@@ -300,7 +307,7 @@ async fn get_row(
Scope::User(user_id) => {
sqlx::query_as::<_, IdemRow>(
r#"
SELECT request_hash, response_status, response_body, expires_at
SELECT request_hash, response_status, response_body
FROM idempotency_keys
WHERE user_id = $1
AND idempotency_key = $2
@@ -318,7 +325,7 @@ async fn get_row(
Scope::ApiKey(api_key_id) => {
sqlx::query_as::<_, IdemRow>(
r#"
SELECT request_hash, response_status, response_body, expires_at
SELECT request_hash, response_status, response_body
FROM idempotency_keys
WHERE api_key_id = $1
AND idempotency_key = $2
@@ -338,4 +345,3 @@ async fn get_row(
Ok(row)
}