16 KiB
16 KiB
Salesforce 缓存优化需求
元数据
- 需求编号:2026-01-21-003-04
- 父需求编号:2026-01-21-003
- 创建时间:2026-01-21
- 创建人:SSOT 架构师
- 状态:待开始
- 优先级:高
需求概述
登录成功后将 SF 登录信息保存到 Redis 缓存,使用时校验有效性。缓存 Session ID(Access Token)、Server URL(Instance URL)、用户信息、组织信息、Access Token 和过期时间戳。设置合理的缓存过期时间(2 小时),使用缓存时校验有效性(检查过期时间戳),缓存失效时自动重新登录。Session ID 的有效期通过成功登录后存入缓存中,设置过期时间,若是过期了,Redis 则没有 Session ID。在缓存中存储过期时间戳,使用前进行校验。并发登录使用 Salesforce 用户 ID + 系统 ID 存储缓存。设计结构化的缓存键:sf:auth:{userId}:{systemId}:{orgType}。Salesforce 登录成功后,刷新当前系统中对于 org 配置名称加 org 类型的缓存。过期时 Redis 自动清理,或者登出接口清除当前缓存。
目标
- 缓存登录信息:登录成功后将 SF 登录信息保存到 Redis 缓存
- 缓存有效性校验:使用时校验有效性(检查过期时间戳)
- 缓存失效处理:缓存失效时自动重新登录
- 结构化缓存键:设计结构化的缓存键:
CURRENT_SOURCE_ORG_RESULT(源 org)、CURRENT_TARGET_ORG_RESULT(目标 org) - 并发登录支持:并发登录使用不同的缓存键区分源 org 和目标 org
- 缓存刷新:Salesforce 登录成功后,刷新当前系统中对于 org 配置名称加 org 类型的缓存
- 缓存清理:过期时 Redis 自动清理,或者登出接口清除当前缓存
- 会话管理:使用数据库表
datai_sf_login_session管理会话信息 - 自动重新登录:会话失效时自动重新登录
- 会话状态管理:支持会话状态(active/inactive)和最后活动时间管理
业务上下文
当前问题
- 缺乏登录信息缓存机制
- 缺乏缓存有效性校验
- 缺乏缓存刷新机制
- 缺乏缓存清理机制
业务场景
Salesforce 缓存优化
├─ 缓存 Session ID(Access Token)
├─ 缓存 Server URL(Instance URL)
├─ 缓存用户信息
├─ 缓存组织信息
├─ 使用时校验有效性
├─ 登录成功后刷新 org 配置名称加 org 类型的缓存
├─ 过期时 Redis 自动清理,或者登出接口清除当前缓存
├─ 使用数据库表 datai_sf_login_session 管理会话信息
├─ 支持会话状态(active/inactive)和最后活动时间管理
└─ 会话失效时自动重新登录
应用场景
- 性能优化:使用 Redis 缓存减少重复登录,使用时校验有效性
- 并发登录:支持多个用户同时登录不同的 Salesforce 系统
- 缓存管理:自动管理缓存的生命周期
功能需求
核心功能
功能 1:缓存登录信息
- 描述:登录成功后将 SF 登录信息保存到 Redis 缓存
- 验收标准:
- 缓存 Session ID(Access Token)
- 缓存 Server URL(Instance URL)
- 缓存用户信息
- 缓存组织信息
- 缓存 Access Token 和过期时间戳
- 设置合理的缓存过期时间(2 小时)
- Session ID 的有效期通过成功登录后存入缓存中,设置过期时间
- 若是过期了,Redis 则没有 Session ID
- 在缓存中存储过期时间戳,使用前进行校验
- 并发登录使用不同的缓存键区分源 org 和目标 org
- 设计结构化的缓存键:
CURRENT_SOURCE_ORG_RESULT(源 org)、CURRENT_TARGET_ORG_RESULT(目标 org)
- 优先级:高
- 依赖关系:依赖策略模式登录功能(2026-01-21-003-02)
功能 2:缓存有效性校验
- 描述:使用缓存时校验有效性(检查过期时间戳)
- 验收标准:
- 使用缓存时校验有效性(检查过期时间戳)
- 有效则直接使用
- 无效则重新登录
- 缓存校验时间 < 5ms
- 检查会话信息是否为 null
- 检查登录状态是否为成功
- 检查 Session ID 是否为空
- 检查 Session 是否过期
- 优先级:高
- 依赖关系:依赖缓存登录信息功能
功能 3:缓存失效处理
- 描述:缓存失效时自动重新登录
- 验收标准:
- 缓存失效时自动重新登录
- 基于历史登录记录进行自动登录
- 自动登录失败时返回错误信息
- 记录会话状态日志(会话为 null、登录状态为失败、Session 已过期)
- 优先级:高
- 依赖关系:依赖缓存有效性校验功能、登录历史功能(2026-01-21-003-03)
功能 4:缓存刷新
- 描述:Salesforce 登录成功后,刷新当前系统中对于 org 配置名称加 org 类型的缓存
- 验收标准:
- 登录成功后自动刷新 org 配置名称加 org 类型的缓存
- 缓存刷新失败后的处理机制
- 缓存刷新的日志记录
- 优先级:高
- 依赖关系:依赖缓存登录信息功能
功能 5:缓存清理
- 描述:过期时 Redis 自动清理,或者登出接口清除当前缓存
- 验收标准:
- 过期时 Redis 自动清理缓存
- 提供登出接口清除当前缓存
- 缓存清理失败后的处理机制
- 缓存清理的日志记录
- 优先级:高
- 依赖关系:依赖缓存登录信息功能
功能 6:会话管理
- 描述:使用数据库表
datai_sf_login_session管理会话信息 - 验收标准:
- 记录会话信息(用户名、登录类型、会话状态)
- 记录登录时间、过期时间、最后活动时间
- 记录登录 IP、设备信息、浏览器信息
- 记录会话 ID、Salesforce 用户 ID、Salesforce 组织 ID
- 记录实例 URL、ORG 类型
- 支持会话状态(active/inactive)
- 支持查询会话信息列表
- 支持查询会话信息详情
- 支持新增会话信息
- 支持修改会话信息
- 支持删除会话信息
- 支持批量删除会话信息
- 支持根据 Session ID 查询会话信息
- 支持查询最近一条活跃的会话信息
- 支持根据 ORG 类型查询最近一条活跃的会话信息
- 支持导出会话信息列表为 Excel 文件
- 优先级:高
- 依赖关系:依赖缓存登录信息功能
功能 7:自动重新登录
- 描述:会话失效时自动重新登录
- 验收标准:
- 会话失效时自动重新登录
- 基于历史登录记录进行自动登录
- 自动登录失败时返回错误信息
- 自动登录成功后更新缓存
- 自动登录失败时抛出异常
- 记录自动登录的日志
- 优先级:高
- 依赖关系:依赖会话管理功能、登录历史功能(2026-01-21-003-03)
非功能需求
性能需求
- 缓存时间:缓存读取时间 < 10ms
- 缓存校验时间:缓存有效性校验时间 < 5ms
- 并发用户数:支持 100+ 并发用户
安全需求
- 数据安全:缓存中的敏感信息使用加密存储
可用性需求
- 系统可用性:99.9%
- 容错机制:缓存失效时自动重新登录
可维护性需求
- 代码可读性:代码符合项目编码规范,注释完整
- 测试覆盖率:单元测试覆盖率 ≥ 80%
数据需求
数据模型
datai_sf_login_session(Salesforce 登录会话表)
datai_sf_login_session (Salesforce 登录会话表)
├─ id (BIGINT) - 主键ID
├─ username (VARCHAR) - 用户名
├─ login_type (VARCHAR) - 登录类型(oauth2/session_id/cli/legacy_credential)
├─ status (VARCHAR) - 会话状态(active/inactive)
├─ login_time (DATETIME) - 登录时间
├─ expire_time (DATETIME) - 过期时间
├─ last_activity_time (DATETIME) - 最后活动时间
├─ login_ip (VARCHAR) - 登录 IP
├─ device_info (VARCHAR) - 设备信息
├─ browser_info (VARCHAR) - 浏览器信息
├─ session_id (VARCHAR) - 会话 ID
├─ dept_id (BIGINT) - 部门 ID
├─ sf_user_id (VARCHAR) - Salesforce 用户 ID
├─ sf_organization_id (VARCHAR) - Salesforce 组织 ID
├─ instance_url (VARCHAR) - 实例 URL(Instance URL)
├─ org_type (VARCHAR) - ORG 类型(S=源 org T=目标 org ST=源和目标 org)
├─ create_by (VARCHAR) - 创建者
├─ create_time (DATETIME) - 创建时间
├─ update_by (VARCHAR) - 更新者
└─ update_time (DATETIME) - 更新时间
Redis 缓存结构
缓存键:
- 源 org:CURRENT_SOURCE_ORG_RESULT
- 目标 org:CURRENT_TARGET_ORG_RESULT
说明:
- 缓存键通过 orgType(source/target)动态获取
- 源 org 和目标 org 使用不同的缓存键
- 支持同时管理源 org 和目标 org 的会话
缓存值(SalesforceLoginResult 对象,JSON 序列化):
{
"success": true/false,
"errorCode": "错误代码",
"errorMessage": "错误信息",
"sessionId": "Session ID",
"refreshToken": "刷新令牌(仅 OAuth 流程中存在)",
"tokenType": "Bearer",
"expiresIn": "过期时间(秒)",
"loginTimestamp": "登录时间戳",
"expirationTimestamp": "过期时间戳(登录时间 + 过期时长)",
"instanceUrl": "实例 URL(Instance URL)",
"metadataServerUrl": "元数据服务器 URL",
"sandbox": true/false,
"passwordExpired": true/false,
"userId": "用户 ID(由 Salesforce 登录后返回)",
"organizationId": "组织 ID(由 Salesforce 登录后返回)",
"orgType": "组织类型(source/target)",
"userFullName": "用户全名",
"userEmail": "用户邮箱",
"organizationName": "组织名称(由 Salesforce 登录后返回)",
"language": "语言",
"timeZone": "时区"
}
缓存过期时间:2 小时(7200 秒)
数据存储需求
- 缓存类型:Redis
- 存储容量:支持 1000 万+ 缓存键
- 缓存过期策略:TTL(Time To Live)自动过期
数据流转需求
缓存登录信息
└─ 登录成功后保存登录信息到 Redis 缓存
└─ 缓存 Session ID
└─ 缓存 Server URL(Instance URL)
└─ 缓存用户信息、组织信息(由 Salesforce 登录后返回)
└─ 缓存 Access Token 和过期时间戳
└─ 设置缓存过期时间为 2 小时
└─ 使用缓存键:CURRENT_SOURCE_ORG_RESULT(源 org)、CURRENT_TARGET_ORG_RESULT(目标 org)
└─ 源 org 和目标 org 使用不同的缓存键
使用缓存
└─ 从 Redis 读取登录信息
└─ 校验缓存有效性(检查过期时间)
└─ 有效则直接使用
└─ 无效则重新登录
缓存刷新
└─ 登录成功后自动刷新 org 配置名称加 org 类型的缓存
缓存清理
└─ 过期时 Redis 自动清理缓存
└─ 或者通过登出接口清除当前缓存
会话管理
└─ 使用数据库表 datai_sf_login_session 管理会话信息
└─ 记录会话信息(用户名、登录类型、会话状态)
└─ 记录登录时间、过期时间、最后活动时间
└─ 记录登录 IP、设备信息、浏览器信息
└─ 记录会话 ID、Salesforce 用户 ID、Salesforce 组织 ID
└─ 记录实例 URL、ORG 类型
└─ 支持会话状态(active/inactive)
自动重新登录
└─ 会话失效时自动重新登录
└─ 基于历史登录记录进行自动登录
└─ 自动登录成功后更新缓存
└─ 自动登录失败时抛出异常
└─ 记录自动登录的日志
业务规则
- 缓存策略:登录信息必须缓存到 Redis,设置过期时间为 2 小时
- 缓存有效性校验:使用缓存时必须校验有效性(检查 expirationTimestamp)
- Session ID 有效期:通过成功登录后存入缓存中,设置过期时间,若是过期了,Redis 则没有 Session ID
- 缓存过期时间戳:在缓存中存储过期时间戳,使用前进行校验
- 并发登录缓存键:并发登录使用不同的缓存键区分源 org 和目标 org
- 结构化缓存键:缓存键格式为
CURRENT_SOURCE_ORG_RESULT(源 org)、CURRENT_TARGET_ORG_RESULT(目标 org) - 缓存刷新:Salesforce 登录成功后,刷新当前系统中对于 org 配置名称加 org 类型的缓存
- 缓存清理:过期时 Redis 自动清理,或者登出接口清除当前缓存
- 会话管理:使用数据库表
datai_sf_login_session管理会话信息 - 会话状态:支持会话状态(active/inactive)和最后活动时间管理
- 会话有效性检查:检查会话信息是否为 null、登录状态是否为成功、Session ID 是否为空、Session 是否过期
- 自动重新登录:会话失效时自动重新登录,基于历史登录记录进行自动登录
- 自动登录失败处理:自动登录失败时返回错误信息并抛出异常
- 会话状态日志:记录会话状态日志(会话为 null、登录状态为失败、Session 已过期)
接口需求
缓存管理接口
-
获取缓存信息
- 接口路径:GET /api/salesforce/cache/info
- 请求参数:userId、systemId、orgType
- 响应:缓存信息
-
清除缓存
- 接口路径:DELETE /api/salesforce/cache
- 请求参数:userId、systemId、orgType
- 响应:成功/失败
-
刷新缓存
- 接口路径:POST /api/salesforce/cache/refresh
- 请求参数:systemId、orgType
- 响应:成功/失败
会话管理接口
-
查询会话信息列表
- 接口路径:GET /api/salesforce/session/list
- 请求参数:分页参数、筛选参数
- 响应:会话信息列表
-
导出会话信息列表
- 接口路径:POST /api/salesforce/session/export
- 请求参数:筛选参数
- 响应:Excel 文件
-
查询会话信息详情
- 接口路径:GET /api/salesforce/session/{id}
- 响应:会话信息详情
-
新增会话信息
- 接口路径:POST /api/salesforce/session
- 请求参数:会话信息
- 响应:成功/失败
-
修改会话信息
- 接口路径:PUT /api/salesforce/session
- 请求参数:会话信息
- 响应:成功/失败
-
删除会话信息
- 接口路径:DELETE /api/salesforce/session/{ids}
- 请求参数:会话 ID 数组
- 响应:成功/失败
-
根据 Session ID 查询会话信息
- 接口路径:GET /api/salesforce/session/by-session-id/{sessionId}
- 响应:会话信息
-
查询最近一条活跃的会话信息
- 接口路径:GET /api/salesforce/session/latest-active
- 响应:会话信息
-
根据 ORG 类型查询最近一条活跃的会话信息
- 接口路径:GET /api/salesforce/session/latest-active/{orgType}
- 请求参数:orgType(S/T/ST)
- 响应:会话信息
SessionManager 接口
-
获取当前登录结果
- 接口路径:GET /api/salesforce/session/current-login-result/{orgType}
- 请求参数:orgType(source/target)
- 响应:SalesforceLoginResult 会话信息
-
获取当前 Session ID
- 接口路径:GET /api/salesforce/session/current-session/{orgType}
- 请求参数:orgType(source/target)
- 响应:访问令牌
-
获取实例 URL
- 接口路径:GET /api/salesforce/session/instance-url/{orgType}
- 请求参数:orgType(source/target)
- 响应:实例 URL
-
检查会话有效性
- 接口路径:GET /api/salesforce/session/is-valid/{orgType}
- 请求参数:orgType(source/target)
- 响应:会话是否有效(true/false)
依赖关系
- 依赖
2026-01-21-003-02:策略模式登录 - 依赖
2026-01-21-003-03:登录历史 - 依赖
datai-cache-redis模块 - 依赖
datai-salesforce-common模块的 Salesforce API 封装
后续需求
- 2026-01-21-003-05:会话管理
- 2026-01-21-003-06:登录状态查询
- 2026-01-21-003-07:错误码映射