15 Ocak 2021 Cuma

Yazılım Mimarisi Microservices Architecture - Error Propagation

Giriş
Microservices Best Practices listesi şöyle
1. Have A Domain-Driven Design
2. Do Not Hard-Code values
3. Maintain Logging
4. Versioning
5. Authentication and Authorization
6. Dependency
7. Make Executable Contracts
8. Fault Tolerance
9. Documentation - Swagger veya OpenApi
Loglama
Elimizde şöyle bir çağrı zinciri olsun
Client -> A->B->C
Eğer C servisinde hata olursa ve tüm servisler aynı hata kodunu loglarsa, 3 tane kopya oluşur. Bu yüzden en doğrusu hatayı A servisinde loglamak. Açıklaması şöyle
If something fails, return immediately and don’t log everywhere. Only Log the error, where you initiated the process. So for the above scenario, you should log the error only in service “A”.
Hata Kodunun Değiştirilmesi
Birbirini zincirleme çağıran servislerde, hata kodu döndüren servis varsa, çağrıyı başlatan servis te aynı hata kodunu döndürmelidir. Eğer farklı bir hata kodu döndürülürse sebebi farklı yorumlanabilir.

Servisler hata kodları olarak HTTP Durum Kodları - 5XX SERVER ERROR Kodları kullanabilirler

Fan-Out/Fan-In API Integration Pattern yazısına da bakabilirsiniz.

Örnek - sıralı çağrılar
Elimizde şöyle bir çağrı zinciri olsun. Eğer C DB bakımda olduğu için isteği işleyemezse ve Http kodu 503 - Service Unavailable dönerse ancak B bunu 4XX haline getirirse ve A da 4XX dönerse, bu sefer Client kendi çağrısında bir parametre hatası olduğunu düşünecektir.
Client -> A->B->C->DB
Örnek - fan out çağrılar
Bir servis bir sürü servisi daha çağırıyorsa ve bunların sonuçlarını ayrı ayrı dönebilir. 
Örnek
Çıktı şuna benzer
//response payload from Expedia flights service to Expedia
{
  "httpCode": 200,
    "vendorAndFlights": [
      {
        "vendorName": "United Airline",
        "statusCode": 500,
        "flights": null
      },
      {
        "vendorName": "Cathay Pacific Airways",
        "statusCode": 404,
        "flights": null
      },
      {
        "vendorName": "Emirates",
        "statusCode": 200,
        "flights": 
         [
           {
             "from": ...
             "to": ...
           }
         ]
      }
}

Hiç yorum yok:

Yorum Gönder