Bot重启后持久化存储会话实现用户通知的方案咨询
问题解答
关于botbuilder-azure的可用性
你对botbuilder-azure的认知存在偏差,这个库完全可以满足你的持久化推送需求,不存在“只能存状态不能存会话”的问题。
Teams机器人主动推送消息的核心逻辑从来不是持久化内存中的完整会话实例,只要拿到*会话引用(ConversationReference)*就可以构建稳定的消息推送通道,这个引用包含3个必填核心字段:
- 服务端点地址
serviceUrl - 会话唯一ID
conversation.id - 租户ID
tenantId(点对点推送额外需要用户IDfrom.id)
而这几个字段默认就包含在ConversationState的存储内容里,你用botbuilder-azure提供的CosmosDB、Blob Storage实现替换默认的内存存储后,用户首次和机器人交互时,这些字段会自动持久化到你配置的存储服务中,不需要额外编写采集逻辑。
具体实现方式
- 初始化持久化存储,替换默认内存存储
参考初始化代码如下:const { CosmosDbPartitionedStorage } = require('botbuilder-azure'); const { ConversationState, UserState } = require('botbuilder'); // 初始化CosmosDB存储实例,用BlobStorage的话替换成对应构造函数即可 const storage = new CosmosDbPartitionedStorage({ cosmosDbEndpoint: "你的Cosmos DB服务端点", authKey: "你的Cosmos DB访问密钥", databaseId: "bot-data", containerId: "conversation-records", compatibilityMode: false }); // 绑定会话状态、用户状态到持久化存储 const conversationState = new ConversationState(storage); const userState = new UserState(storage); - 重启后主动推送逻辑
机器人服务重启后,不需要等用户主动发消息触发会话,直接从存储中读取之前持久化的会话状态,提取其中的ConversationReference对象,调用适配器的continueConversation方法即可直接向对应用户/群聊推送通知,和重启前的推送效果完全一致。
其他可选方案
如果你不想持久化全量会话状态,也可以用更轻量的实现:在用户首次和机器人交互的消息处理逻辑中,手动从当前上下文中提取前面提到的3个会话核心字段,存入你常用的任意存储介质(Redis、MySQL、PostgreSQL等都可以)。需要发通知时,取出存好的字段手动构建ConversationReference实例,后续推送逻辑和官方方案完全一致。
注意事项
- Teams场景下需要在机器人注册配置页将对应区域的Teams服务端点加入可信地址列表,否则主动推送会返回权限错误
- 存储的会话引用存在失效场景:用户卸载机器人、被移出群聊、租户管理员禁用机器人时,原有引用会无法使用,推送时需要加异常捕获逻辑,及时清理失效记录
- 不要尝试序列化内存中的完整会话对象做持久化,这类对象包含大量临时上下文和循环引用,序列化/反序列化的稳定性极差,官方也不推荐这种实现方式
内容的提问来源于stack exchange,提问作者Jerome Dupont
相关产品推荐
相关产品推荐

