Gesaan dan skop
Soalan reka bentuk sistem ini menyasarkan peranan platform, infrastruktur awan dan sistem terbenam. Peranti mungkin berada di luar talian selama berminggu-minggu, mempunyai storan terhad, atau membayar untuk lebar jalur selular; imej yang rosak boleh memutuskan sambungan keseluruhan armada. Platform mesti memastikan bahawa hanya peranti yang serasi memasang pakej yang ditandatangani, pelancaran boleh dijeda, dan peranti boleh pulih atau kembali ke versi sebelumnya.
Andaikan satu juta peranti, maksimum 100,000 muat turun setiap hari, dan kemas kini 20 MiB. Kumpulkan peranti mengikut model, semakan perkakasan, rantau dan versi semasa. Jawapan tidak memerlukan AWS; produk awan hanya membantu memperjelas sempadan satah kawalan (control plane) dan satah data (data plane).
Perkara yang dinilai oleh penemu bual
- Sama ada anda mengasingkan integriti pakej, pengesahan penerbit, kebenaran peranti dan pemeriksaan keserasian.
- Sama ada anda mereka bentuk mesin keadaan satah kawalan dan satah data peranti dan bukannya sekadar melukis baldi muat turun.
- Sama ada anda mengira lebar jalur, keserentakan dan ambang henti paksa serta menerangkan jeda, percubaan semula, pengunduran dan peningkatan kepada manusia.
Jawapan yang mantap mentakrifkan "pelancaran berjaya" sebagai pengesahan peranti, pemasangan, but semula dan pengesahan kesihatan, bukan penyiapan muat turun CDN.
Penjelasan sebelum menjawab
- Bolehkah peranti but daripada dua slot? Slot A/B membenarkan penulisan ke slot yang tidak aktif dan berundur semula selepas but gagal; peranti slot tunggal memerlukan pemuat but (bootloader) yang lebih konservatif dan laluan pemulihan di lapangan.
- Adakah terdapat kekangan keselamatan atau serantau? Penyasaran mesti merangkumi model, perkakasan, rantau, keadaan sijil dan versi semasa, bukan hanya label peranti.
- Apakah tarikh akhir kemas kini? Tarikh akhir mengubah saiz kelompok, tetingkap penyelenggaraan, percubaan semula luar talian dan sama ada pemasangan paksa boleh diterima.
- Adakah kegagalan pada peringkat peranti atau kohort? Peranti boleh mencuba semula; kadar kegagalan yang lebih tinggi untuk satu model harus menjeda kohort tersebut dan bukannya berkembang secara global.
Jawapan 30 saat
"Saya akan membahagikan platform kepada repositori pakej yang ditandatangani, satah kawalan keluaran, ejen peranti dan telemetri. Saliran paip keluaran mencipta manifes dengan model, perkakasan, versi, kebergantungan dan tarikh luput, menandatanganinya dalam persekitaran terkawal, dan mewajibkan peranti mengesahkan tandatangan, penghadaman (digest) dan keserasian sebelum pemasangan. Satah kawalan menyasarkan kohort dengan pelancaran kenari, kadar tetap atau eksponen dan menyimpan keadaan bagi setiap peranti dengan ID kerja idempoten. Peranti memuat turun ketulan (chunks) secara boleh sambung semula ke dalam slot tidak aktif, but semula dan melakukan komit hanya selepas pemeriksaan kesihatan lulus. Peningkatan kegagalan, ralat muat turun, pengunduran but atau amaran keselamatan akan menjeda kohort dan mengekalkan versi lama. Peranti luar talian mencuba semula dalam tetingkap penyelenggaraan, dan setiap tindakan boleh diaudit serta dimainkan semula."
Jawapan mendalam langkah demi langkah
Langkah 1: Anggarkan kekangan utama (bottleneck).
Jika satu juta peranti memuat turun 20 MiB, jumlah keseluruhannya adalah kira-kira 20 TiB. Menyelesaikan 100,000 peranti setiap hari adalah kira-kira 2 TiB/hari, atau purata 23.7 MiB/s; waktu puncak memerlukan ruang tambahan untuk keserentakan dan percubaan semula. Storan objek dan CDN mengedarkan pakej. Satah kawalan menghantar manifes dan kebenaran muat turun jangka pendek dan bukannya membiarkan peranti membuat pengundian (polling) ke pangkalan data yang besar.
Langkah 2: Cipta pakej dan manifes yang sahih.
Saliran paip binaan menghasilkan bait tidak berubah (immutable bytes), digest dan manifes. Kunci tandatangan kekal dalam perkhidmatan menandatangani yang terkawal, dan keluaran merekodkan versi penandatangan serta kelulusan. Peranti mempunyai punca kepercayaan (trust root) dan mengesahkan tandatangan, digest pakej, model sasaran, pemuat but minimum, pembilang anti-pengunduran dan tarikh luput. URL muat turun ialah mekanisme pengangkutan, bukan sempadan kepercayaan.
Langkah 3: Asingkan satah kawalan dan data.
Satah kawalan mencipta keluaran, menyelesaikan sasaran, mencipta kohort dan kerja peranti, serta mengeluarkan arahan jeda. Satah data peranti memuat turun ketulan daripada CDN dan melaporkan keadaan ke titik akhir kerja. Setiap peranti mengemas kini (device_id, job_id) secara idempoten, jadi laporan pendua tidak boleh mengubah keadaan secara salah. Keadaan termasuk QUEUED, DOWNLOADING, VERIFIED, INSTALLING, SUCCEEDED, FAILED, ROLLED_BACK dan REJECTED.
Langkah 4: Reka bentuk pemasangan dan pengunduran yang selamat.
Tulis pakej ke slot yang tidak aktif, sahkan setiap ketulan dan manifes akhir, kemudian tukar slot but. Pemuat but merekodkan percubaan dan tarikh akhir pengesahan but. Aplikasi mengesahkan hanya selepas pemeriksaan kesihatan, penderia kritikal dan komunikasi pulih. Kegagalan berulang akan memilih slot lama dan melaporkan puncanya. Peranti slot tunggal memerlukan imej pemulihan atau perkhidmatan di lapangan; ia tidak mendapat keatoman (atomicity) A/B secara percuma.
Langkah 5: Kawal pelancaran.
Mulakan dengan peranti dalaman dan kenari kecil, kemudian kembangkan mengikut model dan rantau. Kadar tetap atau eksponen kedua-duanya sah, tetapi setiap kohort memerlukan keserentakan maksimum, tetingkap penyelenggaraan dan kriteria henti paksa. Ukur ambang bagi setiap kohort dan asingkan kegagalan muat turun, penolakan tandatangan, kegagalan pemasangan, pengunduran but dan masa tamat pemeriksaan kesihatan.
Langkah 6: Kendalikan peranti luar talian, percubaan semula dan audit.
Apabila peranti menyambung semula, ia menuntut kerja yang belum tamat tempoh. Muat turun berketul menggunakan sambung semula dan undur eksponen (exponential backoff); percubaan semula menggunakan semula kerja dan versi pakej yang sama. Peranti yang melepasi tarikh akhirnya memasuki barisan pemulihan dan bukannya ditandakan sebagai berjaya. Satah kawalan mengekalkan kelulusan, manifes, tangkapan kilas sasaran, peralihan keadaan, pelaku (actor) dan sebab jeda untuk main semula dan pematuhan.
Jawapan contoh berkualiti tinggi
"Saya akan mengasingkan satah kawalan, repositori pakej/CDN, ejen peranti dan telemetri. Saliran paip keluaran menghasilkan bait tidak berubah dan manifes yang mengandungi model sasaran, semakan perkakasan, pemuat but minimum, pembilang versi dan digest; perkhidmatan menandatangani terkawal menandatanganinya, dan peranti mengesahkannya dengan punca kepercayaan terbenam. URL muat turun hanya mengangkut bait.
Dengan satu juta peranti, pakej 20 MiB adalah kira-kira 20 TiB, jadi CDN mengendalikan pengedaran manakala satah kawalan menyimpan keadaan keluaran dan kerja setiap peranti. Peranti memuat turun ketulan ke dalam slot tidak aktif, mengesahkan digest, but semula dan melakukan komit hanya selepas pengesahan kesihatan; kegagalan akan memilih slot lama dan melaporkan sebab. Saya bermula dengan kenari, kemudian berkembang mengikut model dan rantau. Setiap kohort mempunyai ambang keserentakan, kadar kegagalan dan kadar pengunduran; melebihi salah satu daripadanya akan menjeda pelancaran dan bukannya menyebarkan imej yang rosak. Peranti luar talian menuntut kerja yang sama dalam tetingkap penyelenggaraan, percubaan semula disambung, serta kelulusan, keadaan dan versi kekal boleh diaudit."
Kesilapan biasa
- Hanya memeriksa HTTPS → keselamatan pengangkutan tidak mengesahkan pakej atau baitnya → sahkan tandatangan manifes dan digest pakej pada peranti.
- Menandakan kejayaan selepas muat turun → pemeriksaan pemasangan, but dan kesihatan masih boleh gagal → jadikan pengesahan but sebagai syarat kejayaan mutlak.
- Melancarkan kepada seluruh armada sekali gus → satu kecacatan keserasian boleh menjejaskan semua → gunakan kenari, kohort, kadar pelancaran dan kriteria henti paksa.
- Mencipta kerja baharu pada setiap percubaan semula → sejarah keadaan dan audit menjadi berpecah-belah → gunakan semula keadaan
(device_id, job_id)yang idempoten. - Membenarkan penurunan taraf (downgrade) sewenang-wenangnya → penyerang boleh memainkan semula imej yang terdedah → gunakan pembilang versi bertandatangan, dasar anti-pengunduran dan senarai pengecualian terkawal.
Susulan dan respons
Susulan 1: Pada 2% pelancaran, satu model mencapai kadar pengunduran but 4%. Apakah yang anda lakukan?
Jeda model dan versi pakej tersebut dengan serta-merta sambil meneruskan pemerhatian terhadap peranti yang berjaya. Pecahkan mengikut semakan perkakasan, pemuat but, rantau dan binaan untuk mencari sempadan keserasian; jika perlu, gunakan versi lama yang disahkan atau arahan pemulihan. Jangan teruskan semata-mata kerana purata seluruh armada adalah rendah.
Susulan 2: Peranti terputus kuasa pada 80% muat turun. Bagaimanakah percubaan seterusnya mengelakkan daripada bermula dari awal?
Tulis ketulan ke dalam slot tidak aktif dan kekalkan versi pakej, digest ketulan, ofset yang disahkan dan keseluruhan digest manifes secara berterusan. Selepas but semula, sahkan ketulan tempatan dan manifes, kemudian minta julat daripada ketulan dipercayai berdampingan yang terakhir. Jika pakej atau tandatangan berubah, buang slot sementara dan bukannya menggabungkan dua versi.
Susulan 3: Bagaimanakah anda menghalang penyerang daripada memainkan semula pakej lama yang sah?
Letakkan pembilang versi monotonik atau versi keselamatan dalam manifes dan kekalkan nilai tertinggi yang diterima pada peranti; pemuat but akan menolak nilai yang lebih rendah. Pengunduran kecemasan memerlukan tandatangan terkawal, kohort eksplisit dan kebenaran terhad masa yang direkodkan dalam audit, supaya titik akhir muat turun biasa tidak boleh memintas dasar anti-pengunduran.