OpenAI解释开源函数库redis-py存在bug,导致ChatGPT服务故障

ChatGPT在3月20日发生故障,有机会让用户看到别人的对话标题,同时OpenAI系统还发送订阅确认电子邮件给错误的用户,官方解释,这些问题来自于Redis用户端开源函数库redis-py的bug,目前所有相关错误都已修复。

在错误发生期间,部分用户会看到另一个活跃用户的对话记录标题,而当两个用户皆处在活跃状态,则新对话的第一条消息,也可能会出现在另一人的聊天记录中。ChatGPT的故障不只如此,少数新订阅者的付款资料和个人信息,也会意外地通过电子邮件泄漏,用户可能收到另一个ChatGPT Plus用户的订阅确认信件,内容包含姓名、电子邮件信箱、付款地址、信用卡号码后4码还有信用卡到期日期。

在OpenAI发现这个错误来自于Redis客户端开源函数库redis-py,便紧急联络Redis维护者,还提供了修补程序代码,迅速解决这个问题。

ChatGPT使用Redis缓存用户的资讯,让系统不需要为每一个请求都访问一次数据库,OpenAI通过Redis Cluster将这项负载分散到Redis执行实例,在OpenAI的Python服务器中,使用了redis-py函数库操作Redis,而Python服务器则是采用Asyncio异步I/O框架,借以提高Python服务器在处理大量请求时的性能。

Redis-py函数库在Python服务器和Redis集群间维护了一个共享连接池,会在完成请求之后回收连接,以用于处理下一个请求。而错误发生在于Asyncio、redis-py的请求与回应处理时,请求和回应分别存放于两个队列,调用者会将请求推送到传入队列(Incoming Queue)中,请求经过处理之后,输出至传出队列(Outgoing Queue),回应由传出队列弹出,而连接被发布回连接池。

不过,当请求被推送到传入队列,但是在回应从传出队列弹出之前就被取消的话,便会出现错误,因为连接被破坏,不相关的回应便接收了遗留在连接中的不相关的请求资料。但之所以之前这个bug没有被发现,是因为在大多数情况,这可能出现不可恢复的服务器错误,因此用户只好重新请求,而且在部分时候,坏掉的资料刚好跟用户请求的资料类型相符,因此从缓存回传的资料也就看起来没什么问题,但其实该回应来自于另一个用户。

OpenAI在3月20日的时候因为调整服务器,意外的使Redis请求取消数暴增,使得每一个连接都有机会发生错误,所以也就让Redis-py函数库的bug浮上台面。这个错误仅发生在Redis Cluster的Asyncio redis-py客户端,而目前这个问题已经修复。

测试修复程序代码经官方广泛测试,确保问题不会再发生,OpenAI也添加额外的检查,确保Redis缓存回传的资料与请求用户相符,并且通过比对多重资料,找出受影响的用户,提供必要的协助,OpenAI也扩大了Redis集群规模以及强健性,减少在极端负载时出现错误连接的可能性。