Tepat sekali TIDAK persis sama: analisis artikel

Pendahuluan


Saya memutuskan untuk menganalisis artikel yang menjelaskan beberapa detail menarik dari pemrosesan streaming tepat sekali: tepat sekali . Faktanya adalah bahwa beberapa penulis memahami istilah-istilah ini dengan sangat aneh. Analisis artikel akan memungkinkan kami untuk mengklarifikasi banyak detail lebih dalam, karena identifikasi ketidakkonsistenan dan keanehan memungkinkan Anda untuk lebih memahami konsep dan makna.


Mari kita mulai.


Analisis


Semuanya dimulai dengan sangat baik:


Pemrosesan stream peristiwa yang didistribusikan telah menjadi topik yang semakin panas di bidang Big Data. Mesin Pemroses Aliran Penting (SPE) termasuk Apache Storm, Apache Flink, Heron, Apache Kafka (Kafka Streams), dan Apache Spark (Spark Streaming). Salah satu fitur SPE yang paling terkenal dan dibahas secara luas adalah semantik pemrosesan mereka, dengan "tepat-sekali" menjadi salah satu yang paling dicari dan banyak SPE yang mengklaim menyediakan semantik pemrosesan "tepat-sekali".

Yaitu, pemrosesan data sangat penting, dll., Dan topik yang dibahas tepat-sekali. Mari kita bahas.


Ada banyak kesalahpahaman dan ambiguitas, namun, seputar apa sebenarnya β€œtepat-sekali” itu, apa yang disyaratkan, dan apa artinya sebenarnya ketika masing-masing SPE mengklaim menyediakannya.

Memang, sangat penting untuk memahami apa itu. Untuk melakukan ini, alangkah baiknya untuk memberikan definisi yang benar sebelum alasan yang panjang. Dan siapakah saya untuk memberikan nasihat yang bagus?


Saya akan membahas perbedaan antara semantik pemrosesan "tepat-sekali" di banyak SPE populer dan mengapa "tepat-sekali" dapat lebih baik digambarkan sebagai efektif-sekali

Menemukan istilah baru tentu saja merupakan tugas penting. Saya suka hal ini sendiri. Hanya untuk ini, pembenaran diperlukan. Mari kita coba menemukannya.


Saya tidak akan menggambarkan hal-hal yang jelas sebagai grafik pemrosesan yang diarahkan dan sebagainya. Pembaca dapat membaca artikel aslinya sendiri. Apalagi untuk analisis detail-detail ini tidak relevan. Saya hanya akan memberikan gambar:



Selanjutnya, ada deskripsi tentang semantik:


  • Paling banyak sekali, yaitu tidak lebih dari sekali. Dengan kejelasan yang tampak, perilaku seperti itu sangat sulit untuk dijamin dalam skenario tingkat batas seperti kerusakan, gangguan konektivitas jaringan, dan banyak lagi. Tetapi bagi penulis semuanya sederhana:


  • Setidaknya-sekali, yaitu setidaknya sekali. Skema ini lebih kompleks. Dan rake dapat dikumpulkan lebih banyak:


  • Tepat sekali. Apa itu sekali saja?

Acara dijamin akan diproses "tepat sekali" oleh semua operator di aplikasi streaming, bahkan jika terjadi berbagai kegagalan.

Yaitu jaminan pemrosesan tepat-sekali adalah ketika pemrosesan "tepat sekali" telah terjadi.


Rasakan kekuatan tekad? Untuk ulangi: proses sekali adalah saat proses terjadi β€œsekali”. Ya, itu juga mengatakan bahwa jaminan ini harus dipertahankan jika terjadi kegagalan. Tetapi untuk sistem terdistribusi, ini adalah hal yang jelas. Dan tanda kutip mengisyaratkan bahwa ada sesuatu yang salah di sini. Mendefinisikan dengan tanda kutip tanpa menjelaskan apa artinya ini adalah tanda pendekatan yang mendalam dan bijaksana.


Berikut ini adalah deskripsi cara menerapkan semantik tersebut. Dan di sini saya ingin tinggal lebih detail.


Dua mekanisme populer biasanya digunakan untuk mencapai pemrosesan semantik "semantik".
  1. Pemeriksaan pos kilat / keadaan terdistribusi
  2. Setidaknya pengiriman sekali peristiwa ditambah deduplikasi pesan

Jika mekanisme pertama tentang snapshot dan pos pemeriksaan tidak menimbulkan pertanyaan, yah, kecuali untuk beberapa detail seperti efisiensi, maka ada masalah kecil dengan yang kedua yang diabaikan penulis.


Untuk beberapa alasan, dipahami bahwa pawang hanya bisa deterministik. Dalam kasus penangan non-deterministik, setiap restart berikutnya akan memberikan, secara umum, nilai-nilai output lain dan menyatakan, yang berarti bahwa deduplikasi tidak akan berfungsi, karena nilai output akan berbeda. Dengan demikian, mekanisme umum akan jauh lebih rumit daripada yang dijelaskan dalam artikel. Atau, sejujurnya, mekanisme seperti itu tidak benar.


Namun, kami beralih ke yang paling lezat:


Apakah sekali-sekali benar-benar tepat sekali?



Sekarang mari kita periksa kembali apa yang benar-benar menjamin semantik pemrosesan benar-benar menjamin kepada pengguna akhir. Label "tepat sekali" menyesatkan dalam menggambarkan apa yang dilakukan tepat sekali.

Dikatakan bahwa sudah waktunya untuk mempertimbangkan kembali konsep ini, sebagai ada beberapa ketidakkonsistenan.


Beberapa orang mungkin berpikir bahwa "tepat sekali" menggambarkan jaminan untuk pemrosesan acara di mana setiap peristiwa dalam aliran diproses hanya sekali. Pada kenyataannya, tidak ada SPE yang dapat menjamin pemrosesan tepat-sekali. Untuk menjamin bahwa logika yang ditentukan pengguna di setiap operator hanya dijalankan sekali per peristiwa adalah mustahil dalam menghadapi kegagalan sewenang-wenang, karena eksekusi sebagian dari kode pengguna adalah kemungkinan yang selalu ada.

Penulis yang terhormat, perlu diingat cara kerja prosesor modern. Setiap prosesor dalam pemrosesan melakukan sejumlah besar tahap paralel. Selain itu, ada cabang di mana prosesor mulai melakukan tindakan yang salah jika prediktor cabang salah. Dalam hal ini, tindakan dibatalkan. Dengan demikian, prosesor dapat mengeksekusi potongan kode yang sama dua kali, bahkan jika tidak ada kegagalan yang terjadi!


Pembaca yang penuh perhatian akan segera berseru: karena knalpot penting, dan bukan bagaimana kinerjanya. Tepat! Yang penting adalah apa yang terjadi sebagai akibatnya, bukan bagaimana itu sebenarnya terjadi. Jika hasilnya seolah-olah itu terjadi tepat sekali, maka itu berarti itu terjadi tepat sekali. Tidak menemukan? Dan segala sesuatu yang lain adalah sekam, tidak relevan. Sistemnya kompleks, dan abstraksi yang dihasilkan hanya menciptakan ilusi eksekusi dengan cara tertentu. Tampaknya bagi kita bahwa kode dijalankan secara berurutan, instruksi demi instruksi, yang membaca pertama, lalu menulis, lalu instruksi baru. Tapi tidak demikian, semuanya jauh lebih rumit. Dan esensi dari abstraksi yang benar adalah untuk mempertahankan ilusi jaminan yang sederhana dan dapat dipahami, tanpa mengambil jauh ke dalam setiap kali, ketika Anda perlu menetapkan nilai ke variabel.


Dan seluruh masalah dari artikel ini terletak pada fakta bahwa tepat sekali adalah abstraksi yang memungkinkan Anda untuk membangun aplikasi tanpa memikirkan duplikat dan nilai yang hilang. Semuanya akan baik-baik saja, bahkan jika jatuh. Dan tidak perlu menemukan istilah baru untuk ini.


Contoh kode dalam artikel jelas menunjukkan kurangnya pemahaman tentang cara menulis penangan:


Map (Event event) { Print "Event ID: " + event.getId() Return event } 

Pembaca diundang untuk menulis ulang kode secara mandiri agar tidak mengulangi kesalahan penulis artikel.


Jadi apa yang dijamin oleh SPE ketika mereka mengklaim semantik pemrosesan "tepat sekali"? Jika logika pengguna tidak dapat dijamin akan dieksekusi tepat sekali maka apa yang dieksekusi tepat sekali? Ketika SPE mengklaim semantik pemrosesan "tepat", yang sebenarnya mereka katakan adalah bahwa mereka dapat menjamin bahwa pembaruan untuk negara yang dikelola oleh SPE hanya dilakukan satu kali ke backend store yang tahan lama.

Pengguna tidak perlu jaminan eksekusi fisik kode. Mengetahui cara kerja prosesor, mudah untuk menyimpulkan bahwa ini tidak mungkin. Yang utama adalah eksekusi logis tepat sekali, seolah-olah tidak ada kegagalan sama sekali. Menarik konsep "berkomitmen untuk gudang data" hanya memperburuk kurangnya pemahaman penulis tentang hal-hal dasar, karena ada implementasi semantik seperti itu tanpa perlu komit.


Untuk informasi lebih lanjut, Anda dapat membaca secara singkat artikel saya: Pemrosesan data kompetitif yang heterogen secara real time hanya sekali .


Dengan kata lain, pemrosesan suatu peristiwa dapat terjadi lebih dari satu kali tetapi efek dari pemrosesan itu hanya tercermin sekali di toko backend state yang tahan lama.

Bahwa ada "toko backend negara tahan lama" bagi pengguna benar-benar ungu. Hanya efek pemrosesan yang penting, mis. nilai konsistensi dan output pada seluruh rentang pemrosesan data streaming. Perlu dicatat bahwa untuk beberapa tugas tidak perlu memiliki toko negara backend tahan lama, dan akan menyenangkan untuk menjamin tepat sekali.


Di sini, di Streamlio, kami telah memutuskan bahwa secara efektif-sekali adalah istilah terbaik untuk menggambarkan semantik pemrosesan ini.

Contoh tipikal dari input konsep yang bodoh: kami akan menulis beberapa contoh dan argumen panjang untuk seluruh paragraf, dan pada akhirnya kami akan menambahkan bahwa "kami mendefinisikan konsep ini". Keakuratan dan kejelasan definisi menyebabkan respons emosional yang benar-benar jelas.


Kesimpulan


Kesalahpahaman tentang esensi abstraksi menyebabkan distorsi makna asli dari konsep yang ada dan penciptaan istilah baru berikutnya dari awal.


[1] Tepat sekali TIDAK persis sama .
[2] Pemrosesan data kompetitif real-time heterogen hanya dilakukan satu kali .

Source: https://habr.com/ru/post/id419935/


All Articles