Ingin memproses acara masuk tepat-sekali?
Nah, mana-mana pedant sistem yang diedarkan akan mengatakan anda tidak boleh, kerana ia secara teorinya mustahil. Dan dari segi teknikal, mereka betul: jika anda menghantar mesej dan tidak mendapat jawapan, anda tidak mempunyai cara untuk mengetahui sama ada penerima berada di luar talian atau hanya perlahan, jadi akhirnya anda tidak mempunyai pilihan selain menghantar mesej itu semula jika anda mahu ia diproses.
Jadi, jika pemprosesan tepat sekali adalah mustahil, mengapa banyak sistem, termasuk DBOS, mendakwa untuk menyediakannya?
Caranya ialah memanfaatkan harta lain: idempotensi. Jika anda mereka bentuk penerima mesej menjadi idempoten, maka anda boleh menghantar mesej kepadanya beberapa kali dan ia akan baik kerana penghantaran pendua tidak mempunyai kesan. Oleh itu, gabungan penghantaran sekurang-kurangnya sekali dan mati pucuk adalah sama dengan semantik tepat sekali dalam amalan.
Di bawah tudung, beginilah cara penerima acara DBOS (seperti untuk Kafka) berfungsi. Mereka menjana kunci unik daripada acara (contohnya, daripada offset partition topik Kafka) dan menggunakannya sebagai kunci mati pucuk untuk aliran kerja pemprosesan acara. Dengan cara itu, walaupun acara dihantar beberapa kali, aliran kerja hanya memprosesnya sekali.
Ini semua kod yang anda perlukan untuk memproses mesej Kafka dengan tepat sekali:
from dbos import DBOS, KafkaMessage @DBOS.kafka_consumer(config, ["topic"]) @DBOS.workflow() def test_kafka_workflow(msg: KafkaMessage): DBOS.logger.info(f"Message received: {msg.value.decode()}")
Ketahui lebih lanjut di sini!
Atas ialah kandungan terperinci Cara Memproses Acara dengan Tepat-Sekali. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!