同步字典接口报错
原本运行正常的程序,最近经常报如下错误:
com.chatopera.bot.exception.ChatbotException: kong.unirest.UnirestException: Unexpected result with API POST /api/v1/chatbot/641801eab1fcf4001379a113/clause/dictwords?sdklang=java, statusText Gateway Timeout
com.chatopera.bot.sdk.Chatbot.command(Chatbot.java:217)
com.chatopera.bot.sdk.DictsMgr.putCustomVocabDictWord(DictsMgr.java:196)
com.snl.service.bot.BotDictService.putDict(BotDictService.java:42)
com.snl.service.bot.BotDictService$$FastClassBySpringCGLIB$$67e93d82.invoke(
@hailiang-wang
那应该是后台服务出现了什么问题,因为:
- 最近一周没有升级/重启
- 最近一周,请求量没有明显增长
出现该问题,要么是: 1) Chatopera 云服务硬件承受不了请求负载了;2)后台服务节点的网络出现问题。
现在开始排查日志,稍晚回复您。
另外,API 调用,是在什么时间段发生的?
后台服务,一直有一个凌晨定时清缓存的自动任务。 该任务会重启一个服务节点,现在优化了一下。 但是如果您的 API 调用不是在凌晨左右发生,那么还不是相关问题。
还有就是,最近您的 API 调用,达到了每秒几个请求? 如果连续不断的请求,很密集,服务器会处理不过来,尤其是网络传输较慢的情况下。
- 每秒请求次数多
- 网络情况不好
Chatopera 也需要根据您的情况,去优化硬件。
后台我在继续观察和优化。 但一个必要的解决方案,是在您调用 API 的代码中完成:因为硬件和后端服务优化肯定还是有瓶颈,因为连续请求会将很多请求堆积处理,直至发生 gateway timeout。
方案:还需要在您的代码中,实现下面的逻辑
- 在调用的代码中,加入 try catch, 捕获 com.chatopera.bot.exception.ChatbotException 并检查 exception msg 字符串中是否有
kong.unirest.UnirestException, 代表捕获的是 Gateway timeout。 - 发生 Gateway timeout 后,记录当前发送的 Request 信息,比如字典的请求,然后 sleep 一分钟,一分钟后,重新发送请求
- 如果调用 API 时,使用了 for 循环,那么就是出现问题的调用发生时,sleep 一分钟,然后重新发送出错的 request 并继续 for 循环,直到又出现问题,再次的 sleep
- 每天同步词典,使用增量法,不是全量同步,这样减少请求次数,可以让服务更加稳定
@halfray
后台服务在该时间段,有产品更新重启,导致训练中没有加入的新词。 后重新启动训练解决。