Topik temu duga representatif

Temu Duga Reka Bentuk Sistem: Mereka Bentuk Baris Gilir Mesej Teragih (Distributed Message Queue)

Reka bentuk sistemSukar
Pasukan Editorial Offer.ccDiterbitkan Dikemas kini

Soalan

Reka bentuk baris gilir mesej teragih berbilang penyewa dengan kemasukan mantap sebanyak 1 juta mesej sesaat, saiz mesej purata 1 KB, dan puncak 15 minit sebanyak 3 juta mesej sesaat. Kekalkan mesej selama 24 jam. Sokong topik, kumpulan pengguna (consumer groups), susunan per-kunci, penghantaran sekurang-kurangnya sekali (at-least-once delivery), main semula (replay), dan muatan sehingga 100 MB. Sasaran p99 bagi pengakuan penerbitan mestilah di bawah 50 milisaat, dan kehilangan satu zon ketersediaan (availability zone) tidak boleh menyebabkan kehilangan mesej yang telah diakui. Terangkan API, storan, pempartitionan, replikasi, ofset pengguna, percubaan semula dan mesej mati (dead letters), tekanan balik (backpressure), kapasiti, pengasingan penyewa, dan pengesahan.

Masalah dan Senario yang Berkenaan

Reka bentuk baris gilir mesej teragih yang dikongsi oleh beberapa pasukan produk. Kemasukan mantap adalah 1 juta mesej sesaat pada purata 1 KB setiap satu, dan puncak trafik boleh mengekalkan 3 juta mesej sesaat selama 15 minit. Mesej dikekalkan selama 24 jam secara lalai. Pengeluar menerbitkan secara kelompok (batch). Pengguna menarik secara kumpulan, melakukan komit ofset, dan memainkan semula dalam tempoh pengekalan. Mesej dengan kunci perniagaan yang sama memerlukan susunan tempatan, manakala kunci berbeza boleh berjalan secara selari. Mesej biasa menggunakan penghantaran sekurang-kurangnya sekali (at-least-once delivery), dan pengakuan penerbitan mempunyai sasaran p99 di bawah 50 milisaat. Setiap partition mempunyai tiga replika merentasi tiga zon ketersediaan; kehilangan satu zon tidak boleh menyebabkan kehilangan mesej yang telah diakui.

Kebanyakan mesej adalah kecil, tetapi API membenarkan muatan perniagaan sehingga 100 MB. Muatan besar tidak seharusnya berulang kali melalui log broker, pemindahan replika, dan penimbal pengguna. Dalam reka bentuk ini, ia mula-mula memasuki storan objek, manakala baris gilir hanya menyimpan rujukan tak boleh ubah (immutable reference), saiz, dan checksum. Daya pemprosesan, kependaman, pengekalan, ambang, dan bilangan replika adalah andaian temu duga yang memerlukan penandaarasan pada perkakasan sasaran. Ia bukan tuntutan produk rasmi.

Satu artikel reka bentuk sistem dari China yang diterbitkan pada Mei 2026 secara langsung membincangkan baris gilir yang memproses puluhan bilion mesej sehari dengan puncak berjuta-juta QPS. Gesaan PracHub yang dikemas kini pada Jun 2026 meminta calon merangkumi API, kumpulan pengguna, ofset, partition, replika, muatan besar, dan pengasingan berbilang penyewa. Bersama-sama, ini mewujudkan gesaan reka bentuk sistem yang boleh disahkan pada masa ini. Hanya satu halaman yang mendakwa atribusi syarikat, jadi artikel ini membiarkan nama syarikat tidak dinyatakan.

Perkara yang Dinilai oleh Penemu Duga

Pertama, adakah calon mentakrifkan kontrak penghantaran? Penerbitan yang berjaya, storan broker yang tahan lasak (durable), penghantaran mesej kepada pengguna, penyiapan kesan sampingan (side effect) perniagaan, dan komit ofset adalah lima sempadan yang berasingan. Memanggil semua ini sebagai "kejayaan mesej" menyembunyikan dua tetingkap kegagalan: pengeluar mungkin mengulangi penerbitan selepas kehilangan pengakuan, dan pengguna mungkin mengulangi kerja selepas menyelesaikan kesan sampingan tetapi ranap sebelum komit ofset.

Kedua, adakah pempartitionan, susunan, dan penskalaan mengikut satu hujah yang konsisten? Menghantar satu kunci ke satu partition mengekalkan susunan log kunci tersebut. Partition yang sama mengehadkan kedua-dua daya pemprosesan tulis dan keselarian kumpulan pengguna. Lebih banyak partition menambah slot selari, tetapi ia tidak membahagikan kunci panas (hot key) yang terus-menerus terlebih beban atau mencipta susunan global.

Ketiga, adakah peraturan pengakuan replika bertahan daripada kegagalan? Jawapan yang kukuh menyatakan bila pengeluar boleh diakui, replika mana yang layak menjadi ketua (leader) baharu, dan bagaimana epoch memagari (fence) ketua lama yang telah pulih. Mengatakan "tiga replika melakukan failover secara automatik" tidak membuktikan bahawa rekod yang diakui dapat bertahan.

Keempat, adakah ofset pengguna disambungkan kepada hasil perniagaan? Melakukan komit sebelum pemprosesan boleh melangkau kesan perniagaan. Memproses sebelum komit boleh memainkannya semula selepas ranap. At-least-once memilih tetingkap kedua, kemudian menyerap pengulangan dengan ID mesej yang stabil, kunci idempoten perniagaan, kekangan unik, atau syarat versi. Transaksi broker hanya merangkumi sumber yang mengambil bahagian dalam transaksi tersebut; ia tidak memberikan kesan exactly-once secara automatik kepada perkhidmatan pembayaran luaran, penyedia e-mel, atau pangkalan data.

Akhir sekali, bolehkah baris gilir mengekalkan sempadan ini di bawah tekanan? Calon harus mengira storan 24 jam dan tunggakan lonjakan (burst backlog), mengendalikan mesej besar, partition panas, pengguna perlahan, mesej racun (poison messages), cakera penuh, dan penyewa yang bising, kemudian menyuntik kegagalan untuk membuktikan bahawa mesej yang diakui tidak hilang, kerja yang belum dikomit tidak dilangkau, dan pemilik lapuk tidak boleh memajukan ofset.

Soalan Penjelasan Sebelum Menjawab

  • Adakah ini log yang dikekalkan atau baris gilir kerja tuntut-dan-padam (claim-and-delete)? Reka bentuk ini memilih log yang dikekalkan kerana berbilang

kumpulan pengguna dan main semula diperlukan. Jika tepat satu pekerja menuntut setiap tugas dan main semula sejarah tidak diperlukan, baris gilir pajakan dengan had masa keterlihatan (visibility timeouts) adalah lebih mudah.

  • Apakah skop susunan? Susunan merangkumi susunan tambah (append order) dalam satu partition topik, dengan satu kunci perniagaan disematkan

pada satu partition. Tiada susunan global merentasi kunci, partition, atau topik. Susunan global akan mengurangkan daya pemprosesan kepada satu log bersiri.

  • Apakah maksud pengakuan penerbitan? Dua daripada tiga replika telah menyimpan rekod secara tahan lasak, dan satah kawalan

masih mengiktiraf epoch ketua semasa. Topik yang tahan lasak secara kukuh menolak penulisan apabila kurang daripada dua replika tersedia.

  • Apakah semantik penggunaan? Lalai adalah sekurang-kurangnya sekali (at least once): proses dengan berjaya, kemudian komit ofset seterusnya.

Kesan sampingan luaran memerlukan keidempotenan atau penyelarasan (reconciliation). Hanya beban kerja bernilai rendah yang membenarkan kehilangan tetapi melarang pendua patut melakukan komit terlebih dahulu.

  • Adakah pengguna memerlukan main semula sewenang-wenangnya? Sesuatu kumpulan boleh menetapkan semula mengikut ofset atau cap masa dalam tetingkap pengekalan 24 jam.

Di luar pengekalan, ia mesti memulihkan daripada arkib, atau gagal secara jelas apabila tiada arkib wujud.

  • Bolehkah mesej racun dilangkau? Topik biasa boleh memindahkan mesej ke topik mesej mati (dead-letter topic) selepas percubaan semula yang terhad.

Topik yang disusun mengikut kunci secara ketat tidak boleh melangkauinya secara percuma; jedakan kunci atau partition dan baikinya, atau mesej terkemudian mungkin melepasi kegagalan tersebut.

  • Adakah muatan 100 MB mesti sebaris (inline)? Tidak. Reka bentuk ini mengandaikan muatan sebaris sehingga 256 KiB dan menggunakan rujukan objek

di atas ambang tersebut. Penandaarasan dan kos menentukan ambang; 100 MB ialah had muatan objek.

  • Apakah keperluan merentas wilayah? Reka bentuk utama adalah satu wilayah merentasi tiga zon ketersediaan.

Pemulihan bencana merentas wilayah secara tidak segerak (asynchronous) tidak boleh menjanjikan kedua-dua sifar kehilangan data dan kependaman tulis tempatan. Keperluan merentas wilayah dengan RPO sifar mengubah laluan pengakuan dan belanjawan kependaman.

  • Sejauh manakah keteguhan pengasingan penyewa? Broker dikongsi secara lalai, dengan had kemasukan, keluaran, storan, partition,

dan sambungan bagi setiap penyewa. Penyewa yang sangat besar atau terkawal boleh menggunakan kolam broker khusus di bawah satah kawalan dan protokol yang sama.

Rangka Kerja Jawapan 30 Saat

"Saya akan memodelkan ini sebagai log berpartition yang dikekalkan dan boleh dimainkan semula. Pengeluar menghala mengikut kunci perniagaan ke ketua partition, mengelompokkan penulisan, dan menerima pengakuan hanya selepas dua replika di zon ketersediaan yang berbeza mengekalkan kelompok tersebut. Ini memberikan susunan per-kunci, bukan susunan global. Kumpulan pengguna memiliki partition secara eksklusif, menyelesaikan penulisan perniagaan yang idempoten, dan kemudian melakukan komit ofset seterusnya, jadi penghantaran adalah sekurang-kurangnya sekali dan kesan luaran dinyahduplikasi mengikut ID mesej. Kemasukan mantap adalah kira-kira 1 GB/s dan 86.4 TB sehari secara logik, atau 259.2 TB dengan tiga replika. Puncak tiga kali ganda selama 15 minit mencipta kira-kira 1.8 TB tunggakan tambahan jika pengguna mengekalkan kadar mantap. Muatan melebihi 256 KiB dihantar ke storan objek dan baris gilir membawa rujukan serta checksum. Saya akan membuktikan sempadan ini dengan kuota penyewa, penjadualan adil, amaran lag, kegagalan ketua, kehilangan pengakuan, dan ujian ranap pengguna."

Perbincangan Mendalam Langkah demi Langkah

Langkah 1: Tulis API dan invarian sebelum komponen.

Permukaan penting merangkumi topik, penerbitan, pengambilan (fetching), komit, dan penetapan semula ofset:

text
POST /v1/topics
POST /v1/topics/{topic}/messages:publish
POST /v1/groups/{group}/messages:fetch
POST /v1/groups/{group}/offsets:commit
POST /v1/groups/{group}/offsets:reset

Permintaan penerbitan membawa konteks penyewa yang disahkan, topik, message_key pilihan, message_id yang stabil, muatan atau rujukan objek, epoch pengeluar, dan jujukan per-partition. Respons kelompok mengembalikan partition, ofset, dan status komit setiap mesej. Ambilan (fetch) membawa kumpulan, generasi pemilikan partition, ofset permulaan, bait maksimum, dan tempoh long-poll. Komit menulis ofset rekod seterusnya untuk dibaca.

Reka bentuk ini mengekalkan empat invarian: rekod yang diakui kekal boleh dibaca selepas kegagalan satu zon ketersediaan; pengguna hanya melihat awalan yang dikomit; ofset meningkat secara monotonik dalam epoch ketua; dan pengguna dengan generasi yang tamat tempoh tidak boleh melakukan komit ofset atau terus menulis hasil. message_id pada peringkat API menyokong penyahduplikasian perniagaan. producer_id + epoch + sequence membolehkan broker mengenali percubaan semula penerbitan yang sama.

Langkah 2: Asingkan satah kawalan daripada satah data.

text
Control plane: tenants and ACLs, topic configuration, partition placement,
               replica membership, leader epochs, quotas

Data plane:
Producer -> metadata cache -> partition leader -> follower replicas
Consumer group -> group coordinator -> partition leaders -> business sink

Kluster kecil yang disokong konsensus menyimpan metadata topik dan partition serta menetapkan epoch yang meningkat secara monotonik kepada setiap penggal ketua. Ia tidak membawa badan mesej. Broker menambah, mereplikasi, membaca, dan mengekalkan rekod. Klien menyimpan cache ketua partition dan menyegarkan metadata selepas respons epoch lapuk atau bukan ketua. Daya pemprosesan mesej mengelakkan proksi pusat, manakala partition sedia ada boleh diteruskan untuk tempoh pajakan terhad semasa gangguan satah kawalan. Penciptaan topik dan pergerakan partition mungkin dijeda; metadata lapuk tidak boleh sesekali memilih ketua secara sewenang-wenangnya.

Langkah 3: Gunakan log berpartition untuk daya pemprosesan, main semula, dan susunan tempatan.

Setiap partition ialah satu set segmen tambah-sahaja (append-only) yang rekodnya mengandungi:

text
MessageEnvelope {
  tenant_id, topic, partition, offset
  message_id, message_key, producer_id, producer_epoch, sequence
  created_at, headers, payload_or_ref, payload_size, checksum
}

Segmen aktif menerima penambahan berurutan. Indeks ofset yang jarang (sparse index) mencari lokasi bacaan, dan segmen tertutup digulung mengikut masa atau saiz. Pengguna mengambil kelompok mengikut ofset, membolehkan I/O berurutan, penggunaan cache halaman, dan pemindahan rangkaian berkelompok. Pengekalan memadamkan keseluruhan segmen selepas 24 jam. Segmen di bawah main semula yang sah atau muat naik storan bertingkat memegang rujukan supaya pemadaman tidak berlumba (race condition) dengan pembaca.

Cincangan penghalaan (routing hash) merangkumi penyewa yang dipercayai, topik, dan kunci perniagaan. Rekod dengan kunci yang sama kekal pada satu partition; rekod tanpa kunci boleh menggunakan penetapan round-robin atau kelompok melekat (sticky-batch). Penghalaan berasaskan penyewa sahaja menjadikan penyewa besar terlalu panas, manakala penghalaan rawak sepenuhnya kehilangan susunan kunci. Menambah partition mempengaruhi rekod masa hadapan. Modulo yang diubah boleh meletakkan satu kunci pada kedua-dua partition lama dan baharu. Apabila susunan yang stabil penting, petakan syard maya (virtual shards) ke partition fizikal; jedakan syard maya semasa pergerakan, catatkan ofset peralihan (cutover offset), kosongkan pemilik lama, dan sambung semula di bawah epoch baharu.

Langkah 4: Berikan replikasi dan pemilihan ketua satu definisi komit.

Setiap partition mempunyai tiga replika dalam tiga zon ketersediaan. Ketua menetapkan ofset, menambah kelompok secara tahan lasak, dan mereplikasikannya secara selari. Sebaik sahaja mana-mana dua replika telah mengekalkan kelompok tersebut, commit_watermark akan maju dan pengeluar akan diakui. Pengguna hanya membaca ofset di bawah tanda aras air (watermark) tersebut. Apabila berlaku kegagalan ketua, satah kawalan hanya memilih replika yang mengandungi awalan yang dikomit dan meningkatkan epoch. Ketua lama yang pulih memangkas (truncate) hujung yang belum dikomit dan mengejar ketinggalan sebelum berkhidmat; permintaan yang membawa epoch lamanya akan ditolak.

Dasar ini bertolak ansur dengan kegagalan satu zon ketersediaan. Dengan dua replika yang tinggal, kedua-duanya mesti mengakui, jadi kependaman dan kapasiti merosot. Jika salah satu daripada replika yang tinggal gagal, topik yang tahan lasak secara kukuh akan berhenti mengakui penulisan sehingga replikasi dipulihkan. Memilih replika lapuk untuk meningkatkan ketersediaan akan melanggar janji tiada kehilangan. Semasa partition rangkaian, hanya pihak yang mempunyai majoriti komit boleh menulis; pihak yang satu lagi dipagari.

Pengeluar mencuba semula apabila rekod telah dikomit tetapi respons pengakuan telah hilang. Broker menyahduplikasi dalam partition menggunakan epoch pengeluar dan jujukan monotonik serta mengembalikan ofset asal. Pengeluar zombi dengan epoch lama akan ditolak. Ini membuang pendua log yang disebabkan oleh percubaan semula penerbitan. Ia tidak menggabungkan dua permintaan perniagaan berbeza yang menggunakan ID berbeza, atau menyahduplikasi kesan sampingan luaran pengguna.

Langkah 5: Sambungkan pemilikan kumpulan dan ofset kepada hasil perniagaan.

Dalam kumpulan pengguna, seorang ahli memiliki satu partition pada satu masa. Penyelaras kumpulan mengekalkan ahli, pajakan, generasi, dan tugasan. Acara tamat masa atau penskalaan mencipta generasi baharu, dan pengambilan atau komit daripada ahli lama akan ditolak. Pengimbangan semula berperingkat (incremental rebalancing) hanya memindahkan partition yang perlu dan mengurangkan jeda seluruh kumpulan, tetapi pengguna masih mesti berhenti mengambil dan mengomit kerja yang telah selesai sebelum pemilikan dibatalkan.

Susunan lalai ialah mengambil kelompok, melaksanakan penulisan perniagaan yang idempoten, kemudian melakukan komit ofset seterusnya. Jika pengguna ranap selepas komit perniagaan dan sebelum komit ofset, pemilik baharu memainkan semula rekod yang telah selesai, yang menghasilkan penghantaran sekurang-kurangnya sekali (at-least-once delivery). message_id yang stabil boleh menyokong kekangan unik atau rekod mesej yang diproses, atau dikomit dalam transaksi pangkalan data yang sama dengan keadaan perniagaan. Jika output kembali ke sistem pemesejan yang sama, rekod output dan ofset input boleh berkongsi transaksi broker. Pangkalan data luaran, pembayaran, atau penyedia e-mel masih memerlukan keidempotenan, carian status, atau penyelarasan.

Ofset disimpan dalam log metadata yang direplikasi di bawah (tenant, group, topic, partition) dan membawa generasi. Pemantauan merangkumi kedua-dua log_end_offset - committed_offset dan usia mesej tertua yang belum diproses. Kiraan mesej sahaja memberikan gambaran salah mengenai tunggakan dengan saiz rekod yang berubah-ubah, jadi sistem juga melaporkan bait lag dan masa mengejar pada kadar penggunaan bersih semasa.

Langkah 6: Nyatakan konflik antara percubaan semula, mesej mati, dan susunan.

Kegagalan rangkaian sementara dan pendikitan memasuki topik percubaan semula tertangguh dengan jitter. Kegagalan skema deterministik, kebenaran, atau pengesahan perniagaan tidak seharusnya dicuba semula secara buta tuli. Percubaan semula mengekalkan message_id asal, topik sumber, partition, ofset, masa kali pertama dilihat, kiraan percubaan, dan kelas ralat. Selepas had percubaan atau had masa perniagaan, ia berpindah ke topik mesej mati (dead-letter topic), membangkitkan amaran, dan membenarkan pemanduan semula (redrive) terkawal. Pemanduan semula mengekalkan ID asal supaya ia tidak boleh memintas keidempotenan.

Memindahkan rekod yang gagal ke tepi membolehkan rekod terkemudian selesai dahulu, yang bercanggah dengan susunan per-kunci yang ketat. Jika keadaan susunan mesti berkembang secara ketat, jedakan kunci tersebut dan timbal rekod terkemudiannya dalam lorong tersusun yang berasingan, kemudian sambung semula dari ofset yang gagal selepas pembaikan. Menjeda keseluruhan partition adalah lebih mudah tetapi mempunyai radius impak (blast radius) yang lebih besar. Jika perniagaan menerima penumpuan mengikut versi, rekod terkemudian boleh diteruskan dan sink menolak versi lapuk. Kontrak topik mesti memilih; ia tidak boleh menjanjikan kedua-dua "mesej racun tidak pernah menyekat" dan "mesej tidak pernah memotong satu sama lain."

Langkah 7: Letakkan mesej besar di belakang rujukan objek dan tutup perlumbaan kutipan sampah (garbage-collection races).

Reka bentuk ini menetapkan 256 KiB sebagai ambang sebaris. Muatan yang lebih besar menggunakan kelayakan muat naik jangka pendek untuk menulis objek tak boleh ubah dengan saiz, cincangan kandungan, dan metadata penyulitan. Hanya selepas muat naik berjaya, pengeluar menerbitkan rujukan tersebut. Pengguna membaca objek dan mengesahkan cincangan. Replika broker hanya menyalin sampul kecil, jadi rekod 100 MB tidak boleh memonopoli penimbal rangkaian, kelompok replikasi, atau memori pengguna.

Muat naik yang berjaya tetapi rujukannya tidak pernah diterbitkan adalah yatim (orphan) dan tamat tempoh mengikut TTL sesi muat naik. Sebaik sahaja rujukan dikomit, pengekalan objek mesti merangkumi pengekalan mesej, main semula yang sah, mesej mati, dan margin keselamatan. Tugas pemadaman mula-mula memeriksa rujukan yang dilindungi dan memadamkannya selepas tempoh tangguh. Apabila bacaan objek gagal, penggunaan kekal tidak dikomit dan mencuba semula; mengakui terlebih dahulu boleh menyebabkan badan mesej hilang secara kekal. Muatan besar menerima kuota kadar bait, muat turun serentak, dan storan per-penyewa yang berasingan kerana pendikitan kiraan mesej salah menilai kosnya.

Langkah 8: Dapatkan partition, cakera, dan ruang mengejar daripada kapasiti.

Menggunakan 1 KB perpuluhan, kemasukan logik mantap ialah:

text
1,000,000 messages/s × 1,000 bytes = 1 GB/s
1 GB/s × 86,400 s = 86.4 TB/day
Lower bound for three replica writes = 86.4 × 3 = 259.2 TB/day

Jumlah kemasukan semasa puncak 15 minit ialah 3 GB/s × 900 = 2.7 TB. Jika pengguna hanya mengekalkan kadar mantap 1 GB/s, tunggakan tambahan ialah:

text
(3 GB/s - 1 GB/s) × 900 s = 1.8 TB

Selepas puncak, andaikan pengguna mengekalkan 1.5 GB/s manakala kemasukan baharu kekal 1 GB/s. Kadar mengejar bersih ialah 0.5 GB/s, jadi 1.8 TB mengambil masa 3,600 saat, atau kira-kira satu jam, untuk dikosongkan secara teori. Pemulihan replika, overhed kelompok, pemampatan, indeks, rizab sistem fail, dan storan objek mesej besar menambah kapasiti, jadi ini adalah batas bawah.

Bilangan partition dihadkan oleh kedua-dua bait dan mesej. Andaikan penandaarasan dengan tiga replika dan sasaran p99 mendapati bahawa satu partition mengekalkan 40 MB/s dan 40,000 mesej sesaat. Kedua-dua dimensi puncak memerlukan sekurang-kurangnya 75 partition. Menambah 50% ruang lebihan (headroom) untuk kegagalan dan pengimbangan semula menghasilkan kira-kira 113, jadi 128 adalah pilihan praktikal. Hasil per-partition tersebut adalah andaian penandaarasan temu duga. Perkakasan, kelompok, pengakuan, atau saiz rekod yang berbeza memerlukan ujian baharu; 128 bukan jawapan universal.

Langkah 9: Laksanakan tekanan balik, pengasingan penyewa, dan operasi yang boleh disahkan.

Pengguna menggunakan long polling dan mengawal kadar mereka dengan max_bytes dan had kelompok dalam penerbangan (in-flight batch limits). Apabila tanda aras air cakera broker meningkat, sistem mula-mula menghentikan penciptaan partition baharu, menurunkan elaun lonjakan untuk penyewa berkeutamaan rendah, kemudian menolak penerbitan lebih kuota dengan isyarat yang boleh dicuba semula. Baris gilir memori dan percubaan semula tanpa had mengubah kesesakan menjadi kegagalan proses. Pengeluar menggunakan penimbal kelompok terhad, had masa akhir (deadlines), dan backoff berjitter supaya gangguan broker tidak dapat mencipta ribut percubaan semula yang segerak.

Identiti penyewa datang daripada kelayakan, bukan sekali-kali daripada badan mesej. Kemasukan dihadkan oleh kadar mesej dan bait. Keluaran dijadualkan secara adil mengikut bait ambilan dan CPU permintaan. Storan, partition, kumpulan pengguna, sambungan, permintaan dalam penerbangan, dan objek besar juga mempunyai had. Peletakan mengelakkan penumpuan replika atau partition panas satu penyewa pada beberapa broker sahaja. Penyewa yang sangat besar beralih ke kolam khusus, manakala kolam yang dikongsi masih menyukat dan melaporkan penolakan bagi setiap penyewa.

Metrik utama merangkumi p50/p95/p99 pengakuan penerbitan, ralat dan hasil yang tidak diketahui; bait kemasukan per-partition, lag ketua dan pengikut, commit_watermark, tanda aras air cakera, dan kunci panas; ofset dikomit kumpulan pengguna, lag pengguna, usia tertua, pengimbangan semula, percubaan semula, dan mesej mati; objek yatim dan kegagalan membaca; serta pendikitan dan keadilan per-penyewa. Kenari (canary) hujung-ke-hujung menerbitkan ID yang stabil, mengomit hasil perniagaan yang idempoten, kemudian mengomit ofsetnya dan menyelaraskan keadaan broker, kumpulan, dan perniagaan.

Matriks kegagalan merangkumi ranap ketua sebelum replikasi, selepas komit, dan sebelum mengembalikan pengakuan; kehilangan satu zon ketersediaan; partition rangkaian; cakera penuh; pemulihan ketua lapuk; kunci panas; puncak tiga kali ganda selama 15 minit; ranap pengguna sebelum dan selepas komit perniagaannya; komit lapuk semasa pengimbangan semula; mesej racun; kejayaan muat naik diikuti oleh kegagalan penerbitan; kegagalan membaca objek; dan pemanduan semula mesej mati. Penerimaan menegaskan bahawa rekod yang diakui bertahan, kerja yang belum dikomit tidak dilangkau, susunan kunci mengikut kontrak topik, generasi lapuk tidak boleh memajukan ofset, dan setiap pendua, penolakan, atau pengguguran mempunyai metrik yang boleh diatribusikan.

Contoh Jawapan Berkualiti Tinggi

"Saya mula-mula akan mengesahkan bahawa ini ialah perkhidmatan log yang dikekalkan yang memerlukan berbilang kumpulan pengguna dan main semula 24 jam. Suatu topik dibahagikan kepada partition, dan kunci perniagaan yang sama kekal pada satu partition. Oleh itu, susunan merangkumi kunci dan partition, manakala partition yang berbeza berjalan secara selari. Pengeluar memperoleh metadata ketua daripada satah kawalan dan menulis kelompok secara langsung. Setiap partition mempunyai tiga replika merentasi zon ketersediaan; hanya dua replika tahan lasak memajukan commit_watermark dan mengakui pengeluar. Ketua baharu mesti mengandungi awalan yang dikomit, dan epoch memagari ketua dan pengeluar lama.

Storan menggunakan segmen tambah-sahaja dan indeks ofset yang jarang. Pengguna kumpulan memiliki partition secara eksklusif dan menggunakan long-poll. Pengguna mengomit hasil perniagaan yang idempoten sebelum mengomit ofset seterusnya. Ranap sistem boleh memainkan semula kerja tetapi tidak boleh melangkauinya secara senyap. Di pihak pengeluar, epoch dan jujukan pengeluar membuang percubaan semula yang disebabkan oleh kehilangan pengakuan. Di pihak pengguna, ID mesej yang stabil, kekangan unik, atau syarat versi menyerap kesan berulang. Saya akan mendakwa transaksi broker hujung-ke-hujung hanya apabila kedua-dua ofset input dan output berada dalam transaksi broker tersebut; sistem luaran masih memerlukan keidempotenan atau penyelarasan.

Kapasiti mantap ialah 1 GB/s dan 86.4 TB data logik sehari, dengan batas bawah 259.2 TB untuk tiga penulisan replika. Puncak tiga kali ganda selama 15 minit mencipta 1.8 TB tunggakan tambahan apabila kapasiti pengguna kekal pada keadaan mantap. Jika kadar mengejar bersih selepas puncak ialah 0.5 GB/s, mengosongkannya mengambil masa kira-kira satu jam secara teori. Kiraan partition menggunakan pengiraan yang lebih besar antara kadar mesej dan kadar bait, menambah ruang lebihan kegagalan, dan ditentukur pada perkakasan sebenar.

Badan muatan melebihi 256 KiB mula-mula memasuki storan objek. Baris gilir mengekalkan rujukan tak boleh ubah, saiz, dan checksum. TTL sesi muat naik membuang objek yatim, manakala rujukan yang dikomit melindungi objeknya melalui tetingkap pengekalan, main semula, dan mesej mati. Percubaan semula mengekalkan ID mesej asal. Topik yang disusun secara ketat menjeda kunci atau partition pada mesej racun kerana memasukkannya ke mesej mati serta-merta akan membiarkan mesej terkemudian melepasi.

Akhir sekali, saya akan mengehadkan kemasukan, keluaran, storan, partition, dan objek besar bagi setiap penyewa; mengasingkan penyewa panas dalam kolam khusus; dan memantau kependaman pengakuan, penerbitan tidak diketahui, lag replika, tanda aras air cakera, usia pengguna tertua, kunci panas, dan mesej mati. Ujian kegagalan merangkumi pengakuan yang hilang, ranap ketua sebelum dan selepas komit, kegagalan zon, komit ofset lapuk, ranap pengguna selepas penulisan perniagaan, dan kegagalan storan objek. Setiap ujian memeriksa sempadan pengakuan tertentu."

Kesilapan Biasa

  • **Kesilapan: Melukis hanya Pengeluar, Kafka, dan Pengguna → Kegagalan: Nama komponen tidak mentakrifkan sempadan pengakuan, ofset,

susunan, atau kegagalan → Pembetulan: Nyatakan kontrak penghantaran dan empat invarian, kemudian petakan setiap komponen kepada satu daripadanya.**

  • **Kesilapan: Menjanjikan susunan global semasa menskala secara mendatar → Kegagalan: Susunan global memerlukan satu titik keputusan bersiri,

manakala keselarian partition membuang susunan tersebut → Pembetulan: Skopkan susunan kepada kunci perniagaan dan partition serta nyatakan had kunci panas.**

  • **Kesilapan: Mengakui selepas penulisan cakera tempatan ketua → Kegagalan: Kehilangan zon ketersediaan ketua boleh membuang

satu-satunya salinan yang tahan lasak → Pembetulan: Akui selepas majoriti komit merentas zon dan pilih hanya replika dengan awalan yang dikomit.**

  • **Kesilapan: Mengomit ofset serta-merta selepas pengambilan → Kegagalan: Ranap sistem selepas komit tersebut melangkau hasil perniagaan

secara kekal → Pembetulan: Komit hasil perniagaan yang idempoten terlebih dahulu, kemudian ofset seterusnya, dan terima main semula terkawal.**

  • **Kesilapan: Menyamakan exactly-once broker dengan kesan exactly-once luaran → Kegagalan: Sistem luaran tidak menyertai

transaksi broker, jadi kehilangan pengakuan masih meninggalkan tetingkap pendua → Pembetulan: Gunakan kunci keidempotenan perniagaan, kekangan unik, syarat versi, atau penyelarasan.**

  • **Kesilapan: Memindahkan setiap mesej yang gagal ke mesej mati serta-merta → Kegagalan: Rekod terkemudian untuk kunci yang sama boleh melepasi dan merosakkan

susunan keadaan → Pembetulan: Biarkan kontrak topik memilih kunci yang dijeda, partition yang dijeda, atau penumpuan berasaskan versi.**

  • **Kesilapan: Menulis muatan 100 MB terus ke dalam log broker → Kegagalan: Beberapa rekod memonopoli replikasi,

penimbal, dan kelompok ambilan → Pembetulan: Simpan badan mesej dalam storan objek dan catatkan rujukan, saiz, dan checksumnya dalam log.**

  • **Kesilapan: Merancang kuota dan kapasiti hanya mengikut bilangan mesej → Kegagalan: Rekod 1 KB dan rekod 100 MB mempunyai kos

rangkaian, cakera, dan memori yang sangat berbeza → Pembetulan: Sukat kiraan, bait, kelompok dalam penerbangan, dan keserentakan objek.**

  • **Kesilapan: Menambah pengguna untuk menghapuskan setiap lag → Kegagalan: Seorang ahli kumpulan memiliki satu partition pada satu masa, dan kunci panas

kekal dihadkan oleh laluan partition bersiri → Pembetulan: Periksa taburan partition dan kunci sebelum menambah partition, membahagikan kunci perniagaan, atau mendikit.**

  • **Kesilapan: Memantau masa hidup (uptime) broker sahaja → Kegagalan: Kluster yang hidup masih boleh mempunyai replika yang ketinggalan, cakera kehabisan ruang,

ofset lapuk, dan mesej mati yang semakin meningkat → Pembetulan: Pantau kependaman bersegmen, awalan dikomit, usia mesej tertua, masa mengejar, dan kenari hujung-ke-hujung.**

Soalan Susulan dan Maklum Balas

Susulan 1: Bagaimanakah anda menyediakan sifar kehilangan data merentas wilayah sambil mengekalkan p99 penerbitan di bawah 50 milisaat?

Pengakuan merentas wilayah secara segerak menambah masa perjalanan pergi balik kawasan luas (wide-area round-trip time) kepada laluan penerbitan. Sama ada 50 milisaat boleh dicapai bergantung pada jarak wilayah dan kependaman rangkaian ekor (tail network latency). Perniagaan mesti menyusun keutamaan antara RPO sifar berbanding kependaman tempatan. Apabila RPO sifar diutamakan, penulisan menunggu majoriti komit jauh dan SLO kependaman mesti ditetapkan semula. Apabila kependaman diutamakan, replikasi adalah segerak dalam wilayah dan tidak segerak merentas wilayah, dengan risiko eksplisit terhadap ekor yang tidak direplikasi. Aktif-aktif juga memerlukan satu pemilik untuk setiap kunci atau peraturan konflik; satu wilayah utama bagi setiap topik atau julat kunci biasanya mengekalkan susunan dengan lebih jelas.

Susulan 2: Seorang penyewa mempunyai kunci perniagaan tunggal pada 200,000 mesej sesaat. Mengapakah 128 partition tidak membantu?

Kunci yang sama mesti kekal pada satu partition untuk mengekalkan susunan, jadi ia masih dihadkan oleh kadar partition tunggal yang ditanda aras iaitu kira-kira 40,000 mesej sesaat. Pilihannya adalah untuk mengoptimumkan laluan bersiri, mendikit penyewa tersebut, atau mentakrifkan semula domain susunan bebas, seperti kunci sub-entiti yang tidak mempengaruhi antara satu sama lain. Jika perniagaan memerlukan susunan menyeluruh untuk kunci tersebut, perkhidmatan mesti menolak janji di atas kapasiti bersiri. Menyerakkan kunci secara rawak hanya menukarkan kegagalan kapasiti kepada kegagalan susunan.

Susulan 3: Pengguna mengenakan caj pembayaran dan kemudian ranap sebelum mengomit ofsetnya. Bagaimanakah anda menghalang caj kali kedua?

Gunakan message_id atau ID operasi perniagaan sebagai kunci keidempotenan pembayaran. Jika penyedia pembayaran menyokong API idempoten, main semula menggunakan kunci yang sama dan menanyakan hasil asal. Jika hanya pangkalan data tempatan dikawal, komit keadaan perniagaan dan rekod unik mesej yang diproses dalam satu transaksi, kemudian gunakan outbox untuk langkah luaran. Apabila sistem luaran tidak mempunyai keidempotenan mahupun carian status, rekod keadaan UNKNOWN, selaraskan, dan berikan pampasan secara manual. Mengomit ofset lebih awal hanya menyembunyikan ketidakpastian dengan menerima kehilangan.

Susulan 4: Bagaimanakah anda memandu semula (redrive) mesej racun dengan selamat?

Baiki pengguna atau data terlebih dahulu, bekukan skop pemanduan semula, dan kekalkan ID mesej asal, ofset sumber, masa kali pertama dilihat, dan sejarah percubaan. Sahkan versi baharu dengan penggunaan bayangan (shadow consumption), kemudian mainkan semula pada kadar bagi setiap penyewa dan setiap partition sambil memastikan keidempotenan sink aktif. Topik yang disusun secara ketat juga menjeda rekod terkemudian untuk kunci tersebut dan menyambung semula dari ofset yang gagal mengikut susunan. Jika kontrak membenarkan penyusunan semula, sink menolak versi perniagaan lama. Pemanduan semula tidak boleh mencipta ID baharu untuk memintas penyahduplikasian atau membanjiri topik utama semasa puncak trafik biasanya.

Susulan 5: Apakah yang berubah terlebih dahulu apabila pengekalan meningkat daripada 24 jam kepada 30 hari?

Pada keadaan mantap, 30 hari adalah kira-kira 86.4 × 30 = 2.592 PB secara logik. Mengekalkan tiga replika tempatan penuh mempunyai batas bawah hampir 7.776 PB, menjadikan kos dan masa pemulihan faktor dominan. Simpan segmen aktif dan terkini pada broker, dan muat naik segmen tertutup yang telah disahkan ke storan objek. Metadata merekodkan lokasi objek dan checksum; ambilan sejarah menggunakan cache atau proksi baca. Pemadaman, main semula, pemadatan (compaction), dan kitaran hayat objek mesti berkongsi satu mesin keadaan pengekalan supaya segmen tempatan tidak sekali-kali dipadamkan sebelum objek jauhnya boleh dibaca.

Sumber awam

Soalan berkaitan

Alat temu duga berkaitan

Gunakan Jawab untuk jawapan reka bentuk sistem

Jelaskan keperluan terlebih dahulu, kemudian teruskan dengan skala, seni bina, pilihan komponen dan pertukaran (trade-off).

Lihat alat