Membangun ekosistem Python untuk pengembangan yang efisien dan andal, PlatoBlockchain Data Intelligence. Pencarian Vertikal. Ai.

Membangun ekosistem Python untuk pengembangan yang efisien dan andal

Tl;dr: Posting blog ini menjelaskan bagaimana kami mengembangkan ekosistem Python yang efisien dan andal menggunakan Pants, sistem build open source, dan memecahkan tantangan mengelola aplikasi Python dalam skala besar di Coinbase.

Oleh Tim Platform Komputasi Coinbase

Python adalah salah satu bahasa pemrograman yang paling sering digunakan untuk ilmuwan data, praktisi pembelajaran mesin, dan peneliti blockchain di Coinbase. Selama beberapa tahun terakhir, kami telah menyaksikan pertumbuhan aplikasi Python yang bertujuan untuk memecahkan banyak masalah yang menantang di dunia cryptocurrency seperti saluran data Airflow, alat analitik blockchain, aplikasi pembelajaran mesin, dan banyak lainnya. Berdasarkan data internal kami, jumlah aplikasi Python hampir dua kali lipat sejak Q3 2022. Menurut data internal kami, saat ini ada sekitar 1,500 pipeline pemrosesan data dan layanan yang dikembangkan dengan Python. Jumlah total build adalah sekitar 500 per minggu pada saat penulisan. Kami memperkirakan aplikasi yang lebih luas karena lebih banyak kerangka kerja Python sentris (seperti Ray, Modin, DASK, dll.) diadopsi ke dalam ekosistem data kami.

Keberhasilan teknik sebagian besar berasal dari pemilihan alat yang tepat. Membangun ekosistem Python skala besar untuk mendukung persyaratan teknik kami yang berkembang dapat menimbulkan beberapa tantangan, termasuk menggunakan sistem pembangunan yang andal, manajemen ketergantungan yang fleksibel, rilis perangkat lunak yang cepat, dan pemeriksaan kualitas kode yang konsisten. Namun, tantangan ini dapat diatasi dengan mengintegrasikan Celana, sistem build yang dikembangkan oleh lab Toolchain, ke dalam infrastruktur build Coinbase. Kami memilih ini sebagai sistem pembangunan Python karena alasan berikut:

  1. Celana ergonomis dan mudah digunakan,
  2. Pants mengerti banyak perintah yang berhubungan dengan build, seperti โ€œtestโ€, โ€œlintโ€, โ€œfmtโ€, โ€œtypecheckโ€, dan โ€œpackageโ€
  3. Pants dirancang dengan penggunaan Python dunia nyata sebagai kasus penggunaan kelas satu, termasuk menangani dependensi pihak ketiga. Bahkan, bagian dari Pants sendiri ditulis dengan Python (selebihnya ditulis dalam Rust).
  4. Pants membutuhkan lebih sedikit metadata dan file boilerplate BUILD daripada alat lain, berkat inferensi ketergantungan, default yang masuk akal dan pembuatan otomatis file BUILD. Bazel membutuhkan sejumlah besar boilerplate BUILD tulisan tangan.
  5. Pants mudah untuk diperluas, dengan API plugin yang kuat yang menggunakan kode async Python 3 idiomatik, sehingga pengguna dapat memiliki aliran kontrol alami di plugin mereka.
  6. Pants memiliki tata kelola OSS yang sebenarnya, di mana setiap organisasi dapat memainkan peran yang setara.
  7. Celana memiliki kurva belajar yang lembut. Ini memiliki gesekan yang jauh lebih sedikit daripada alat lainnya. Biaya perawatannya moderat berkat pengalaman pemasangan alat sekali klik dan file konfigurasi sederhana.

Python adalah salah satu yang paling populer bahasa pemrograman untuk pembelajaran mesin dan aplikasi ilmu data. Namun, sebelum mengadopsi sistem pembangunan pertama Python, Pants, investasi internal kami di ekosistem Python rendah dibandingkan dengan Golang dan Ruby โ€” pilihan utama untuk layanan penulisan dan aplikasi web di Coinbase.

Menurut statistik penggunaan monorepo Coinbase, Python saat ini hanya menyumbang 4% dari penggunaan karena kurangnya dukungan sistem build. Sebelum tahun 2021, sebagian besar proyek Python berada di beberapa repositori tanpa infrastruktur pembangunan terpadu โ€” yang menyebabkan masalah berikut:

  1. Tantangan dengan berbagi kode: Proses bagi seorang insinyur untuk memperbarui perpustakaan bersama sangat rumit. Perubahan yang dibuat pada kode dipublikasikan ke server PyPI internal sebelum terbukti lebih stabil. Pustaka yang dimutakhirkan ke versi baru, tetapi belum menjalani pengujian yang cukup, berpotensi merusak dependensi yang menggunakan pustaka tanpa versi yang disematkan.
  2. Kurangnya proses rilis yang efisien: Perubahan kode seringkali membutuhkan pembaruan dan rilis lintas-repositori yang rumit. Tidak ada alur kerja otomatis untuk melakukan integrasi dan uji pementasan untuk perubahan yang relevan. Kurangnya observabilitas dan keandalan yang koheren memaksakan overhead rekayasa yang luar biasa.
  3. Pengalaman pengembangan yang tidak konsisten: Pengalaman pengembangan sangat bervariasi karena setiap repositori memiliki caranya sendiri dalam pengaturan lingkungan virtual, pemeriksaan kualitas kode, pembuatan dan penerapan, dll.

Kami memutuskan untuk membangun PyNest โ€” โ€œmonorepoโ€ Python baru untuk organisasi data di Coinbase. Kami tidak bermaksud agar PyNest digunakan sebagai monorepo untuk seluruh perusahaan, melainkan repositori digunakan untuk proyek dalam organisasi data.

  1. Membangun monorepo di seluruh perusahaan membutuhkan tim elit. Kami tidak memiliki cukup kru untuk mereproduksi kisah sukses monorepos di Facebook, Twitter, dan Google.
  2. Python terutama digunakan dalam data org di perusahaan. Penting untuk menetapkan cakupan yang tepat sehingga kami dapat fokus pada prioritas data tanpa terganggu oleh persyaratan ad hoc. Infrastruktur pembangunan PyNest dapat digunakan kembali oleh tim lain untuk mempercepat repositori Python mereka.
  3. Diinginkan untuk mengkonsolidasikan proyek yang saling bergantung (lihat grafik ketergantungan untuk proyek platform ML) ke dalam satu repositori untuk mencegah ketergantungan siklik yang tidak disengaja.
Membangun ekosistem Python untuk pengembangan yang efisien dan andal, PlatoBlockchain Data Intelligence. Pencarian Vertikal. Ai.

Gambar 1. Grafik ketergantungan untuk proyek platform pembelajaran mesin (MLP).

  1. Meskipun monorepo menjanjikan dunia produktivitas baru, itu terbukti bukan solusi jangka panjang untuk Coinbase. Monorepo Golang adalah pelajaran, di mana masalah muncul setelah satu tahun penggunaan seperti basis kode yang luas, integrasi IDE yang gagal, CI/CD yang lambat, dependensi yang kedaluwarsa, dll.
  2. Proyek open source harus disimpan dalam repositori individu.

Grafik di bawah ini menunjukkan arsitektur repositori di Coinbase, di mana blok hijau menunjukkan ekosistem Python baru yang telah kami bangun. Pengoperasian antar-repositori dicapai dengan melayani lapisan termasuk artefak kode dan registri skema.

Gambar 2. Arsitektur repositori di Coinbase

# ketergantungan pihak ketiga

# ketergantungan pihak ketigapihak ketigaketergantungan1BANGUNrequirements.txtresolve1.lock # lockfileโ”‚ โ”‚ketergantungan2BANGUNrequirements.txtresolve2.lock...โ”‚# perpustakaan bersamalibโ”‚# folder proyek tingkat atasproyek1 # nama proyeksrcpythondatabricksBANGUNPEMILIKgateway.py...buku catatanBANGUNPEMILIKetl_job.py...tespythondatabricksBANGUNgateway_test.py...buku catatanBANGUNetl_job_test.py...proyek2...โ”‚# File buruh pelabuhanfile buruh pelabuhanโ”‚# alat untuk serat, pemformatan, dll.alatโ”‚# Alur kerja CI Buildkite.buildkitepipeline.ymlkaitโ”‚# Perpustakaan celanacelanacelana. tomlpants.ci.toml

Gambar 3. Struktur repositori Pynest

Berikut ini adalah daftar elemen utama dari repositori dan penjelasannya.

1. pihak ketiga

Ketergantungan pihak ketiga ditempatkan di bawah folder ini. Pants akan mengurai file requirements.txt dan secara otomatis menghasilkan target โ€œpython_requirementโ€ untuk setiap dependensi. Beberapa versi dari ketergantungan yang sama didukung oleh fitur multiple lockfiles dari Pants. Fitur ini memungkinkan proyek untuk memiliki konflik baik dalam ketergantungan langsung atau transitif. Pants menghasilkan file kunci untuk menyematkan setiap ketergantungan dan memastikan build yang dapat direproduksi. Penjelasan lebih lanjut tentang kunci ganda celana ada di manajemen ketergantungan bagian.

2. Libi

Pustaka bersama yang dapat diakses oleh semua proyek. Proyek dalam PyNest dapat langsung mengimpor kode sumber. Untuk proyek di luar PyNest, perpustakaan dapat diakses melalui pip menginstal file roda dari server internal PyPI.

3. Folder proyek

Proyek individu tinggal di folder ini. Jalur folder diformat sebagai โ€œ{project_name}/{src or test}/python/{namespace}โ€. Root sumber dikonfigurasi sebagai "src/python" atau "test/python", dan namespace di bawahnya digunakan untuk mengisolasi modul.

4. File pemilik kode

File pemilik kode (OWNERS) ditambahkan ke folder untuk menentukan individu atau tim yang bertanggung jawab atas kode di pohon folder. Alur kerja CI memanggil skrip untuk mengkompilasi semua file OWNERS menjadi file CODEOWNERS di bawah ".github/". Aturan persetujuan pemilik kode mengharuskan semua permintaan tarik memiliki setidaknya satu persetujuan dari grup pemilik kode sebelum dapat digabungkan.

5. Alat

Folder Tools berisi file konfigurasi untuk alat kualitas kode, misalnya flake8, black, isort, mypy, dll. File-file ini direferensikan oleh Pants untuk mengkonfigurasi linter.

6. Alur kerja buildkite

Coinbase menggunakan Buildkite sebagai platform CI. Alur kerja Buildkite dan definisi kait didefinisikan dalam folder ini. Alur kerja CI mendefinisikan langkah-langkah seperti:

  • Periksa apakah file kunci ketergantungan perlu diperbarui.
  • Jalankan lints dan alat kualitas kode.
  • Buat kode sumber dan gambar buruh pelabuhan.
  • Menjalankan pengujian unit dan integrasi.
  • Menghasilkan laporan cakupan kode.

7. File Docker

Dockerfiles didefinisikan dalam folder ini. Gambar buruh pelabuhan dibangun oleh alur kerja CI dan disebarkan oleh Codeflow โ€” platform penerapan internal di Coinbase.

8. Perpustakaan celana

Folder ini berisi skrip Pants dan file konfigurasi (pants.toml, pants.ci.toml).

Artikel ini menjelaskan cara kami membangun PyNest menggunakan sistem pembuatan Pants. Dalam posting blog kami berikutnya, kami akan menjelaskan manajemen ketergantungan dan CI/CD.

Stempel Waktu:

Lebih dari Coinbase