İstemci ve sunucular arasındaki çok adımlı eylemlerdeki hataları ele almak için en iyi uygulamalar nelerdir?
API'ime iş ilanlarını yükleyen bir web sitem var, bunu yapmak için birden fazla adım var:
Dosya depolamaya bir logo resmi yükleyin.
İş ilanıyla ilgili verileri bir veritabanına ekleyin.
Üçüncü taraf bir sağlayıcıyla bir ödeme işleyin.
Üçüncü taraf bir sağlayıcı aracılığıyla bir e-posta gönderin.
Genel olarak, burada farklı uygulamalarda başka adımların mevcut olduğunu hayal edebilirsiniz, örneğin bir 3. taraf API'den bazı bilgiler almak, bir ReCAPTCHA'yı doğrulamak, Google Dizin Oluşturma API'sini güncellemek, bir SMS göndermek vb.
Bunların tümü 3. tarafları kullandığından ve API çağrısını gerçekleştiren sunucudan bağımsız olduğundan, bunlardan herhangi biri adımların bir kısmını başarıyla tamamlarken diğerlerini bırakmayabilir (örn. Logo güncellendi ancak ödeme alınmadı).
Sorum şu: İstemciler ve sunucular arasındaki bu tür çok adımlı eylemlerdeki hatalar genellikle üretim sistemlerinde nasıl işlenir? Kabul edilmiş standartlar veya en iyi uygulamalar var mı?
Düşündüm:
Hataları ele almamak ve her şeyin hatasız geçmesini ummak.
Adımların her biri için arka uçta bir 'geri alma' işlevi tanımlama ve adımlardan biri başarısız olursa, bunu önceki adımlarda çağırma. Birçok adımdan oluşan eylemlerle, bu oldukça hızlı bir şekilde spagetti koduna dönüşebilir ve bazı adımlar bu kadar kolay geri alınamaz - örneğin bir e-posta göndermek.
Adımların her biri için arka uçta ayrı bir uç nokta oluşturmak ve müşterinin sırayla her birini aramasına izin vermek. Bu aynı zamanda bir 'geri al' API uç noktası kullanabilir, böylece istemci adımlardan birinde bir hata alırsa önceki tüm adımları geri alabilir. Bu, müşterinin tamamlanan eylemin ilerlemesini tahmin etmesine izin verme avantajına sahiptir, yani kullanıcıya 'tamamlanan 5 adımdan 1'i' görüntüleyebilir.
Her eylem için bir DB'de (veya bellek içi veritabanında?) Bir satır oluşturma ve her adım tamamlandığında ilgili sütunu tamamlandı olarak işaretleyerek. Satırdaki her sütun tamamlandığında, kullanıcıya geri bir yanıt gönderilir.
Yanıtlar
Bu çok adımlı süreç, uygulamanızı (muhtemelen) tutarsız bir durumda bırakan ara adımlarla tutarlı bir başlangıç durumundan ("hiçbir şey olmadı") bir son duruma ("iş ilanı yapıldı") geçen bir işlemdir.
İşlem işlemlerini müşterinize devretmemelisiniz, özellikle de süreci bireysel aramalara bölmemelisiniz (veya ödeme adımını atlayabilir - iş için kötü olabilir).
Bir adım başarısız olursa, devam etmek kesinlikle saçmalıktır, ilk duruma değil, kabul edilebilir bir duruma bir tür geri dönüş yapmanız gerekir. Örneğin, yüklenen görüntüyü dosya deposundan kaldırmak için mutlak bir gerek görmüyorum.
İlk olarak, adımları, ara adımların çoğu kabul edilebilir olacak şekilde düzenlemeye çalışırdım, bu nedenle geri almaya gerek kalmaz.
Zor adımlar kesinlikle ödeme ve e-postadır (işinizi doğru anlarsam).
- Müşterinin e-postaları göndermeden faturalandırılması kötüdür (sahtekarlığa yakın).
- E-postaları ödemeyi almadan göndermek para kaybetmek anlamına gelir (bu sık olmazsa tolere edilebilir). E-postaları gönderildikten sonra kesinlikle geri alamazsınız, ancak ödemeleri geri alabilirsiniz (sağlayıcıyla bağlantınızı tam o anda kaybetmediğiniz sürece).
Harici bağlantılara güvendiğiniz için, işleminizin kısmen tamamlanmasından kesinlikle kaçınmanın bir yolunu görmüyorum, bu yüzden süreci, ara arızalar olacak şekilde tasarlardım.
- ya pek olası değil
- veya tolere edilebilir bir durum bırakın.
Yani ben
- Şu anda çalışır durumda olduklarından ve erişilebilir olduklarından emin olmak için tüm deneysel hizmetlere ping atın
- Dosya depolamaya bir logo resmi yükleyin.
- İş ilanıyla ilgili verileri bir veritabanına ekleyin.
- Üçüncü taraf bir sağlayıcı aracılığıyla bir e-posta gönderin.
- Üçüncü taraf bir sağlayıcıyla bir ödeme işleyin.
Geri alma prosedürü,
- görüntüyü dosya deposundan kaldırın,
- iş ilanını veri tabanından kaldırın,
- e-posta gönderildiyse, ancak ödeme başarısız olduysa: ödeme isteğini daha sonraki bir yeniden deneme için planlayın.
"En iyi" açıkça gereksinimlere bağlıdır. 1 Numara uygulaması açıkça en basit olanıdır ancak hata durumunda işlemler kaybolur / eksik kalır. Belki de bu, iş açısından kabul edilebilir bir değiş tokuştur?
En sağlam çözüm, süreci her adımın bir işlem olduğu bir dizi adıma ayırmaktır. Bir işlem tamamlanır veya başarısız olur ve başarısız olursa güvenli bir şekilde yeniden denenebilir. (Örneğin bir posta veya sms göndermek işlem olacaktır.) Bir veritabanı satırı hangi adımların tamamlandığını izler.
Müşterinin her adımı aramasını istemiyorum. Bu, sıkı bir bağlantı oluşturur ve karmaşıklığı artırır. Müşterinin gerekli tüm verilerle tek bir istek çağırmasını sağlayın, bu da iş akışını başlatır. İlerlemeyi göstermek istiyorsanız istemci, durumu sorgulamak için ayrı, periyodik bir istek gönderebilir.
Geri alma desteği daha karmaşıktır ve (sizin de gözlemlediğiniz gibi) her zaman mümkün değildir. Herhangi bir adım, tüm sürecin reddedilmesi gereken bir şekilde başarısız olabilirse (kredi kartının geçerliliğini yitirmesi gibi), o zaman çok adımlı süreç başlamadan önce bir doğrulama adımında yapılması gerektiğini düşünüyorum . Bu, müşteriye eşzamanlı geri bildirim vermenize ve müşterinin verileri gözden geçirip yeniden girmesine olanak tanır.
Diğerlerinin de belirttiği gibi, ideal olarak, başarılı bir iş ilanı için gerekli tüm parçaları bir araya getirmek ve bir müşterinin bunu tek bir istekte arka ucunuza göndermesini istersiniz. Bir mobil geliştirici olarak, müşterilerin her zaman veri kullanımını ve pil ömrünü korumak için mümkün olan en az işi savunmasını savunuyorum.
Arka uca gelince, önce en önemli bilgileri db'ye eklemeyi ve ardından örneğin bir logo resmi gibi ek bir veri eklemeyi denemeyi öneririm.