客戶端斷開連接,報(bào)錯(cuò)Invocation canceled by client怎么辦?
本文介紹報(bào)錯(cuò)Invocation canceled by client的原因和解決方案。
問題現(xiàn)象
在請(qǐng)求日志中查到報(bào)錯(cuò)信息如下所示。
FC Invoke End RequestId: 1-64263a4b-2cd7c98b677*********, Error: Invocation canceled by client (duration: 4912ms, maxMemoryUsage: 0.00MB)
可能原因
發(fā)起調(diào)用的客戶端主動(dòng)取消了請(qǐng)求,導(dǎo)致函數(shù)執(zhí)行異常中斷,函數(shù)執(zhí)行報(bào)錯(cuò)。
解決方案
排查步驟如下所示。
根據(jù)報(bào)錯(cuò)日志,確認(rèn)客戶端主動(dòng)取消請(qǐng)求時(shí),函數(shù)已執(zhí)行的時(shí)間。
本文示例中,
duration: 4912ms
表示函數(shù)運(yùn)行接近5s。根據(jù)業(yè)務(wù)情況判斷該運(yùn)行時(shí)間是否符合預(yù)期。
如果符合預(yù)期,則需要增加客戶端超時(shí)時(shí)間。具體操作,請(qǐng)參見函數(shù)執(zhí)行時(shí)間符合預(yù)期。
如果不符合預(yù)期,則需要根據(jù)日志排查函數(shù)的運(yùn)行鏈路,確認(rèn)具體是哪部分邏輯導(dǎo)致執(zhí)行時(shí)間增加。具體操作,請(qǐng)參見函數(shù)執(zhí)行時(shí)間不符合預(yù)期。
函數(shù)執(zhí)行時(shí)間符合預(yù)期
如果您通過SDK/API調(diào)用函數(shù),建議將請(qǐng)求的超時(shí)時(shí)間設(shè)置為大于函數(shù)配置的超時(shí)時(shí)間。
例如,使用Golang語言和函數(shù)計(jì)算的API調(diào)用函數(shù),可以通過http.Client中的Timeout屬性設(shè)置請(qǐng)求超時(shí)時(shí)間。如果在發(fā)起請(qǐng)求時(shí)使用了context.Context,可以調(diào)整Context的截止時(shí)間或超時(shí)時(shí)間。
如果您通過其他服務(wù)調(diào)用函數(shù),可以在該服務(wù)的控制臺(tái)修改后端超時(shí)時(shí)間。
例如,前端通過API網(wǎng)關(guān)調(diào)用函數(shù),可以在API網(wǎng)關(guān)控制臺(tái)修改API的后端超時(shí)配置。具體操作,請(qǐng)參見創(chuàng)建 API。
如果您通過控制臺(tái)調(diào)用函數(shù),請(qǐng)勿在函數(shù)未執(zhí)行完成前單擊取消請(qǐng)求手動(dòng)取消或關(guān)閉網(wǎng)頁。
函數(shù)執(zhí)行時(shí)間不符合預(yù)期
程序執(zhí)行的耗時(shí)一般包括以下兩類。
I/O操作
I/O操作,尤其網(wǎng)絡(luò)的I/O,是執(zhí)行延時(shí)增大的主要原因。建議排查程序中所有訪問外部服務(wù)的操作,可以在訪問外部服務(wù)前后添加日志,確認(rèn)耗時(shí)是否正常。
計(jì)算操作
大量的計(jì)算操作也可能導(dǎo)致延時(shí)增加,建議調(diào)大CPU規(guī)格。