Apabila saya pertama kali memutuskan untuk memindahkan stack backend kami daripada Python ke Rust, ia bukan sekadar rasa ingin tahu – sebaliknya, ia lahir daripada masalah sebenar berkaitan prestasi dan pelaksanaan./Apabila saya pertama kali memutuskan untuk memindahkan stack backend kami daripada Python ke Rust, ia bukan sekadar rasa ingin tahu – sebaliknya, ia lahir daripada masalah sebenar berkaitan prestasi dan pelaksanaan./

Pengajaran yang Dipelajari daripada Menukar daripada Python kepada Rust/

Apabila saya pertama kali memutuskan untuk memindahkan stok backend kami daripada Python kepada Rust, ia bukan sekadar rasa ingin tahu – sebaliknya, ia lahir daripada keperluan yang benar-benar mendesak dalam hal prestasi, kos pelaksanaan, dan kebolehpercayaan di bawah beban. Ekosistem web Python – terutamanya FastAPI – sangat menyeronokkan untuk digunakan kerana produktiviti dan iterasi yang pantas. Namun apabila trafik kami semakin meningkat dan had prestasi mula kelihatan, saya ingin mengetahui apa yang boleh ditawarkan oleh Rust.

Dalam artikel ini, saya akan berkongsi pengalaman yang saya peroleh sepanjang perjalanan tersebut: kelebihan, kelemahan, serta bidang-bidang di mana setiap ekosistem masih bersinar.

Pengajaran Daripada Menukar dari Python ke Rust

Pertandingan Prestasi: Rust (Actix-Web) vs. Python (FastAPI)

Keluaran Mentah dan Latensi

Salah satu perkara pertama yang mengejutkan saya ketika menjalankan ujian prestasi ialah betapa berbeza profil prestasi antara rangka kerja web Rust dan Python.

Dalam pelbagai ujian bebas, Rust’s Actix-Web sentiasa mengatasi FastAPI dari segi jumlah permintaan per saat dan kecekapan memori. Dalam satu ujian komuniti, Actix-Web dapat menangani ribuan permintaan lebih banyak setiap saat dengan latensi yang lebih rendah dan penggunaan memori yang jauh lebih rendah berbanding FastAPI.

Ini selaras dengan pemerhatian yang lebih luas bahawa abstraksi kos sifar dan tiadanya pemungut sampah dalam Rust menjadikannya sangat cekap apabila menyediakan perkhidmatan HTTP pada skala besar.

Menurut pengalaman saya, ini membawa kepada:

  • Keluaran berterusan yang jauh lebih tinggi dalam ujian tekanan.
  • Ketidakstabilan yang lebih rendah di bawah beban.
  • Penggunaan memori masa rehat yang lebih rendah berbanding proses Python.

Namun begitu, ujian hanya memberikan sebahagian daripada cerita: kekangan dunia sebenar sering kali bergantung pada pangkalan data atau rangkaian. Bagi banyak aplikasi, prestasi FastAPI sudah lebih daripada mencukupi, dan penyesuaian akses pangkalan data atau caching memberikan hasil yang lebih baik berbanding hanya memilih bahasa sahaja.

Menukar paradigma ORM merupakan salah satu bahagian yang paling berbeza secara budaya dalam proses pemindahan tersebut.

Dalam Python, kami menggunakan SQLAlchemy dengan migrasi Alembic – satu pendekatan yang membandingkan model anda dan menghasilkan skrip migrasi secara automatik.

Dalam Rust, kami beralih kepada Diesel, yang mengambil pendirian yang sangat berbeza:

  • Migrasi ditulis secara manual sebagai fail SQL yang jelas.
  • Tiada alat pembandingan automatik.
  • Anda diberikan lebih banyak kawalan – dan juga lebih banyak tanggungjawab.

Pada mulanya, ini agak mengecewakan, tetapi disiplin menulis migrasi secara manual membawa kepada pengauditan yang lebih jelas dan kurang kejutan dalam persekitaran pengeluaran.

Di sinilah Diesel benar-benar mengubah cara saya memikirkan kod pangkalan data: keselamatan jenis pada waktu pengkompaian.

Diesel menghasilkan jenis Rust berdasarkan skema anda, jadi nama kolom yang tidak sepadan atau konstruksi query yang tidak sah langsung tidak akan terkompilasi. Konsep seperti check_for_backend dan keperluan untuk mendeklarasikan table_name secara eksplisit bermakna bahawa keseluruhan kelas pepijat biasa hilang sebelum anda sempat menjalankan sebarang query.

Sebagai perbandingan, SQLAlchemy hanya menangkap banyak kesilapan pada waktu run-time. Walaupun ini menambah fleksibiliti, ia juga bermakna lebih banyak bergantung pada ujian untuk memastikan ketepatan.

Penyusun query Diesel menggunakan sistem jenis Rust dan memerlukan lebih banyak baris kod berbanding gaya ekspresif yang lebih dinamik dalam SQLAlchemy – tetapi ganjarannya ialah pengkompaian membuktikan banyak perkara untuk anda.

Selepas tempoh penyesuaian, saya mula menghargai bagaimana kejelasan Rust membantu apabila menavigasi logik query yang kompleks semasa pembetulan.

Satu bidang di mana Python masih terasa lebih maju secara luaran ialah penghasilan skema API.

FastAPI secara automatik menghasilkan dokumentasi OpenAPI dan dilengkapi dengan antara muka pelayar seperti ReDoc dan Swagger UI di /docs dan /redoc, menjadikannya sangat mudah bagi para pelanggan dan rakan sekerja untuk memahami dan meneroka API anda.

Ekosistem Rust sedang berkembang dalam hal ini. Alat seperti utoipa boleh menghasilkan spesifikasi OpenAPI untuk Actix-Web, tetapi alat-alat tersebut terasa lebih manual dan terpisah berbanding pengalaman lancar FastAPI. Terdapat juga crate komuniti untuk menyediakan antara muka Swagger atau Redoc, tetapi ia memerlukan persediaan dan anotasi tambahan.

Saya menjangkakan jurang ini akan terus mengecil – terdapat usaha aktif dalam komuniti Rust untuk membawa pengalaman dokumentasi API yang lebih lancar, sekurang-kurangnya setanding dengan FastAPI.

Pengkompaian Rust terkenal lebih lambat berbanding bahasa yang ditafsirkan. Semasa pembangunan, penyusunan semula – terutamanya dengan crate yang besar – boleh terasa perlahan berbanding menjalankan semula skrip Python.

Namun, kos ini ialah masa pembangunan, bukan masa pengeluaran. Setelah dikompilasi, binari Rust adalah:

  • Sepenuhnya dikompilasi terlebih dahulu
  • Berdiri sendiri (tiada virtualenv, biasanya tiada kepeluhan dinamik)
  • Memori yang sangat kecil dalam imej kontena

Ini menjadikan pelaksanaan lebih mudah dan lebih mudah diramalkan.

Aplikasi Python sering kali membawa graf kepeluhan yang besar: FastAPI sendiri, uvicorn, pydantic (kini jauh lebih pantas berkat dalaman Rust), pemacu pangkalan data, dan lain-lain.

Ini meningkatkan:

  • Saiz kontena
  • Kesukaran pembinaan
  • Permukaan untuk konflik kepeluhan

Rust’s Cargo menghasilkan satu binari yang merangkumi segala-galanya (biasanya), yang secara drastik mempermudah urusan pelaksanaan.

Inilah bidang yang mungkin membawa pertumbuhan personal paling besar.

Rust menggesa anda untuk menetapkan sempadan kepemilikan yang jelas, menangani kesilapan secara eksplisit, dan merancang dengan teliti. Apabila anda telah menghayati kesilapan pengkompaian Rust, pengkompaian itu sendiri menjadi pagar yang kukuh untuk menghalang kemunduran.

Sebaliknya, dinamisme Python boleh terasa mudah semasa awal pembangunan – tetapi fleksibiliti yang sama kadangkala membawa kepada pepijat yang lebih sukar didiagnosis dalam pengeluaran jika tidak disokong oleh suite ujian yang kukuh.

Kod Rust kami terasa lebih teguh semasa pembetulan besar, sebahagian besarnya berkat ketegasan pengkompaian.

Integrasi FastAPI dengan OpenAPI, bersama-sama dengan ReDoc dan Swagger UI, menjadikan onboarding pembangun baharu sangat mudah. Ini merupakan salah satu kejayaan terbesar yang saya lihat dalam produktiviti pasukan.

Alat dokumentasi binaan Rust (cargo doc) sangat hebat untuk dokumentasi tahap kod. Ia menggalakkan penulisan dokumentasi bersebelahan dengan kod anda, dan Rustdoc menghasilkan dokumentasi HTML yang bersih dan mudah dicari.

Walaupun ini tidak menggantikan titik akhir /docs yang cantik secara luaran, ia sangat meningkatkan kualiti dan kebolehcapaian dokumentasi yang berpusat pada kod.

Menukar dari Python ke Rust untuk pembangunan backend bukanlah tentang mengutamakan satu bahasa berbanding bahasa yang lain – sebaliknya, ia tentang menyelaraskan dengan keutamaan projek kami.

  • Rust memberikan kami prestasi, kebolehpastian, dan kebolehpercayaan dalam trafik pengeluaran.
  • Python memberikan kami kelajuan pembangunan dan ergonomi bertaraf dunia.

Kedua-dua ekosistem ini sangat berkuasa. Apa yang berubah dengan Rust ialah banyak isu yang hanya akan muncul pada waktu run-time dalam Python kini ditangkap pada waktu pengkompaian dalam Rust, mengurangkan kejutan dan gangguan.

Memilih Rust bermakna melabur dalam kurva pembelajaran – tetapi bagi pasukan yang meletakkan prestasi dan ketepatan sebagai keutamaan utama, pertukaran ini berbaloi untuk kami.

Artikel ini ditulis oleh pencipta Hytale Multiplayer, sebuah laman web yang fokus pada artikel teknikal dan analisis mendalam mengenai permainan Hytale, termasuk pembangunan pelayan, alat-alat, serta perbandingan dengan ekosistem berkaitan seperti Minecraft. Jika anda gemar kandungan praktikal yang berorientasikan kejuruteraan, sila teroka lebih banyak artikel di sana.

Komen
/
Penafian: Artikel yang disiarkan semula di laman web ini diperoleh daripada platform awam dan disediakan untuk tujuan maklumat sahaja. Mereka tidak semestinya mencerminkan pandangan MEXC. Semua hak kekal dengan pengarang asal. Jika anda percaya ada kandungan yang melanggar hak pihak ketiga, sila hubungi [email protected] untuk dialih keluar. MEXC tidak memberi jaminan mengenai ketepatan, kesempurnaan atau ketepatan masa kandungan dan tidak bertanggungjawab terhadap sebarang tindakan yang diambil berdasarkan maklumat yang diberikan. Kandungan itu tidak membentuk nasihat kewangan, undang-undang atau profesional lain, dan ia juga tidak boleh dianggap sebagai cadangan atau pengesahan oleh MEXC.