refactor: 重构文档结构和文件位置

docs: 添加Redis集成测试文档
docs: 添加ID生成器分析报告
docs: 添加自由布局和固定布局示例文档
test: 添加ID生成器单元测试
fix: 删除重复的前端文档文件
This commit is contained in:
2025-09-24 01:10:01 +08:00
parent adcd49a5db
commit 6ff587dc23
26 changed files with 302 additions and 6 deletions

View File

@ -78,4 +78,155 @@ const REQUEST_LOG_SUB_ID: u8 = 1;
pub fn generate_request_log_id() -> i64 {
generate_biz_id(BizIdConfig::new(REQUEST_LOG_MAIN_ID, REQUEST_LOG_SUB_ID))
}
#[cfg(test)]
mod tests {
use super::*;
use std::thread;
use std::time::Duration;
use std::collections::HashSet;
#[test]
fn test_id_sequential_generation() {
// 测试1: 连续生成ID验证递增性
let mut prev_id = 0i64;
for i in 1..=10 {
let current_id = generate_id();
println!("ID {}: {}", i, current_id);
if i > 1 {
assert!(current_id > prev_id,
"ID {} ({}) 应该大于前一个ID {} ({})", i, current_id, i-1, prev_id);
}
prev_id = current_id;
}
}
#[test]
fn test_id_time_interval_generation() {
// 测试2: 间隔时间生成ID验证时间戳影响
let mut time_based_ids = Vec::new();
for i in 1..=5 {
let id = generate_id();
time_based_ids.push(id);
println!("时间间隔ID {}: {}", i, id);
thread::sleep(Duration::from_millis(10)); // 减少等待时间以加快测试
}
// 验证时间间隔ID的递增性
for i in 1..time_based_ids.len() {
assert!(time_based_ids[i] > time_based_ids[i-1],
"时间间隔ID {} ({}) 应该大于前一个ID ({})",
i+1, time_based_ids[i], time_based_ids[i-1]);
}
}
#[test]
fn test_different_business_id_types() {
// 测试3: 不同业务类型ID的递增性
let flow_id1 = generate_biz_id(BizIdConfig::new(1, 1));
thread::sleep(Duration::from_millis(1));
let flow_id2 = generate_biz_id(BizIdConfig::new(1, 1));
thread::sleep(Duration::from_millis(1));
let log_id1 = generate_biz_id(BizIdConfig::new(2, 1));
thread::sleep(Duration::from_millis(1));
let log_id2 = generate_biz_id(BizIdConfig::new(2, 1));
println!("Flow ID 1: {}", flow_id1);
println!("Flow ID 2: {}", flow_id2);
println!("Log ID 1: {}", log_id1);
println!("Log ID 2: {}", log_id2);
// 验证同类型业务ID递增
assert!(flow_id2 > flow_id1, "Flow ID 2 应该大于 Flow ID 1");
assert!(log_id2 > log_id1, "Log ID 2 应该大于 Log ID 1");
}
#[test]
fn test_concurrent_id_generation() {
// 测试4: 多线程并发生成ID测试
let handles: Vec<_> = (0..3).map(|thread_id| {
thread::spawn(move || {
let mut thread_ids = Vec::new();
for _ in 0..5 {
thread_ids.push(generate_id());
thread::sleep(Duration::from_millis(1));
}
(thread_id, thread_ids)
})
}).collect();
let mut all_ids = Vec::new();
for handle in handles {
let (thread_id, ids) = handle.join().unwrap();
println!("线程 {} 生成的ID: {:?}", thread_id, ids);
all_ids.extend(ids);
}
// 验证所有ID的唯一性
let unique_ids: HashSet<_> = all_ids.iter().collect();
assert_eq!(all_ids.len(), unique_ids.len(),
"发现重复ID总数: {}, 唯一数: {}", all_ids.len(), unique_ids.len());
}
#[test]
fn test_id_timestamp_parsing() {
// 测试5: 解析ID验证时间戳部分
let id1 = generate_id();
thread::sleep(Duration::from_millis(10));
let id2 = generate_id();
// 提取时间戳部分低39位中的时间戳
let timestamp1 = id1 & ((1i64 << 39) - 1);
let timestamp2 = id2 & ((1i64 << 39) - 1);
println!("ID1: {}, 时间戳部分: {}", id1, timestamp1);
println!("ID2: {}, 时间戳部分: {}", id2, timestamp2);
// 注意在同一毫秒内生成的ID时间戳部分可能相同但序列号会递增
// 所以这里只验证ID2不小于ID1
assert!(id2 > id1, "ID2 应该大于 ID1");
}
#[test]
fn test_biz_id_parsing() {
// 测试6: 业务ID解析功能
let config = BizIdConfig::new(123, 45);
let id = generate_biz_id(config);
let (main_id, sub_id, base_id) = parse_biz_id(id);
assert_eq!(main_id, 123, "解析的main_id应该等于123");
assert_eq!(sub_id, 45, "解析的sub_id应该等于45");
assert!(base_id > 0, "解析的base_id应该大于0");
println!("原始ID: {}, 解析结果: main_id={}, sub_id={}, base_id={}",
id, main_id, sub_id, base_id);
}
#[test]
fn test_specific_id_generators() {
// 测试7: 特定业务ID生成器
let flow_log_id1 = generate_flow_run_log_id();
let flow_log_id2 = generate_flow_run_log_id();
let request_log_id1 = generate_request_log_id();
let request_log_id2 = generate_request_log_id();
// 验证递增性
assert!(flow_log_id2 > flow_log_id1, "流程日志ID应该递增");
assert!(request_log_id2 > request_log_id1, "请求日志ID应该递增");
// 验证业务类型解析
let (main_id, sub_id, _) = parse_biz_id(flow_log_id1);
assert_eq!(main_id, FLOW_RUN_LOG_MAIN_ID, "流程日志ID的main_id应该正确");
assert_eq!(sub_id, FLOW_RUN_LOG_SUB_ID, "流程日志ID的sub_id应该正确");
let (main_id, sub_id, _) = parse_biz_id(request_log_id1);
assert_eq!(main_id, REQUEST_LOG_MAIN_ID, "请求日志ID的main_id应该正确");
assert_eq!(sub_id, REQUEST_LOG_SUB_ID, "请求日志ID的sub_id应该正确");
println!("流程日志ID: {}, {}", flow_log_id1, flow_log_id2);
println!("请求日志ID: {}, {}", request_log_id1, request_log_id2);
}
}