Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

19 September di Moscow mengambil tempat mesyuarat tematik pertama HUG (Highload++ User Group), yang didedikasikan untuk perkhidmatan mikro. Terdapat pembentangan "Perkhidmatan Mikro Operasi: Penting Saiz, Walaupun Anda Mempunyai Kubernetes," di mana kami berkongsi pengalaman luas Flant dalam mengendalikan projek dengan seni bina perkhidmatan mikro. Pertama sekali, ia akan berguna kepada semua pembangun yang berfikir tentang menggunakan pendekatan ini dalam projek semasa atau masa depan mereka.

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

Memperkenalkan video laporan tersebut (50 minit, lebih bermaklumat daripada artikel), serta ekstrak utama daripadanya dalam bentuk teks.

NB: Video dan persembahan juga tersedia di penghujung siaran ini.

Pengenalan

Biasanya cerita yang bagus mempunyai permulaan, plot utama dan resolusi. Laporan ini lebih seperti pendahuluan, dan pada masa itu adalah satu tragis. Ia juga penting untuk ambil perhatian bahawa ia memberikan pandangan orang luar tentang perkhidmatan mikro. Operasi.

Saya akan mulakan dengan graf ini, yang pengarangnya (pada 2015) adalah Martin Fowler:

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

Ia menunjukkan bagaimana, dalam kes aplikasi monolitik yang mencapai nilai tertentu, produktiviti mula merosot. Perkhidmatan mikro berbeza kerana produktiviti awal dengan mereka adalah lebih rendah, tetapi apabila kerumitan meningkat, kemerosotan kecekapan tidak begitu ketara bagi mereka.

Saya akan menambah pada graf ini untuk kes menggunakan Kubernetes:

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

Mengapakah aplikasi dengan perkhidmatan mikro lebih baik? Kerana seni bina sedemikian mengemukakan keperluan serius untuk seni bina, yang seterusnya dilindungi dengan sempurna oleh keupayaan Kubernetes. Sebaliknya, sesetengah fungsi ini berguna untuk monolit, terutamanya kerana monolit biasa hari ini bukanlah monolit (butiran akan disiarkan kemudian dalam laporan).

Seperti yang anda lihat, graf akhir (apabila aplikasi monolitik dan perkhidmatan mikro berada dalam infrastruktur dengan Kubernetes) tidak begitu berbeza daripada yang asal. Seterusnya kita akan bercakap tentang aplikasi yang dikendalikan menggunakan Kubernetes.

Perkhidmatan mikro yang berguna dan berbahaya

Dan inilah idea utama:

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

apa yang normal seni bina perkhidmatan mikro? Ia sepatutnya memberi anda faedah sebenar, meningkatkan kecekapan kerja anda. Jika kita kembali kepada graf, ini ialah:

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

Jika anda memanggilnya berguna, maka pada bahagian lain graf akan ada memudaratkan perkhidmatan mikro (mengganggu kerja):

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

Kembali kepada "idea utama": patutkah saya mempercayai pengalaman saya sama sekali? Sejak awal tahun ni dah tengok 85 projek. Tidak semuanya adalah perkhidmatan mikro (kira-kira satu pertiga hingga separuh daripada mereka mempunyai seni bina sedemikian), tetapi ini masih merupakan jumlah yang besar. Kami (syarikat Flant) sebagai penyumber luar berjaya melihat pelbagai jenis aplikasi dibangunkan dalam kedua-dua syarikat kecil (dengan 5 pembangun) dan dalam yang besar (~500 pembangun). Manfaat tambahan ialah kami melihat aplikasi ini hidup dan berkembang selama bertahun-tahun.

Mengapa perkhidmatan mikro?

Kepada soalan tentang faedah perkhidmatan mikro ada jawapan yang sangat spesifik dari Martin Fowler yang telah disebutkan:

  1. sempadan yang jelas bagi modulariti;
  2. penempatan bebas;
  3. kebebasan memilih teknologi.

Saya telah banyak bercakap dengan arkitek perisian dan pembangun dan bertanya mengapa mereka memerlukan perkhidmatan mikro. Dan saya membuat senarai jangkaan mereka. Inilah yang berlaku:

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

Jika kita menerangkan beberapa perkara "dalam sensasi," maka:

  • sempadan modul yang jelas: di sini kita mempunyai monolit yang dahsyat, dan kini semuanya akan disusun dengan kemas dalam repositori Git, di mana semuanya "di rak", yang hangat dan lembut tidak bercampur;
  • kebebasan penggunaan: kami akan dapat melancarkan perkhidmatan secara bebas supaya pembangunan berjalan lebih pantas (menerbitkan ciri baharu secara selari);
  • kebebasan pembangunan: kami boleh memberikan perkhidmatan mikro ini kepada satu pasukan/pembangun, dan satu kepada satu sama lain, dengan itu kami boleh membangunkan lebih pantas;
  • Π±ΠΎkebolehpercayaan yang lebih besar: jika kemerosotan separa berlaku (satu perkhidmatan mikro daripada 20 jatuh), maka hanya satu butang akan berhenti berfungsi, dan sistem secara keseluruhan akan terus berfungsi.

Seni bina perkhidmatan mikro biasa (memudaratkan).

Untuk menjelaskan mengapa realiti tidak seperti yang kita harapkan, saya akan bentangkan kolektif imej seni bina perkhidmatan mikro berdasarkan pengalaman daripada banyak projek yang berbeza.

Contohnya ialah kedai dalam talian abstrak yang akan bersaing dengan Amazon atau sekurang-kurangnya OZON. Seni bina perkhidmatan mikronya kelihatan seperti ini:

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

Atas gabungan sebab, perkhidmatan mikro ini ditulis pada platform yang berbeza:

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

Memandangkan setiap perkhidmatan mikro mesti mempunyai autonomi, kebanyakan mereka memerlukan pangkalan data dan cache mereka sendiri. Seni bina akhir adalah seperti berikut:

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

Apakah akibatnya?

Fowler mempunyai ini juga ada artikel β€” mengenai "pembayaran" untuk menggunakan perkhidmatan mikro:

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

Dan kita akan lihat jika jangkaan kita tercapai.

Jelaskan sempadan modul...

Tetapi berapa banyak perkhidmatan mikro yang perlu kita betulkan?untuk melancarkan perubahan? Bolehkah kita memikirkan bagaimana semuanya berfungsi tanpa pengesan yang diedarkan (lagipun, sebarang permintaan diproses oleh separuh daripada perkhidmatan mikro)?

Ada corak"ketulan besar kotoranβ€œ, dan di sini ternyata segumpal kotoran yang diedarkan. Untuk mengesahkan ini, berikut ialah ilustrasi anggaran tentang cara permintaan pergi:

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

Kemerdekaan penyebaran...

Secara teknikal, ia telah dicapai: kami boleh melancarkan setiap perkhidmatan mikro secara berasingan. Tetapi dalam amalan anda perlu mengambil kira bahawa ia sentiasa dilancarkan banyak perkhidmatan mikro, dan kita perlu mengambil kira susunan pelancaran mereka. Dengan cara yang baik, kami secara amnya perlu menguji dalam litar berasingan sama ada kami melancarkan pelepasan dalam susunan yang betul.

Kebebasan memilih teknologi...

Dia. Ingatlah bahawa kebebasan sering bersempadan dengan pelanggaran undang-undang. Adalah sangat penting di sini untuk tidak memilih teknologi hanya untuk "bermain" dengannya.

Kemerdekaan pembangunan...

Bagaimana untuk membuat gelung ujian untuk keseluruhan aplikasi (dengan begitu banyak komponen)? Tetapi anda masih perlu memastikan ia dikemas kini. Semua ini membawa kepada hakikat bahawa bilangan litar ujian sebenar, yang pada dasarnya kita boleh mengandungi, ternyata minima.

Dan gunakan semua ini secara tempatan?.. Ternyata selalunya pembangun melakukan kerjanya secara bebas, tetapi "secara rawak", kerana dia terpaksa menunggu sehingga litar bebas untuk ujian.

Penskalaan berasingan...

Ya, tetapi ia terhad dalam kawasan DBMS yang digunakan. Dalam contoh seni bina yang diberikan, Cassandra tidak akan menghadapi masalah, tetapi MySQL dan PostgreSQL akan.

Π‘ΠΎkebolehpercayaan yang lebih besar...

Bukan sahaja kegagalan satu perkhidmatan mikro dalam realitinya sering memecahkan fungsi keseluruhan sistem yang betul, tetapi terdapat juga masalah baharu: menjadikan setiap perkhidmatan mikro toleran kesalahan adalah sangat sukar. Kerana perkhidmatan mikro menggunakan teknologi yang berbeza (memcache, Redis, dll.), Untuk setiap satu anda perlu memikirkan segala-galanya dan melaksanakannya, yang, tentu saja, mungkin, tetapi memerlukan sumber yang besar.

Kebolehukur beban...

Ini memang bagus.

"Keringanan" perkhidmatan mikro...

Kami bukan sahaja mempunyai besar overhed rangkaian (permintaan untuk DNS semakin berganda, dsb.), tetapi juga disebabkan oleh banyak subquery yang kami mulakan data replika (cache kedai), yang membawa kepada jumlah storan yang besar.

Dan inilah hasil daripada memenuhi jangkaan kami:

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

Tetapi bukan itu sahaja!

Kerana:

  • Kemungkinan besar kita akan memerlukan bas mesej.
  • Bagaimana untuk membuat sandaran yang konsisten pada masa yang dikehendaki? Hanya satu sebenar pilihan adalah untuk mematikan trafik untuk ini. Tetapi bagaimana untuk melakukan ini dalam pengeluaran?
  • Jika kita bercakap tentang menyokong beberapa wilayah, maka mengatur kemampanan di setiap wilayah adalah tugas yang sangat intensif buruh.
  • Masalah membuat perubahan berpusat timbul. Sebagai contoh, jika kita perlu mengemas kini versi PHP, kita perlu komited pada setiap repositori (dan terdapat berpuluh-puluh daripadanya).
  • Pertumbuhan dalam kerumitan operasi adalah, begitu sahaja, eksponen.

Apa yang perlu dilakukan dengan semua ini?

Mulakan dengan aplikasi monolitik. pengalaman Fowler ia berkata-kata bahawa hampir semua aplikasi perkhidmatan mikro yang berjaya bermula sebagai monolit yang menjadi terlalu besar dan kemudiannya rosak. Pada masa yang sama, hampir semua sistem yang dibina sebagai perkhidmatan mikro dari awal lagi lambat laun mengalami masalah yang serius.

Satu lagi pemikiran yang berharga ialah agar projek dengan seni bina perkhidmatan mikro berjaya, anda mesti tahu dengan baik dan bidang subjek, dan cara membuat perkhidmatan mikro. Dan cara terbaik untuk mempelajari bidang subjek ialah membuat monolit.

Tetapi bagaimana jika kita sudah berada dalam situasi ini?

Langkah pertama untuk menyelesaikan sebarang masalah adalah bersetuju dengannya dan memahami bahawa ia adalah masalah, yang kita tidak mahu menderita lagi.

Jika, dalam kes monolit yang terlalu besar (apabila kita telah kehabisan peluang untuk membeli sumber tambahan untuknya), kita memotongnya, maka dalam kes ini cerita yang bertentangan ternyata: apabila perkhidmatan mikro yang berlebihan tidak lagi membantu, tetapi menghalang - potong lebihan dan besarkan!

Sebagai contoh, untuk imej kolektif yang dibincangkan di atas...

Buang perkhidmatan mikro yang paling dipersoalkan:

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

Gabungkan semua perkhidmatan mikro yang bertanggungjawab untuk penjanaan bahagian hadapan:

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

... ke dalam satu perkhidmatan mikro, ditulis dalam satu bahasa/rangka kerja (moden dan biasa, seperti yang anda fikirkan sendiri):

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

Ia akan mempunyai satu ORM (satu DBMS) dan pertama beberapa aplikasi:

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

... tetapi secara umum anda boleh memindahkan lebih banyak lagi ke sana, mendapatkan hasil berikut:

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

Selain itu, dalam Kubernetes kami menjalankan semua ini dalam keadaan berasingan, yang bermaksud bahawa kami masih boleh mengukur beban dan menskalakannya secara berasingan.

Untuk Meringkaskan

Lihat gambar yang lebih besar. Selalunya, semua masalah dengan perkhidmatan mikro ini timbul kerana seseorang mengambil tugas mereka, tetapi mahu "bermain dengan perkhidmatan mikro".

Dalam perkataan "perkhidmatan mikro" bahagian "mikro" adalah berlebihan.. Mereka adalah "mikro" hanya kerana ia lebih kecil daripada monolit yang besar. Tetapi jangan menganggap mereka sebagai sesuatu yang kecil.

Dan untuk pemikiran terakhir, mari kembali ke carta asal:

Perkhidmatan Mikro: Saiz penting, walaupun anda mempunyai Kubernetes

Satu nota tertulis di atasnya (kanan atas) bermuara pada hakikat bahawa kemahiran pasukan yang menjadikan projek anda sentiasa utama β€” mereka akan memainkan peranan penting dalam pilihan anda antara perkhidmatan mikro dan monolit. Jika pasukan itu tidak mempunyai kemahiran yang mencukupi, tetapi ia mula membuat perkhidmatan mikro, cerita itu pasti akan membawa maut.

Video dan slaid

Video daripada ucapan (~50 minit; malangnya, ia tidak menyampaikan pelbagai emosi pelawat, yang sebahagian besarnya menentukan mood laporan, tetapi begitulah keadaannya):

Pembentangan laporan:

PS

Laporan lain di blog kami:

Anda juga mungkin berminat dengan penerbitan berikut:

Sumber: www.habr.com

Tambah komen