Topik temu duga representatif

Bagaimanakah anda menerangkan pemprosesan tepat sekali (exactly-once) dan kesan sampingan luaran dalam penstriman?

DataSukar
Pasukan Editorial Offer.ccDiterbitkan Dikemas kini

Soalan

Penemu duga menyatakan bahawa tugas penstriman mestilah tepat sekali (exactly-once). Apakah maksudnya, mengapa kesan sampingan luaran masih boleh berulang, dan bagaimanakah anda mereka bentuk pemprosesan, komit, penyahduplikasian, dan pemantauan?

1. Soalan

Strim peristiwa pesanan dihuraikan, ditingkapkan, diagregatkan, dan diskor untuk risiko. Hasil ditulis ke gudang data dan pemberitahuan hiliran dicetuskan. Pekerja boleh ranap, rangkaian boleh tamat masa, dan peristiwa boleh lewat. Terangkan sempadan tepat sekali (exactly-once) dan reka bentuk aliran yang tidak menghasilkan caj pendua semasa percubaan semula.

2. Kekangan dan penjelasan

  • Asingkan tiga lapisan: penghantaran mesej, hasil dalam talian paip, dan kesan sampingan luaran.
  • Peristiwa mungkin diduplikasi, tidak teratur, atau lewat; log pemprosesan bukan bukti hasil yang telah dikomitkan.
  • Hasil mestilah boleh dimainkan semula, manakala pemberitahuan dan panggilan luaran lain memerlukan keidempotensian atau penyahduplikasian.
  • Jelaskan kependaman, tingkap kelewatan, dan dasar pengguguran sebelum memilih pelaksanaan.

3. Konsep teras

Pemprosesan tepat sekali biasanya bermaksud hasil talian paip bagi sesuatu rekod dicerminkan paling banyak sekali dalam output tahan lama sementara sistem masih mengelak daripada kehilangan rekod tersebut. Ini tidak bermakna setiap fungsi pengguna dijalankan sekali, dan ia tidak meliputi panggilan HTTP, e-mel, atau pangkalan data secara automatik. Input sekurang-kurangnya sekali (at-least-once) ditambah titik semak (checkpoints), main semula deterministik, dan penyahduplikasian hasil boleh menghasilkan jaminan output yang boleh disahkan.

4. Aliran rujukan

text
onEvent(event):
  key = stableEventId(event)
  state = readCheckpointOrState(key)
  result = deterministicTransform(event, state)
  writeTransactionalResult(key, result)   # unique(key)
  commitCheckpointAfterResult(key)

onExternalSideEffect(result):
  idempotencyKey = result.eventId + ":" + result.version
  callOrOutbox(idempotencyKey, result.payload)

Mula-mula tulis hasil dan ID peristiwa ke storan dengan kekangan keunikan atau transaksi, kemudian majukan titik semak. Halakan pemberitahuan luaran melalui API idempoten atau outbox dan penghantar berasingan. Penghantar boleh mencuba semula, manakala penerima menerima kunci keidempotensian yang diberikan sekali sahaja.

5. Kes kegagalan dan pertukaran kompromi

Jika pekerja ranap selepas panggilan luaran berjaya tetapi sebelum titik semaknya dikomitkan, main semula akan memanggil perkhidmatan luaran sekali lagi. Tanpa kunci keidempotensian, pelari (runner) sahaja tidak dapat menghapuskan kesan sampingan pendua tersebut. Hasil tetingkap juga bergantung pada data lewat dan tera air (watermarks), jadi sempadan pembetulan mestilah jelas. Jaminan hujung-ke-hujung yang lebih kukuh menambah keadaan penyahduplikasian, penyelarasan transaksi, dan kos storan; jika pendua boleh diterima, sekurang-kurangnya sekali (at-least-once) mungkin memberikan kependaman yang lebih rendah.

6. Pengesahan dan kebolehperhatian

  • Suntik ranapan, masa tamat, mesej pendua, dan peristiwa tidak teratur; periksa hasil akhir untuk satu kunci perniagaan.
  • Rekod ID peristiwa input, bilangan percubaan, versi komit, padanan penyahduplikasian, dan hasil panggilan luaran.
  • Selaraskan empat kiraan: diterima, diproses, dikomitkan, dan diberitahu. Log pekerja sahaja tidak mencukupi.
  • Pantau kadar pendua, kelewatan, usia titik semak, saiz keadaan penyahduplikasian, dan tunggakan main semula.

7. Kesilapan lazim

  • Menganggap penghantaran tepat sekali, pemprosesan tepat sekali, dan kesan sampingan tepat sekali sebagai satu janji yang sama.
  • Andaian bahawa suis rangka kerja memberikan kod tersuai sebarangan dan API luaran kesan satu kali secara automatik.
  • Menyahduplikasi dengan cap masa dan bukannya ID peristiwa yang stabil, menghasilkan kunci yang berbeza semasa percubaan semula atau main semula.
  • Mengabaikan peristiwa lewat, konflik versi, dan pengekalan rekod penyahduplikasian.

8. Mata pemarkahan temu duga

Menetapkan sempadan jaminan

Calon mengasingkan penghantaran, hasil talian paip, dan kesan sampingan luaran, serta mengenal pasti lapisan mana yang sebenarnya diliputi oleh rangka kerja.

Mereka bentuk aliran yang boleh dimainkan semula

Calon menggunakan ID peristiwa yang stabil, transformasi deterministik, komit hasil secara transaksi, dan susunan titik semak, kemudian menerangkan pemulihan ranapan.

Mengendalikan kesan sampingan luaran

Calon mencadangkan kunci keidempotensian, kekangan keunikan, atau outbox dan menerangkan cara penghantar dan penerima bersama-sama menghalang pendua.

Mengesahkan dengan suntikan kerosakan

Calon merangkumi pendua, penyusunan semula, kelewatan, masa tamat, dan ranapan pekerja, menggunakan data yang dikomitkan dan penyelarasan perniagaan untuk mengesahkan tuntutan tersebut.

Sumber awam

Soalan berkaitan