docs icon indicating copy to clipboard operation
docs copied to clipboard

同步字典接口报错

Open halfray opened this issue 1 year ago • 3 comments

原本运行正常的程序,最近经常报如下错误: 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() org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749) org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(

@hailiang-wang

halfray avatar Sep 26 '24 08:09 halfray

那应该是后台服务出现了什么问题,因为:

  • 最近一周没有升级/重启
  • 最近一周,请求量没有明显增长

出现该问题,要么是: 1) Chatopera 云服务硬件承受不了请求负载了;2)后台服务节点的网络出现问题。

现在开始排查日志,稍晚回复您。

另外,API 调用,是在什么时间段发生的?

hailiang-wang avatar Sep 26 '24 10:09 hailiang-wang

后台服务,一直有一个凌晨定时清缓存的自动任务。 该任务会重启一个服务节点,现在优化了一下。 但是如果您的 API 调用不是在凌晨左右发生,那么还不是相关问题。

还有就是,最近您的 API 调用,达到了每秒几个请求? 如果连续不断的请求,很密集,服务器会处理不过来,尤其是网络传输较慢的情况下。

  • 每秒请求次数多
  • 网络情况不好

Chatopera 也需要根据您的情况,去优化硬件。

hailiang-wang avatar Sep 26 '24 11:09 hailiang-wang

后台我在继续观察和优化。 但一个必要的解决方案,是在您调用 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

hailiang-wang avatar Sep 26 '24 23:09 hailiang-wang

后台服务在该时间段,有产品更新重启,导致训练中没有加入的新词。 后重新启动训练解决。

hailiang-wang avatar Oct 17 '24 06:10 hailiang-wang