Saya menggunakan storm untuk memproses masalah online, tetapi saya tidak mengerti mengapa storm memutar ulang Tuple dari spout . Mencoba ulang apa yang crash mungkin lebih efektif daripada memutar ulang dari root bukan? Adakah yang bisa membantu saya? Terima kasih
Mengapa storm memutar ulang tupel dari cerat alih-alih mencoba lagi pada komponen yang mogok?
Jawaban (2)
Implementasi spout pada umumnya hanya akan memutar ulang tupel FAILED
. Seperti yang dijelaskan di sini tupel yang dipancarkan dari cerat dapat memicu ribuan tupel lainnya dan badai menciptakan pohon dari Tuple berdasarkan itu. Sekarang sebuah tuple disebut "sepenuhnya diproses" ketika setiap pesan di pohon telah diproses. Saat memancarkan cerat, tambahkan message id
yang digunakan untuk mengidentifikasi tupel di fase selanjutnya. Ini disebut penahan dan dapat dilakukan dengan cara berikut
_collector.emit(new Values("field1", "field2", 3) , msgId);
Sekarang dari tautan yang diposting di atas tertulis
Sebuah tupel dianggap gagal jika pohon pesannya gagal diproses sepenuhnya dalam waktu tunggu yang ditentukan. Batas waktu ini dapat dikonfigurasi berdasarkan topologi tertentu menggunakan konfigurasi Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS dan defaultnya adalah 30 detik.
Jika waktu tupel habis, Storm akan memanggil metode FAIL
pada spout dan jika berhasil, metode ACK
akan dipanggil.
Jadi pada titik ini storm akan memberi tahu Anda tupel mana yang gagal diproses tetapi jika Anda melihat kode sumbernya Anda akan melihat bahwa implementasi metode fail
kosong di kelas BaseRichSpout
, jadi Anda perlu menggantinya Metode gagal BaseRichSpout agar memiliki kemampuan memutar ulang di aplikasi Anda.
Pemutaran ulang tupel yang gagal seharusnya hanya mewakili sebagian kecil dari keseluruhan lalu lintas tupel, sehingga efisiensi dari kebijakan pemutaran ulang dari awal yang sederhana ini biasanya tidak menjadi perhatian.
Mendukung "langkah pemutaran ulang dari kesalahan" akan menimbulkan banyak kerumitan karena lokasi kesalahan terkadang sulit ditentukan dan akan ada kebutuhan untuk mendukung "pemutaran ulang di tempat lain" jika node cluster tempat kesalahan terjadi saat ini (atau secara permanen) turun. Hal ini juga akan memperlambat eksekusi seluruh lalu lintas yang mungkin tidak akan dikompensasi oleh efisiensi yang diperoleh dari penanganan kesalahan (yang, sekali lagi, diasumsikan jarang dipicu).
Jika menurut Anda strategi replay-from-start ini akan berdampak negatif pada topologi Anda, coba bagi menjadi beberapa strategi lebih kecil yang dipisahkan oleh sistem antrian persisten seperti Kafka.