7/24 çalışması gereken bir programda istisna işleme


14

Sadece ele alınabilecek istisnaları yakalamamız gerektiğini okudum, bu da temel istisna sınıfını yakalamayı (bu durumda C #) kötü bir fikir (diğer nedenlerin üstünde) haline getiriyor. Şu anda şimdiye kadar yakalanan temel istisna dışında hiçbir şey görmediğim bir projenin parçasıyım. Bunu yapmanın kötü bir uygulama olarak değerlendirildiğinden bahsettim, ancak yanıt "Bu hizmetin 7/24 çalışması gerekiyor, bu şekilde."

7 gün 24 saat çalışması gereken bir programda istisnaların nasıl düzgün bir şekilde ele alınacağı konusunda iyi bir yanıtım olmadığından, şimdi buradayım. "Kritik" programlar / gece gündüz çalışması gereken hizmetlerde istisna işleme ile nasıl başa çıkılacağı hakkında herhangi bir bilgi / öneri bulmayı başaramadım (ve bu durumda hizmet bir dakika kapalı ise tamam olabilir inanıyorum veya iki, bu yüzden kritik değil). Programın doğasına bağlı olduğunu anlıyorum. Hayatı tehdit eden sorunlara neden olabilecek bir programın gereksinimleri, bir çevrimiçi oyunun günlük tarayıcısına kıyasla oldukça farklıdır.

İki örnek:

1: Demiryolları için çevrimiçi arama yaparken kullanılan İngiliz demiryollarının müşterileri için önde gelen bir hizmet.

2: Raylar, trenler vb. Çeşitli sensörlerden sağlanan gerçek zamanlı bilgilere dayanarak yukarıdaki demiryolları için demiryolu anahtarlarını otomatik olarak kontrol eden bir program.

İlk program muhtemelen bir veya iki dakika boyunca düşerse büyük bir soruna neden olmaz, ikincisi insan kayıplarına neden olabilir. Her biri ile nasıl başa çıkılacağına dair öneriler? Bu konu hakkında daha fazla bilgi ve düşünceyi nerede bulabileceğimi gösteren bir işaretçi misiniz?


2
Gerçek zamanlı bir uygulamada (sic!) İstisna işlemleri sırasında gevşeme yığını bir treni mahvedebilir.
Deer Hunter

4
@DeerHunter İstisnasız kötü kodlama, aynı sonuca sahip olabilir.
BЈовић

9
Tamam, sen catch Exception. Bu, programınızın çalıştığı anlamına gelmez , başarısızlıklar, yürütmeye devam ederken uygulama durumunun bozulmasına izin verir, çok daha tehlikeli bir yer. Çökmüş bir program felaket olabilir, ancak geçersiz durumda olan ancak yine de eylem gerçekleştiren bir program aktif olarak felaket olabilir.
Phoshi

1
Uygulamanın 7/24 çalışması gerekiyorsa, bir yerde sonsuz bir döngü vardır ve bu sonsuz döngü, işlenmemiş tüm istisnaları yakalayan bazı yapıların etrafına sarılsa iyi olur. Aksi takdirde, işlenmemiş bir istisna, ana ve kaboom dışındaki mevcut olan tümünü yakala işleyicisine hitap edecektir! 7/24 uygulama sona erer.
David Hammen

Yanıtlar:


7

Gibi belirli dil özellikleri

  • Çöp toplama
  • İstisna Sistemleri
  • Tembel Değerlendirme

gerçek zamanlı bir sistemde genellikle yararlı değildir. Muhtemelen bu özellikleri olmayan bir dil seçmeli ve maksimum bellek kullanımı veya maksimum tepki süresi gibi belirli özellikleri kanıtlamaya çalışmalısınız.


Bir programın sürekli çalışması gerekiyor, ancak kısa ve global olmayan hatalar kabul edilebilir olduğunda, Erlang benzeri bir strateji kullanabiliriz. Erlang, eşzamanlı, işlevsel bir programlama dilidir. Genellikle, Erlang'da yazılmış bir program, birbirleriyle iletişim kurabilen birden çok işçi sürecinden oluşur (aktör modeli). Bir çalışan iş parçacığı bir istisna ile karşılaşırsa, yeniden başlatılır. Bu kısa bir kesinti süresi anlamına gelse de, diğer aktörler her zamanki gibi devam edebilir.

Özetlemek gerekirse: Sağlam bir programda, çeşitli parçalar birbirinden izole edilir ve bağımsız olarak yeniden başlatılabilir veya ölçeklendirilebilir.

Temel olarak buna eşdeğer bir kod parçasına ihtiyacımız var:

while (true) {
  try {
    DoWork();
  }
  catch (Exception e) {
    log(e);
  }
}

artı döngüyü sonlandırmanın bir yolu. Böyle bir döngü daha sonra her bir işçi iş parçacığını yönlendirir.


Hataları bir tümünü yakalama yoluyla yok saymayla ilgili bir sorun, programınızın değişmezlerinin hata nedeni tarafından ihlal edilmiş olabileceği ve sonraki işlemlerin işe yaramayabileceğidir. Buna iyi bir çözüm, bağımsız çalışanlar arasında hiçbir veri paylaşmamaktır. Bir işçiyi yeniden başlatmak, gerekli tüm değişmezleri yeniden oluşturacaktır. Bu, örneğin mesaj gönderimleri yoluyla farklı iletişim kurmaları gerektiği anlamına gelir. Bir aktörün durumu diğer aktörlerin değişmezlerinin bir parçası olmayabilir.

Çok fazla istisna yakalamanın diğer bir sorunu da, bu tür önlemler alınırken bile tüm istisnaların yeniden başlatılarak düzeltilememesidir. Bellek tükeniyor gibi Aksi sert problemler olabilir yeniden başlatarak ele alınması. Ancak yeniden başlatma, fiziksel bir kablo çıkarıldığında İnternet bağlantısını yeniden kazanmanıza yardımcı olmaz.


1
Evet, ancak "fiziksel kablo çıkarıldı" gibi durum, tam olarak istisna günlüğünün birisi kabloyu tekrar takana kadar doldurmasını istediğinizde, daha sonra işler yeniden çalışmaya başlar ve uygulamanın yeniden manuel olarak başlatılmasıyla olur.
Mark Hurd

2

Sorunuzu cevaplamak için, istisnaların ne olduğunu ve nasıl çalıştığını anlamak gerekir.

Bu tür hatalar meydana geldiğinde, kullanıcının yardımının gerekli olduğu durumlarda istisnalar atılır. Bu gibi durumlarda, yığını gevşetmek ve istisnayı işlemek ne kadar zaman alır önemli değildir.

Yakalama işleyicileri olmadan, program yürütmeyi durdurur. Kurulumunuza ve gereksinimlerinize bağlı olarak, kabul edilebilir.

Özel durumlarınızda:

  1. sorgu yürütülemezse (örneğin, yanlış şehir adı), kullanıcıyı hata hakkında bilgilendirin ve düzeltmesini isteyin.
  2. kritik bir sensörden bilgi almıyorsanız, operatörün sorunu düzeltmesini istemeden devam etmenin pek bir anlamı yoktur.

Bu, her iki durumda da, bir RT programında, yürütmeye devam etmenin mümkün olmadığı ciddi sorunları belirtmek için daha fazla dikkat göstererek istisnaların kullanılması mantıklı olabilir.


1

Şimdiye kadar yakalanan temel istisna dışında bir şey görmedim.

Burada bir sorun var gibi görünüyor, istisnalar uygun şekilde ele alınmadığı kadar. İstisnaları uygun noktada yakalamak ve (istisna türüne bağlı olarak) uygun işlemi yapmak, hizmetin çok daha güvenilir bir şekilde çalışmasını sağlayacaktır.

Hizmetin devam etmesi gerekiyorsa, muhtemelen amaçlandığı gibi çalışması önemlidir. Örneğiniz göz önüne alındığında, demiryolu anahtarlarını kontrol eden bir program bir istisna atarsa, güvenlikle ilgili sensörlerle iletişimde bir sorun olduğunu gösterebilir. Temel istisnayı yakalar ve devam ederseniz hizmet çalışabilir, ancak felakete yol açacak şekilde çalışmayabilir.

Alternatif olarak, sensörle bir iletişim hatası olduğunda atılan istisnayı yakalar ve uygun şekilde başa çıkarırsanız (yani, etkilenen bölgedeki trenleri durdurun) hizmetiniz çalışıyor demektir ve kimseyi öldürmediniz.

Bu nedenle, soruyu anladığım gibi, ilk durumda, temel istisna türü işleyicileri kaldırmak yerine daha spesifik istisna işleme eklemek daha iyi olacağını öneririm.


0

2. nokta ile ilgili olarak: C # kullanmayın. Bu bir gerçek zamanlı dil değildir ve olacak aşağıdakiler gibi kullanmaya çalışırsanız acı olsun.

1. nokta için: erlang yoluna gidebilirsiniz: çökmesine izin verin, ardından yeniden başlatın


C # kullanımım ve uzmanlığım 2. noktaya yakın değil (gerçek zamanlı parça değiştirme). C # neden böyle bir görev için bu kadar uygun değil merak ediyorum?
Michael O'Neill

1
Çoğunlukla: çöp toplayıcı zamanla ilgili program davranışını öngörülemez yapar. Ayrıca, çalışma zamanı çok karmaşık ve bu bağlamlarda basit şeylere ihtiyacınız var, daha tahmin edilebilirler
miniBill

0

Declaimer: Bunlar sadece düşünceler, deneyimim yok.

İkinci örneğin gereksinimlerini karşılayan bir programın son derece modüler olması gerektiğini tahmin ediyorum . Sonuç olarak, modüller sistemi dengesizleştirmeden yeniden başlatılabilecektir.

Örneğin, iç devlet için bir iddiada bulunmayan bir nesne, süreçte tüm tüketicilerini ve tedarikçilerini bilgilendirerek yok edilebilir ve yeniden yaratılabilmelidir. Daha somut olarak, program demiryolunun anahtarlarını kontrol ediyorsa ve karar döngüsünde bir iddiada başarısız olursa, yine de dahil olan tüm trenleri durduran ve ana karar modülünün yeniden başlatılmasını bekleyen bir acil durum modülü çalıştırabilir.

Daha gerçekçi bir getirecek fazlalık - donanım ve yazılım tekrarını. Bir örnek denetlenen sisteme bağlanır ve diğeri serbest çalışır. Bir hata algılanırsa, sistemler değiştirilir.

Bir örnek, aynı makinede birbirini izleyen iki işlemdir ve biri öldürülürse, diğeri yeniden ortaya çıkar ve ana PID'sini kendisinden ayırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.