Layanan microser dan perpustakaan bersama

9

Kami merancang sistem berdasarkan pada microservices independen (terhubung melalui bus RabbitMq). Kode akan (untuk komponen pertama setidaknya) ditulis dalam python (baik python2 dan python3). Kami sudah memiliki aplikasi monolit yang mengimplementasikan beberapa logika bisnis, yang ingin kami refactor sebagai layanan microser, dan diperluas. Satu pertanyaan yang membuat saya khawatir adalah:

Apa cara terbaik untuk berbagi kode antara berbagai layanan microser. Kami memiliki fungsi pembantu umum (pemrosesan data, pencatatan, konfigurasi parsing, dll), yang harus digunakan oleh beberapa layanan Microsoft.

Layanan mikro sendiri akan dikembangkan sebagai proyek terpisah (git repositori). Perpustakaan umum dapat dikembangkan sebagai proyek mandiri juga. Bagaimana cara berbagi perpustakaan ini di antara layanan microser?

Saya melihat beberapa pendekatan:

  • salin di sekitar versi perpustakaan yang diperlukan untuk setiap layanan Microsoft, dan perbarui sesuai kebutuhan
  • lepaskan pustaka umum ke PyPi internal, dan daftarkan pustaka tersebut sebagai dependensi dalam persyaratan microservice
  • termasuk repositori perpustakaan sebagai submodule git

Saya ingin membaca lebih banyak tentang pendekatan yang disarankan, praktik terbaik, pengalaman masa lalu sebelum memutuskan bagaimana untuk melanjutkan. Apakah Anda memiliki saran atau tautan?

dangonfast
sumber
Saya sendiri tidak cukup berpengalaman dalam microservices (perusahaan saya baru-baru ini mulai melakukan hal serupa) untuk menjawab, tetapi di sini ada tautan ke presentasi tentang mengapa apa yang Anda gambarkan adalah bendera merah dan dapat mengarah pada "monolit yang didistribusikan" . Layanan Microsoft seharusnya tidak membutuhkan perpustakaan bersama. Mereka seharusnya hanya berkomunikasi antara api yang didefinisikan dengan baik seperti Swagger (sekarang disebut Open API ).
Kapten Man
@ KaptenMan: Tentu, tetapi katakanlah Anda memiliki fungsi sederhana ini: fib(n)(implementasi seri fibonacci). Anda tidak ingin mengulangi implementasi itu di setiap layanan Microsoft. Itu milik utilsperpustakaan (versi, untuk fitur dan perbaikan bug). Itu bukan monolit terdistribusi, itu hanya lapisan fungsi umum. Pertanyaan saya adalah bagaimana menangani layer ini di level implementasi?
dangonfast
Layanan microser kami telah membagikan pustaka untuk memastikan mereka berbicara dengan semua layanan microser lainnya di sistem kami dengan cara yang sama. Saya tidak yakin bagaimana mungkin untuk melakukannya dengan perpustakaan yang tidak dibagikan; minimal semua orang akan memerlukan beberapa libs manipulasi XML / JSON / etc. Saya belum menonton presentasi itu, tetapi apakah Anda memiliki makna yang lebih spesifik tentang "perpustakaan bersama" daripada yang saya pikirkan?
Ixrec
1
@ jeckyll2hide Kami menggunakan C ++, tetapi infrastruktur kami untuk ini kira-kira setara dengan poin kedua Anda: repo yang terpisah, semua orang mendeklarasikan dependensinya, sistem build standar yang tahu bagaimana menemukan dependensi tersebut pada waktu build, dll.
Ixrec
1
Saya merasa seperti boneka, pertanyaan Anda sebenarnya bukan tentang microservices berbagi perpustakaan secara khusus, itu benar-benar bertanya tentang cara berbagi perpustakaan tim Anda dengan tim. Saya cukup tahu tentang itu untuk mengirim jawaban.
Kapten Man

Jawaban:

5

Pilihan kedua Anda jelas merupakan cara yang harus dilakukan. Bongkar perpustakaan umum dan instal ke server PyPi lokal Anda.

Opsi 1 mengerikan karena perbaikan pada perpustakaan akan sulit disebarkan ke orang lain yang bisa menggunakannya.

Opsi 3 mirip dengan opsi 1.

Pola umum adalah untuk mensetup Jenkins sehingga saat Anda mendorong untuk menguasai repo pustaka, ia melakukan pembangunan python dan mengunggahnya secara otomatis ke repo PyPi. Setelah Anda menulis skrip bangunan ini, Anda tidak perlu khawatir tentang pengemasan perpustakaan dan mengunggahnya secara manual ke PyPi. Dan dengan opsi ini, semua pembaruan perpustakaan akan tersedia secara instan untuk dapat ditingkatkan ke layanan microser lainnya.

Menyiapkan server PyPi Anda sendiri sangat mudah. Saya suka panduan ini

Tommy
sumber
1
Saya setuju bahwa opsi 2 adalah yang terbaik, tetapi opsi 3 dengan submodules memiliki lebih banyak kesamaan dengan opsi 2 daripada opsi 1.
8bittree
@ 8bittree: ya, opsi 3 mirip dengan opsi 2, tetapi memiliki server git (remote "sentral") menjadi mekanisme distribusi paket. Di satu sisi ia menggunakan git untuk sesuatu yang tidak (manajemen ketergantungan), di sisi lain ia mengurangi jumlah komponen (tidak perlu PyPi pribadi)
dangonfast
2

Bukan orang Python tetapi server PyPi tampaknya merupakan pilihan terbaik. Googling cepat memberikan tampilan yang analog dengan repo Nexus untuk toples Java tim.

Benar-benar selama itu sedang digunakan untuk semacam repositori pusat (ke kantor / tim) bahwa alat manajemen ketergantungan pilihan Anda dapat bekerja dengan (membaca dari dan menyebarkan ke) maka itu adalah pilihan yang baik.

Opsi 1 benar-benar yang terburuk, Anda tidak harus berurusan secara manual dengan dependensi. Ini menyakitkan. Di perguruan tinggi sebelum saya tahu tentang Maven dan ketika saya pikir Git terlalu rumit, kami melakukan semuanya secara manual, dari menggabungkan kode semua orang, mengatur jalur kelas, hingga meraih dependensi. Sungguh menyakitkan, saya benar-benar tidak ingin ada orang yang melewati sebagian kecil dari masalah itu, terutama di lingkungan kerja di mana efisiensi sangat penting.

Opsi 3 mungkin akan berfungsi dengan baik, tetapi tidak memiliki manfaat nyata di atas PyPi lokal (selain mungkin lebih mudah diatur, tetapi manfaat sistem manajemen ketergantungan nyata jauh lebih baik).

Kapten Man
sumber
1

Pertama-tama, memecah monolit menjadi layanan mikro akan selalu sulit. Lihat Manajemen Data Terdesentralisasi - merangkum basis data ke dalam layanan mikro untuk mengetahui alasannya.

Konon, ada beberapa resep cara melakukannya yang relatif waras. Salah satunya adalah http://12factor.net/ . Yang akan mengatakan bahwa Anda harus memelihara setiap perpustakaan dan aplikasi secara mandiri, kemudian mengelola dependensi secara eksplisit. Jika Anda pergi dengan rute itu maka saya akan SANGAT menyarankan Anda memiliki perintah sederhana yang memperbarui semua dependensi ke apa pun saat ini, dan Anda menjalankannya secara teratur untuk setiap layanan mikro. Penting untuk memiliki proses rilis yang waras di mana Anda mengunci versi perpustakaan dalam produksi. Namun Anda benar-benar, benar-benar , benar-benar tidak ingin berada di posisi di mana dependensi mendapatkan basi dan Anda tidak tahu apa yang sudah ada.

Juga fokus untuk membuat perpustakaan dukungan Anda sekencang dan sefokus mungkin. Akan selalu ada daya tarik alami untuk mulai menambahkan hal-hal ke perpustakaan inti agar mudah dibagikan. Lakukan itu, dan Anda akan dengan cepat menarik seluruh bola spageti yang ada ke perpustakaan bersama dan secara efektif kembali ke kekacauan yang Anda miliki sekarang. Karena itu, lebih baik mengoreksi cara lain.

btilly
sumber
0

Anda harus dapat membuka server dengan menunjuk langsung dari file dependensi paket Python ke repo GitHub pribadi yang berisi pustaka. Pipenv dan Penyair sama-sama mendukung ini, saya percaya.

Dogweather
sumber