Haruskah kita merancang program untuk bunuh diri secara acak? [Tutup]


76

Singkatnya, haruskah kita merancang kematian ke dalam program, proses, dan utas pada tingkat rendah, untuk kebaikan sistem secara keseluruhan?

Kegagalan terjadi. Proses mati. Kami merencanakan bencana dan sesekali pulih dari itu. Tetapi kami jarang merancang dan mengimplementasikan program kematian yang tidak dapat diprediksi. Kami berharap bahwa uptime layanan kami selama kami peduli untuk tetap beroperasi.

Contoh makro dari konsep ini adalah Netflix's Chaos Monkey , yang secara acak mengakhiri instance AWS dalam beberapa skenario. Mereka mengklaim bahwa ini telah membantu mereka menemukan masalah dan membangun sistem yang lebih berlebihan.

Yang saya bicarakan adalah level yang lebih rendah. Idenya adalah untuk proses lama secara tradisional untuk secara acak keluar. Ini harus memaksa redundansi ke dalam desain dan pada akhirnya menghasilkan sistem yang lebih tangguh.

Apakah konsep ini sudah memiliki nama? Apakah sudah digunakan di industri?

SUNTING

Berdasarkan komentar dan jawaban, saya khawatir saya tidak jelas dalam pertanyaan saya. Untuk kejelasan:

  • ya, maksud saya secara acak,
  • ya, maksud saya dalam produksi, dan
  • tidak, tidak hanya untuk pengujian.

Untuk menjelaskan, saya ingin menggambar analogi dengan organisme multiseluler.

Di alam, organisme terdiri dari banyak sel. Sel-sel bercabang sendiri untuk membuat redundansi, dan mereka akhirnya mati. Tetapi harus selalu ada sel yang cukup dari jenis yang tepat bagi organisme untuk berfungsi. Sistem yang sangat berlebihan ini juga memfasilitasi penyembuhan saat terluka. Sel-sel mati sehingga organisme hidup.

Memasukkan kematian acak ke dalam suatu program akan memaksa sistem yang lebih besar untuk mengadopsi strategi redundansi agar tetap layak. Apakah strategi yang sama ini membantu sistem tetap stabil dalam menghadapi jenis kegagalan lain yang tidak dapat diprediksi?

Dan, jika ada yang mencoba ini, apa namanya? Saya ingin membaca lebih lanjut tentang itu jika sudah ada.


13
Saya tidak punya sesuatu yang berguna untuk disumbangkan sebagai jawaban, tetapi ini jelas pertanyaan yang menarik. Itu pasti akan memaksa seorang programmer untuk menulis arsitektur komponen yang layak yang (dengan benar) mengatasi kegagalan komponen acak jika kegagalan tersebut dijamin oleh sifat komponen itu sendiri.
Tom W

1
Jika saya mengerti dengan benar, ini mungkin sedikit terkait: en.wikipedia.org/wiki/Mutation_testing . Sementara pengujian mutasi membantu mengeraskan pengujian Anda, saya pikir Anda sedang mencari pendekatan berbasis keacakan untuk membantu mengeraskan kode Anda.
MetaFight

10
Sebenarnya, konsep ini setua komputasi, digunakan di setiap program, dan tentu saja memiliki nama: itu disebut: bug .
mouviciel

3
Anda tidak akan menyebut implementasi protokol komunikasi yang diuji jika Anda tidak mengujinya melalui jaringan yang tidak dapat diandalkan, yang harus disimulasikan, karena peralatan Anda dapat diandalkan.
Kaz

5
Microsoft telah mencobanya untuk sementara waktu, mereka menyebutnya dengan nama sandi "Windows". Jika telah menghasilkan strategi yang lebih baik masih bisa diperdebatkan ... mungkin malah menghasilkan harapan yang lebih rendah.

Jawaban:


60

Tidak.

Kita harus merancang penanganan jalur buruk yang tepat, dan merancang uji kasus (dan peningkatan proses lainnya) untuk memvalidasi bahwa program menangani kondisi luar biasa ini dengan baik. Hal-hal seperti Chaos Monkey dapat menjadi bagian dari itu, tetapi segera setelah Anda membuat "harus crash secara acak" persyaratan crash nyata yang sebenarnya menjadi hal yang tidak dapat diajukan penguji sebagai bug.


10
Terima kasih @ Telastyn. Penyebab kecelakaan bisa menjadi faktor di sini, saya pikir. Kecelakaan kematian yang disengaja dapat memiliki efek samping (log, kode kesalahan, sinyal) yang membedakannya dari kegagalan kode.
jimbo

1
Bahkan jika itu membantu mengungkap kelemahan, itu tidak berarti itu bisa ditindaklanjuti. Risiko (kemungkinan dan tingkat konsekuensi) pengulangan adalah faktor yang signifikan, apakah Anda melakukan sesuatu dengan bug itu untuk mengurangi kejadian di masa depan. Ini adalah alat nilai jangka panjang untuk sistem berisiko tinggi.
JustinC

Idenya adalah bahwa meskipun sub-komponen macet secara acak, pengguna seharusnya tidak memperhatikan. Jadi ketika seorang penguji melaporkan bahwa salah satu crash acak terlihat oleh mereka, itu berarti kegagalan menangkap crash sub-komponen yang akan menjadi bug yang dapat diarsipkan.
Philipp

1
Apa yang diusulkan sebenarnya adalah ujian langsung penanganan jalur buruk. Banyak penyebaran, dan contoh Netflix adalah contohnya, memerlukan pengujian beban realistis yang dalam banyak kasus hanya layak selama penyebaran aktual. Kecelakaan terprogram akan sangat mudah dideteksi dengan logging yang jelas - yang menarik adalah kerusakan jaminan dan efek pada sistem yang saling terkait.
ctpenrose

1
Anda dapat menerapkan crasher acak pintar (seperti Chaos Monkey) yang memberi tahu Anda ketika sebuah program macet secara acak. Dengan begitu Anda tahu kapan Anda mengalami crash yang sah dan kapan itu crash pengujian stabilitas.
Zain R

19

Proses memperkenalkan cacat dalam perangkat lunak atau perangkat keras untuk menguji mekanisme toleransi kesalahan disebut injeksi kesalahan .

Dari Wikipedia:

Teknik injeksi kesalahan tanggal kembali ke tahun 1970-an ketika pertama kali digunakan untuk menginduksi kesalahan pada tingkat perangkat keras. Jenis injeksi kesalahan ini disebut Hardware Implemented Fault Injection (HWIFI) dan berupaya mensimulasikan kegagalan perangkat keras dalam suatu sistem. Percobaan pertama dalam injeksi kesalahan perangkat keras melibatkan tidak lebih dari koneksi korslet pada papan sirkuit dan mengamati efek pada sistem (menjembatani kesalahan). Itu digunakan terutama sebagai tes ketergantungan sistem perangkat keras. Belakangan perangkat keras khusus dikembangkan untuk memperluas teknik ini, seperti perangkat untuk membombardir area tertentu dari papan sirkuit dengan radiasi besar. Segera ditemukan bahwa kesalahan dapat disebabkan oleh teknik perangkat lunak dan bahwa aspek teknik ini dapat berguna untuk menilai sistem perangkat lunak.


+ Cocok sebagai pengujian stres tingkat kedua. Setelah tes stres yang dibuat telah lulus [ke tingkat yang memuaskan], masukkan beberapa keacakan untuk memastikan perubahan lingkungan yang tidak terduga tidak bencana. Ini bisa berharga ketika kegagalan berisiko tinggi (kemungkinan atau keparahan akibatnya). Saya tidak akan menyebarkan untuk hidup sampai saya sangat percaya diri dalam lingkungan laboratorium, dan kemudian hanya secara bertahap untuk bagian-bagian yang paling saya percayai.
JustinC

9

Iya. Tidak, mungkin.

Pemutusan periodik adalah pedang bermata dua. Anda akan mendapatkan pukulan dengan satu sisi atau yang lain, dan yang lebih rendah dari dua kejahatan tergantung pada situasi Anda.

Satu sisi adalah keandalan: Jika Anda memaksa program untuk mengakhiri secara acak (atau dapat diprediksi) dan dengan cara yang teratur, Anda dapat dipersiapkan untuk acara itu dan menanganinya. Anda dapat menjamin bahwa proses akan keluar saat tidak sibuk melakukan sesuatu yang bermanfaat. Ini juga menjamin bahwa bug yang akan memanifestasikan diri mereka di luar jangka waktu sanksi tidak akan memundurkan kepala jelek mereka dalam produksi, yang merupakan hal yang baik. Apache HTTPD memiliki pengaturan yang akan memungkinkan Anda menyesuaikan berapa banyak permintaan proses anak (atau utas dalam versi yang lebih baru) akan ditayangkan sebelum diakhiri.

Sisi lain juga reliabilitas: Jika Anda tidak membiarkan program berjalan lama, Anda tidak akan pernah menemukan bug yang muncul dengan sendirinya seiring waktu. Ketika akhirnya Anda menemukan salah satu bug itu, kemungkinan besar program akan mengembalikan jawaban yang salah atau gagal mengembalikannya sama sekali. Lebih buruk lagi, jika Anda menjalankan banyak utas dari pekerjaan yang sama, bug yang diinduksi waktu atau hitungan dapat memengaruhi sejumlah besar tugas sekaligus dan mengakibatkan perjalanan jam 3 pagi ke kantor.

Dalam pengaturan di mana Anda menjalankan banyak utas yang sama (misalnya, pada server web), solusi praktisnya adalah dengan mengambil pendekatan campuran yang menghasilkan tingkat kegagalan yang dapat diterima. Jika Anda menjalankan 100 utas, menjalankan rasio pendek-ke-panjang dari 99: 1 berarti hanya satu yang akan menunjukkan bug jangka panjang sementara yang lain terus melakukan apa pun yang mereka lakukan tanpa gagal. Bandingkan dengan menjalankan 100% lama, di mana Anda menjalankan risiko yang jauh lebih tinggi karena semua utas gagal pada saat yang sama.

Di mana Anda memiliki utas tunggal, mungkin lebih baik membiarkannya berjalan dan gagal, karena waktu mati selama restart dapat mengakibatkan latensi yang tidak diinginkan ketika ada pekerjaan nyata untuk dilakukan yang akan selesai dengan sukses.

Dalam kedua kasus, penting bahwa ada sesuatu yang mengawasi proses sehingga mereka dapat segera dimulai kembali. Juga, tidak ada undang-undang yang mengatakan keputusan awal Anda tentang berapa lama suatu proses harus dijalankan. Mengumpulkan data operasional akan membantu Anda menyesuaikan sistem Anda untuk menjaga kegagalan hingga tingkat yang dapat diterima.

Saya akan merekomendasikan untuk tidak melakukan penghentian acak, karena itu membuatnya lebih sulit untuk mengatasi bug yang berhubungan dengan waktu. Chaos Monkey melakukannya untuk memastikan perangkat lunak pengawas bekerja, yang merupakan masalah yang sedikit berbeda.


Jika Anda membunuh proses setelah interval waktu acak yang membentang hingga tak terbatas, maka beberapa proses akan hidup selamanya. Karena itu saya tidak berpikir bahwa proses pembunuhan secara acak tidak kompatibel dengan mendeteksi masalah dengan proses yang berumur panjang.
Joeri Sebrechts

9

Apakah maksud Anda benar-benar acak? Memiliki perangkat lunak Anda secara acak membunuh sendiri terdengar seperti ide yang buruk. Apa gunanya?

Saya menduga apa yang Anda maksudkan adalah bahwa kita harus realistis tentang thread / proses yang berjalan lama dan menerima bahwa semakin lama mereka berjalan, semakin besar kemungkinan mereka akan menemukan semacam bug tersembunyi, dan masuk ke non-fungsional negara. Jadi, sebagai langkah pragmatis murni, masa proses dan utas harus dibatasi.

Saya percaya bahwa pada akhir 90-an server web Apache menggunakan sesuatu seperti ini. Mereka memiliki kumpulan proses pekerja (bukan benang) dan setiap proses pekerja akan terbunuh setelah masa hidup yang tetap. Ini membuat server tidak dimonopoli oleh proses pekerja yang terjebak dalam beberapa kondisi patologis.

Saya belum pernah bekerja di daerah itu untuk beberapa waktu, jadi saya tidak tahu apakah ini masih terjadi.


6
IIS memiliki restart secara berkala dibangun ke UI manajemen dan diaktifkan secara default. Ada juga pemicu pembatasan memori dan cpu, tetapi yang berbasis waktu selalu mengejutkan saya.
Mark Brackett

3
Hingga hari ini, solusi youtube untuk kebocoran memori python adalah dengan hanya memulai kembali prosesnya.
Xavi

3
Saya tidak berpikir OP bertanya tentang membunuh program untuk mengembalikannya ke keadaan berfungsi dengan baik, tetapi untuk membunuh program untuk menguji kemampuan sistem untuk mengatasi kematiannya dan untuk setiap eksekusi berikutnya dari program untuk menangani sisa.
mowwwalker

1
@ MarkBrackett Sayangnya, restart berkala tampaknya melayani tujuan yang berlawanan dengan membuat programer santai tentang kode buruk. Jika masalah yang disebabkan oleh kode buruk adalah rasa sakit di leher untuk memperbaikinya, kita akan cenderung untuk menulis kode buruk.
Anthony

+1. Acak itu buruk. Menurut definisi, sedemikian rupa sehingga Anda tidak dapat memprediksi perilakunya. Bahkan jika Anda meletakkannya di sana untuk tujuan menutup program setiap sekarang, mungkin saja itu tidak selesai, menjadi acak seperti itu, sehingga mengalahkan tujuan untuk membuatnya di sana untuk memulai. Memiliki proses yang dekat pada momen yang dapat diprediksi mungkin lebih mudah bagi programmer dan juga pemasar yang mencoba untuk menjual fitur tertentu .. "Ya, itu benar. Itu ditutup pada saat-saat acak! Tidak, Ini fitur! Halo? Halo ?!"
Neil

7

Masalah yang saya lihat adalah bahwa jika program seperti itu mati, kita hanya akan mengatakan "Oh itu hanya penghentian acak - tidak ada yang perlu dikhawatirkan". Tetapi bagaimana jika ada masalah nyata yang perlu diperbaiki? Itu akan diabaikan.

Program yang sudah "acak" gagal karena pengembang membuat mystaykes, bug membuatnya menjadi sistem produksi, kegagalan perangkat keras, dll. Ketika hal ini terjadi, kami ingin mengetahuinya sehingga kami dapat memperbaikinya. Merancang kematian ke dalam program hanya meningkatkan kemungkinan kegagalan dan hanya akan memaksa kita untuk meningkatkan redundansi, yang membutuhkan biaya.

Saya melihat tidak ada yang salah dengan membunuh proses secara acak di lingkungan pengujian ketika menguji sistem yang berlebihan (ini harus terjadi lebih dari itu) tetapi tidak dalam lingkungan produksi. Apakah kita akan mengeluarkan beberapa hard drive dari sistem produksi langsung setiap beberapa hari, atau menonaktifkan salah satu komputer di pesawat karena itu terbang penuh penumpang? Dalam skenario pengujian - baik. Dalam skenario produksi langsung - saya lebih suka tidak.


Jika Anda akan menerapkan penghentian acak, Anda tentu akan mencetak pesan log "sekarang saya mengakhiri" sehingga Anda dapat membedakan penghentian acak yang disengaja dari bug. ;-) Juga, memulai kembali salah satu dari beberapa proses sesekali tidak akan memerlukan lebih banyak reduksi seperti yang seharusnya Anda lakukan.
Hans-Peter Störr

4

Menambahkan kode keluar acak ke aplikasi seharusnya tidak perlu. Penguji dapat menulis skrip yang secara acak membunuh proses aplikasi.

Dalam jaringan, perlu untuk mensimulasikan jaringan yang tidak dapat diandalkan demi menguji implementasi protokol. Ini tidak dibangun ke dalam protokol; dapat disimulasikan pada tingkat driver perangkat, atau dengan beberapa perangkat keras eksternal.

Jangan menambahkan kode tes lakukan program untuk situasi yang dapat dicapai secara eksternal.

Jika ini dimaksudkan untuk produksi, saya tidak percaya ini serius!

Pertama, kecuali proses keluar secara tiba-tiba sehingga transaksi yang sedang berlangsung dan data volatile hilang, maka itu bukan implementasi konsep yang jujur. Pintu keluar yang terencana dan anggun, meskipun waktunya acak, tidak cukup membantu mempersiapkan arsitektur untuk menghadapi tabrakan nyata, yang tidak anggun.

Jika malfungsi nyata atau realistis dibangun ke dalam aplikasi mereka dapat mengakibatkan kerugian ekonomi, seperti kerusakan nyata, dan kerugian ekonomi yang disengaja pada dasarnya adalah tindakan kriminal hampir secara definisi.

Anda mungkin dapat lolos dari klausul dalam perjanjian lisensi yang membebaskan tanggung jawab perdata dari segala kerusakan yang timbul dari pengoperasian perangkat lunak, tetapi jika kerusakan itu terjadi karena desain, Anda mungkin tidak dapat melepaskan tanggung jawab pidana.

Jangan pernah berpikir tentang aksi seperti ini: membuatnya bekerja sekuat yang Anda bisa, dan memasukkan skenario kegagalan palsu hanya ke dalam bangunan atau konfigurasi khusus.


Ini harus menjadi jawaban yang diterima IMO. SRP berlaku di sini.
user408866

Sayangnya, saya tidak bermaksud hanya untuk pengujian. Saya akan memperluas pertanyaan untuk menjelaskan.
jimbo

Jika Anda melakukannya dengan benar, crash acak (dan tidak anggun!) Ini tidak akan membahayakan sama sekali. Itulah intinya: seiring waktu Anda dapat menyingkirkan semua kasus tepi di mana kerusakan terjadi; beberapa di antaranya tidak akan pernah Anda lihat di mesin uji. Dan jika kadang-kadang crash nyata terjadi Anda juga tidak akan mengalami kesulitan. Saya tidak pernah mencoba ini, tetapi tampaknya masuk akal bagi saya dalam beberapa keadaan. Tentu saja ini adalah sesuatu yang perlu menjadi fitur resmi dari aplikasi, bukan sesuatu yang menyelinap masuk.
Hans-Peter Störr

3

Anda mungkin ingin mencari " pemulihan proaktif " dan " peremajaan " dalam konteks sistem terdistribusi toleransi kesalahan, untuk menangani kesalahan sewenang-wenang (yaitu, tidak hanya proses macet, tetapi data rusak dan perilaku berbahaya juga). Ada banyak penelitian tentang seberapa sering dan dalam kondisi apa suatu proses (dalam arti abstrak, sebenarnya bisa berupa VM atau host) dimulai kembali. Secara intuitif, Anda dapat memahami keuntungan dari pendekatan ini karena lebih suka berurusan dengan proses mati daripada dengan proses pengkhianat ...


2

Ini benar-benar tidak berbeda dengan pengujian. Jika Anda merancang solusi failover yang selalu tersedia (seperti Netflix), maka ya - Anda harus mengujinya. Saya tidak tahu bahwa pintu keluar acak yang ditaburkan di seluruh basis kode adalah cara yang tepat untuk mengujinya. Kecuali jika Anda benar-benar berniat menguji bahwa desain Anda tangguh untuk menembak diri sendiri, sepertinya akan lebih tepat untuk mengujinya dengan memanipulasi lingkungan di sekitar kode dan memverifikasi bahwa perilakunya berperilaku tepat.

Jika Anda tidak merancang sistem yang berlebihan, maka tidak - Anda tidak harus menambahkan fitur itu karena Anda menambahkan beberapa pintu keluar acak. Anda hanya harus menghapus pintu keluar acak, dan kemudian Anda tidak akan memiliki masalah itu. Lingkungan Anda mungkin masih gagal pada Anda, pada titik mana Anda akan mencatatnya sebagai tidak didukung / tidak akan memperbaiki atau mengeraskan kode Anda terhadap kegagalan itu dan menambahkan tes untuk itu. Lakukan itu cukup sering, dan Anda akan menyadari bahwa Anda sebenarnya sedang merancang sistem yang berlebihan - lihat skenario # 1.

Pada titik tertentu, Anda dapat menentukan bahwa Anda tidak lagi yakin apa kegagalan itu atau tidak ditangani. Sekarang Anda dapat mulai menarik karpet secara acak untuk mendeteksi titik kegagalan.

Satu-satunya hal yang menarik tentang contoh Netflix adalah mereka menjalankan tes ini dalam produksi. Itu masuk akal - beberapa bug benar-benar hanya produksi hal-hal yang sangat sulit atau tidak mungkin untuk disimulasikan di lingkungan yang terisolasi. Saya menduga bahwa Netflix menghabiskan waktu yang lama di lingkungan pengujian sebelum mereka cukup nyaman untuk melakukan ini dalam produksi. Dan sebenarnya yang mereka lakukan adalah mencoba agar crash terjadi selama jam kerja, yang masuk akal bagi pasar mereka tetapi tidak untuk banyak orang lain.


2

Istilah yang Anda cari baru-baru ini diciptakan oleh Nassim Nicholas Taleb: Antifragility. Bukunya Antifragile pasti direkomendasikan. Itu hampir tidak menyebutkan IT, tetapi paralel, jelas tak terucapkan paling menginspirasi. Idenya adalah untuk memperluas skala antifragile rapuh <-> kuat ke rapuh <-> kuat. Istirahat rapuh dengan acara acak, mengelola kuat dengan acara acak dan keuntungan anti-rapuh dengan acara acak.


1

Tergantung. Saya telah memperhatikan bahwa programmer cenderung terlalu generalisasi teknik yang berlaku untuk domain spesifik mereka mengabaikan semua yang lain. Misalnya, merilis program dengan biaya memperbaiki semua bug mungkin baik ... kecuali Anda memprogram pengontrol pesawat, reaktor nuklir, dll. "Jangan mengoptimalkan - biaya programmer lebih besar daripada biaya menjalankan program" tidak diperlukan berlaku untuk HPC karena ada program yang relatif sederhana dapat menempati cluster selama berbulan-bulan dll. (atau bahkan program populer yang digunakan oleh sejumlah besar pengguna). Jadi, bahkan jika perusahaan X melakukan Y untuk alasan yang sangat baik Anda tidak perlu mengikuti jejak mereka karena situasi Anda mungkin berbeda.

Biasanya rutinitas penanganan kesalahan adalah bagian yang paling diuji dari kode - sementara tampaknya sederhana sulit untuk mensimulasikan bahwa ada memori tidak mencukupi atau beberapa file penting tidak ada. Untuk alasan itu saya membaca teks yang diusulkan untuk kernel Unix gagal secara acak beberapa panggilan sistem. Namun itu akan membuat program sederhana lebih sulit untuk ditulis (jika saya perlu menyambungkan 3 C ++ libraries bersama untuk menjalankan program pada 2 file setelah saya tidak ingin repot dengan penanganan kesalahan). Bahkan dengan pengecualian, GC Anda perlu memastikan bahwa Anda meninggalkan keadaan yang konsisten (bayangkan pengecualian di tengah menambahkan node ke daftar tertaut).

Semakin banyak layanan terdistribusi yang Anda miliki semakin banyak kegagalan adalah pertanyaan tentang "seberapa sering" maka "jika" atau "kapan". Di pusat data, penggantian disk di RAID adalah bagian dari operasi rutin dari apa yang saya ketahui - bukan kegagalan yang tidak terduga. Jika Anda beroperasi dalam skala besar, Anda perlu memperhitungkannya meskipun kemungkinan kegagalan satu komponen kecil, kemungkinan ada sesuatu yang gagal.

Saya tidak tahu apa yang sebenarnya Anda lakukan tetapi untuk mengetahui apakah itu layak, Anda perlu berpikir jika kegagalan adalah sesuatu yang perlu Anda perhitungkan (karena mengabaikan biayanya) atau itu adalah sesuatu yang terlalu mahal untuk dianalisis (seperti mengambil kesalahan memperhitungkan waktu pengembangan biaya).


"Pemrogram cenderung menggeneralisasi secara berlebihan teknik yang berlaku untuk domain spesifik mereka" Saya ingin membingkai kutipan ini dan menggantungnya di dinding. Ini sangaaaat benar, dan bukan hanya perangkat lunak tetapi kehidupan secara umum.
Mark E. Haase

1

Server IIS memiliki fitur yang dapat dikonfigurasi yang secara otomatis mendaur ulang proses pekerja baik setelah mereka menggunakan sejumlah memori atau setelah melayani sejumlah permintaan tertentu atau setelah mereka hidup untuk rentang waktu tertentu. ( http://msdn.microsoft.com/en-us/library/ms525803(v=vs.90).aspx ) dan ( http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/ 1652e79e-21f9-4e89-bc4b-c13f894a0cfe.mspx? Mfr = true )

Ketika wadah seperti IIS melakukannya, masuk akal untuk melindungi server dari proses jahat. Namun saya lebih suka untuk mematikan ini, karena tidak masuk akal jika Anda telah cukup menguji kode Anda.

Kami sudah bekerja pada lapisan yang tidak dapat diandalkan (perangkat keras, jaringan) jadi saya tidak akan pernah menulis kode apa pun yang secara acak membunuh utasnya atau memprosesnya dengan sengaja. Pembunuhan acak juga merupakan ide buruk dari perspektif ekonomi - tidak ada yang akan menggunakan API saya jika mereka pikir saya telah memprogramnya untuk crash secara acak. Terakhir, jika saya mengkonsumsi API atau menggunakan sistem dengan utas macet secara acak, saya harus menghabiskan banyak uang untuk membuat mekanisme pemantauan yang cukup kuat sehingga saya bisa tidur nyenyak di malam hari.

Sebaliknya Jika saya sedang mengembangkan suatu sistem atau API saya akan menulis skrip atau menggunakan harness yang akan melakukan ini murni untuk menekankan menguji ketahanan sistem. Dan saya akan melakukan uji coba seperti itu pada semua build untuk mengidentifikasi build yang buruk. Namun, sementara ini akan menjadi tes yang diperlukan, itu tidak akan pernah menjadi tes "cukup".


1

Ada literatur terkait ide ini, yang disebut Crash-Only software (juga Recovery Oriented Computing) dan Anda dapat mulai dengan kertas usenix ini oleh Candea & Fox dari tahun 2003. Daripada membunuh secara acak, penulis berpendapat Anda dapat meningkatkan keandalan sistem hanya dengan pernah menghentikan program Anda dengan membunuhnya, sehingga memiliki saklar pembunuh tunggal sebagai tombol mematikan dan satu jalur start-up yang dijalankan dengan baik untuk pemulihan.

Meskipun saya tidak yakin seberapa baik ide itu tertangkap, beberapa teknik spesifik tetap bermanfaat. Misalnya tidak mempercayai perangkat lunak Anda untuk dapat mematikan dirinya sendiri ketika diminta dan menggunakan program pengawasan khusus (misalnya, pengawas, dll.), Dan juga berpikir dengan hati-hati tentang status program yang penting dan memastikannya dicatat pada waktu yang tepat di penyimpanan data yang dirancang untuk mengaktifkan pemulihan (mis. database sql).


2
tautan basi. Jawaban Anda akan lebih kuat jika Anda merangkum poin-poin kunci dari perangkat lunak hanya crash dalam jawaban Anda.

1

Benar-benar acak, tidak. Tapi itu mungkin ide yang bagus untuk proses / utas yang berjalan lama untuk keluar / memulai kembali pada interval tertentu, atau setelah menganggur selama durasi tertentu (tetapi tergantung pada kriteria tertentu), atau setelah menjalankan jenis tugas tertentu. Proses yang berjalan lama membangun keadaan tak terhindarkan termasuk hal-hal basi, mungkin bisa bertahan pada memori mencegah ruang swap untuk dirilis, yang semuanya mendapatkan (atau harus mendapatkan) dibersihkan ketika mereka keluar, meningkatkan stabilitas sistem umum.


1

Itu tergantung pada jenis aplikasi yang Anda desain.

Kecelakaan acak adalah cara terbaik untuk menguji dan meningkatkan kekokohan sistem terdistribusi (jaringan).

Dalam contoh Netflix, ketika program Anda bergantung pada layanan jarak jauh yang dapat gagal karena berbagai alasan yang di luar kendali Anda (hard disk memburuk, kehilangan daya, meteor menabrak pusat data, dll). Layanan Anda harus tetap berjalan entah bagaimana.

Bagaimana kamu melakukannya? Menambahkan redundansi dan penskalaan adalah solusi umum.

Misalnya, jika mouse mengunyah melalui kabel daya server Anda maka layanan Anda harus memiliki beberapa solusi untuk terus berjalan. Misalnya dapat menyimpan server cadangan berlebihan yang akan mulai digunakan.

Namun, jika program Anda adalah aplikasi proses tunggal yang tidak beroperasi dalam jaringan, maka mematikannya sendiri tidak akan menguji apa pun karena tidak ada cara untuk memulihkannya.

Berikut ini beberapa komentar tambahan tentang konsep Chaos Monkeys http://www.codinghorror.com/blog/2011/04/working-with-the-chaos-monkey.html


1

Ada kemungkinan bahwa flip bit acak terjadi karena radiasi kosmik . Masalah ini dikenali, dan berbagai teknik dikembangkan untuk mencegah terjadinya flipping bit.

Namun, tidak mungkin untuk memperbaikinya 100%, dan kerusakan memori masih dapat menyebabkan masalah, dan masalah ini masih terjadi ( dengan probabilitas sangat rendah ).

Sekarang untuk menjawab pertanyaan Anda. Apakah Anda perlu merancang sistem yang sangat kuat, itu tergantung pada apa yang Anda lakukan. Jika Anda perlu membuat pesawat ruang angkasa, lebih baik Anda membuatnya menjadi sangat kuat, dan kemudian Anda harus memperhitungkan setiap masalah yang mungkin terjadi.

Jika Anda perlu merancang aplikasi desktop biasa, maka Anda harus melihat crash secara acak sebagai bug dalam kode Anda.


0

Ini sepertinya tidak masuk akal dari sebuah ide.

OS Android secara acak membunuh dan memulai ulang aplikasi / layanan pengguna setiap saat. Dalam pengalaman saya, itu pasti membantu saya berpikir lebih dalam tentang kondisi kesalahan serta merancang arsitektur yang lebih kuat.


4
Tindakan Android tidak acak, tetapi aktivitas harus dapat menyelamatkan keadaan saat diminta. Ada perbedaan yang halus, tetapi penting.
Blrfl

Dari apa yang saya baca tidak ada jaminan bahwa onDestroy, onPause, onSaveInstanceState, dll ... akan pernah disebut pada Kegiatan atau layanan. Pada tingkat aplikasi bahkan tidak ada onDestorypanggilan balik. Jadi ya ada beberapa pengait untuk shutdown yang anggun, tetapi Anda masih harus bersiap untuk keluar secara acak.
Xavi

Anda dijamin akan menelepon onPause()sebelum aktivitas terbunuh. Setelah Honeycomb, Anda dijamin plus itu onStop(). Aplikasi Android hanyalah kumpulan aktivitas yang terkait dan tidak ada konsep tingkat aplikasi apa pun sejauh menyangkut siklus hidup eksekusi.
Blrfl

Ahh baik untuk tahu.
Xavi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.