"Invocation canceled by client" hatası, işlevin çalışması tamamlanmadan önce istemcinin bağlantıyı kestiğini gösterir. Function Compute çalışmayı durdurur ve hatayı günlüğe kaydeder.
Hata mesajı
İstek günlüğünde aşağıdaki hata görüntülenir:
FC Invoke End RequestId: 1-64263a4b-2cd7c98b677*********, Error: Invocation canceled by client (duration: 4912ms, maxMemoryUsage: 0.00MB)
Neden
İşlev tamamlanmadan önce istemci isteği iptal eder; bu durum çalışmayı kesintiye uğratır ve hataya neden olur.
Yaygın tetikleyiciler şunlardır:
İstemci tarafındaki istek zaman aşımı süresi, işlevin çalışma süresinden daha kısadır.
Bir kullanıcı isteği manuel olarak iptal etmiştir (örneğin, Function Compute konsolunda Cancel Request seçeneğine tıklayarak veya tarayıcı sekmesini kapatarak).
Bir ara hizmet (API Gateway gibi), işlevin çalışma süresinden daha kısa bir arka uç zaman aşımı uygulamıştır.
Çözüm
Adım 1: Çalışma süresini kontrol edin
İstemci bağlantıyı kesmeden önce işlevin ne kadar süre çalıştığını görmek için hata mesajından duration değerini ayıklayın.
Yukarıdaki örnekte duration: 4912ms ifadesi, işlevin yaklaşık 5 saniye çalıştığını gösterir.
Adım 2: Sürenin beklenen bir değer olup olmadığını belirleyin
Süreyi, işleviniz için beklenen çalışma süresiyle karşılaştırın:
Süre beklenen değerdedir -- İşlev olması gerektiği kadar çalışmış, ancak istemcinin zaman aşımı çok erken gerçekleşmiştir. Bkz. İstemci tarafı zaman aşımını artırma.
Süre beklenenden uzundur -- İşlev olması gerekenden daha uzun sürmüştür. Bkz. İşlev çalışma süresini azaltma.
İstemci tarafı zaman aşımını artırma
İşlevin çalışma süresi beklentiler dahilindeyse istemci zaman aşımı çok kısadır. İşlevi nasıl çağırdığınıza bağlı olarak zaman aşımını ayarlayın:
SDK veya API ile çağrı
İstemci tarafındaki istek zaman aşımını, yapılandırılmış işlev zaman aşımından daha büyük bir değere ayarlayın.
Go örneği: http.Client içindeki Timeout özelliği aracılığıyla zaman aşımını ayarlayın. İsteği başlatmak için context.Context kullanıyorsanız bağlamın son tarihini veya zaman aşımını düzenleyin.
// Set the HTTP client timeout to 120 seconds
client := &http.Client{
Timeout: 120 * time.Second,
}
Başka bir hizmet üzerinden çağrı
İşlevi başka bir Alibaba Cloud hizmeti (API Gateway gibi) tetikliyorsa ilgili hizmetin arka uç zaman aşımını değiştirin.
API Gateway örneği: API Gateway konsolunda arka uç zaman aşımı ayarlarını düzenleyin. Ayrıntılar için bkz. API oluşturma.
Konsol üzerinden çağrı
Function Compute konsolundan bir işlevi çağırdığınızda, işlevin çalışması tamamlanana kadar Cancel Request seçeneğine tıklamayın veya tarayıcı sekmesini kapatmayın.
İşlev çalışma süresini azaltma
İşlev beklenenden daha uzun sürüyorsa darboğazı belirlemek için işlev günlüklerinizi inceleyin. En yaygın iki neden G/Ç gecikme süresi ve hesaplama yoğunluklu işlemlerdir.
G/Ç işlemleri
Beklenmeyen gecikme süresinin birincil nedeni ağ G/Ç işlemleridir. Yavaş çağrıyı izole etmek için her harici çağrıdan (veritabanı sorguları, API istekleri, depolama işlemleri) önce ve sonra günlük kaydı ekleyin.
import time, logging
start = time.time()
# Call to external service
response = external_service.query(params)
logging.info(f"External service call took {time.time() - start:.2f}s")
Hesaplama işlemleri
CPU yoğunluklu işlemler de çalışma süresini uzatabilir. Profil oluşturma işlemi bir hesaplama darboğazını doğrularsa işlev için ayrılan CPU teknik özelliklerini artırın.