LangChain Flask应用多用户复杂对象路由传递与状态管理问询
针对Azure Web App部署LangChain多用户聊天机器人的无Redis解决方案
1. 多用户数据隔离:线程安全的进程内缓存
- 替换全局变量,使用带
threading.Lock保护的字典存储用户专属数据,键采用用户邮箱的哈希值(确保唯一性),值为包含DataFrames、Agent实例、对话Memory的自定义对象。 - Azure Web App单实例为多线程模型,线程锁可避免并发读写冲突;若启用多实例横向扩展,依赖Azure默认的会话亲和性(Sticky Sessions),确保同一用户的请求持续路由到同一实例,每个实例维护独立的用户数据缓存分片。
2. 大DataFrames存储:磁盘缓存替代Session
- 放弃Session存储大对象,用
joblib(比pickle更高效)序列化DataFrames,存储到Azure Web App的临时存储目录(D:\home\site\wwwroot\user_cache)或Azure Files共享存储,文件名格式为{user_hash}_{table_name}.joblib。 - 每次请求时先检查本地缓存文件是否存在且未过期,存在则直接反序列化加载,避免重复从SQL Server拉取数据。
3. 初始化耗时优化:预加载+缓存复用
- 预加载通用资源:应用启动时,针对高频权限组预拉取通用数据表、初始化基础Agent模板,用户请求时仅需注入专属数据,无需全量初始化。
- 用户级缓存复用:首次请求时加载用户专属DataFrames并初始化Agent,将结果存入线程安全字典/磁盘缓存,后续请求直接复用,直到用户会话过期或数据更新。
4. 生产环境稳定性保障
- 给用户数据缓存添加LRU淘汰策略:用
cachetools.LRUCache替代普通字典,限制缓存的用户数量(比如1000个),避免内存溢出。 - 实现会话过期清理:记录每个用户数据的最后访问时间,用定时任务(如
APScheduler)每日清理超过24小时未访问的缓存数据和磁盘文件。 - 启用Azure Application Insights,监控内存使用率、缓存命中率、初始化耗时等指标,根据数据调整缓存策略。
5. 对话Memory处理
- 将
ConversationBufferMemory等对话上下文对象和用户DataFrames、Agent实例绑定,一同存入线程安全字典或序列化到磁盘缓存,确保同一用户的对话上下文连贯。
内容的提问来源于stack exchange,提问作者Ahad Anjum
相关产品推荐
相关产品推荐

