Sistem yang diagihkan: Apabila anda perlu membinanya, dan bagaimana untuk skala. Panduan langkah demi langkah.

Gambar oleh Jeremy McKnight pada Unsplash

Ia selalu menyerang saya berapa ramai pemaju muda yang menderita sindrom penipu ketika mereka mula membuat produk mereka.

Saya dapati, terdapat banyak contoh-contoh syarikat-syarikat terkemuka yang mempunyai sistem teragih yang sangat kompleks yang dapat menangani berbilion permintaan, dengan semangat menaikkan beratus-ratus aplikasi tanpa sebarang downtime, pulih dari bencana dalam beberapa saat, melepaskan setiap 60 minit, dan mempunyai kelajuan cahaya masa tindak balas dari mana-mana sahaja di dunia.

Harapan ini boleh menjadi sangat menggembirakan apabila anda memulakan projek anda. Tetapi seperti yang sudah anda ketahui, majoriti syarikat-syarikat ini telah memulakan dengan sistem berdaya maju dan tumpuan teknologi yang sangat miskin. Terdapat sebab mudah untuk itu: mereka tidak memerlukannya apabila mereka mula. Membelanjakan lebih banyak masa merancang sistem anda dan bukan pengekodan boleh menyebabkan anda gagal.

Artikel ini adalah langkah demi langkah bagaimana untuk membimbing. Saya akan menunjukkan kepada anda bagaimana, pada Visage, kami memulakan dengan sistem terkecil yang pernah dan membina sistem diedarkan berskala tinggi asas yang tinggi. Ini adalah kajian kes yang nyata untuk menghilangkan kompleks anda jika anda tidak pernah mempunyai peluang untuk melakukannya sendiri.

Apabila saya mula-mula tiba di Visage sebagai CTO, saya adalah satu-satunya jurutera. Saya tidak tahu apa-apa mengenai timbunan teknologi, tetapi saya menyertai kerana saya sangat menyukai idea untuk dapat merekrut tanpa perekrut dalaman atau perkhidmatan HR. Ini adalah idea utama di belakang Visage: crowdsourcing yang dikuasai oleh banyak perekrut yang tidak dapat dilihat bekerja bersama-sama dengan peranan anda yang dibantu oleh kecerdasan buatan yang akan mencari bakat yang paling sesuai untuk anda dalam masa beberapa hari. Kemudian anda terlibat secara langsung dengan mereka, tidak ada orang tengah.

"Orang ramai" dalam kumpulan orang ramai serta-merta mencetuskan otak kejuruteraan saya: terdapat banyak orang, bekerja serentak, mengharapkan prestasi baik dari mana saja di dunia. Saya suka cabaran itu.

Tetapi sistem bijak, perkara-perkara yang buruk, buruk sekali. Inilah yang saya dapati apabila saya tiba:

  • Contoh Wordpress yang dikompromi menjalankan beratus-ratus plugin cacat ketinggalan zaman, berjalan di VM pada pelayan yang dikongsi
  • Peti mel yang dikompromi
  • Tumpuan tan Google Docs dan Spreadsheets.

Dan ini adalah perkara biasa. Sekali lagi, tidak ada ahli teknikal dalam pasukan itu, dan saya telah menjangkakan sesuatu seperti ini. Masih pasukan telah memberi tumpuan kepada peluang perniagaan dan membuat produk kelihatan seperti ia bekerja secara ajaib sambil melakukan segala-galanya secara manual! (Palsu sehingga anda membuatnya). Dan itulah yang sangat menakjubkan.

Sistem pertama kami (Ya, ia disedut tetapi kerja itu)!

Tidak menghairankan bahawa tugas pertama saya adalah untuk mencipta semula VM, memasang semula versi Wordpress yang dikemas kini, pastikan semua orang menukar kata laluan mereka, menubuhkan dasar kata laluan dan mengeluarkan berpuluh-puluh malware di komputer syarikat ... tetapi mari beralih kepada pertimbangan sistem.

Dari Wordpress ke aplikasi web

Tumpuan pertama anda apabila anda mula membina produk haruslah menjadi data. Data adalah apa yang mendorong nilai syarikat anda. Ia akan menjadi apa yang anda gunakan setiap hari untuk membuat keputusan, dan apa yang anda tunjukkan kepada pelabur anda untuk menunjukkan kemajuan.

Anda perlu memahami data anda, dan memungut data anda dari pelbagai sumber dengan format yang berbeza akan menjadi satu pembaziran masa yang besar. Wordpress boleh menjadi pilihan yang sangat baik dalam banyak kes dengan menjimatkan banyak masa kejuruteraan, tetapi untuk keperluan mereka, pasukan Visage terpaksa memasang plugin mewah yang tidak dikekalkan lagi. Akibatnya, kami tidak mempunyai kawalan ke atas model data yang dijanakan, dan data yang tidak sesuai dengan model telah tersebar di dalam berpuluh-puluh dokumen dan spreadsheet.

Jadi, jika ada produk di luar sana yang sudah memenuhi 90% keperluan anda, fikirkan model data yang ideal dan reka bentuk dan laksanakan produk berdaya maju (MVP) yang dapat memegang semua data anda.

Kemudian fikir API. Permohonan anda mesti mempunyai API, ia akan menjadi kritikal apabila anda akhirnya menjualnya. Jangan segera naikkan skala, tetapi kod dengan skalabiliti dalam fikiran. Buat API anda tanpa status dan sebagai RESTful seperti yang anda mungkin dapat kerana semua orang akan mengharapkan untuk dapat menanya menggunakan kaedah HTTP standard.

Kami memilih NodeJS dalam kes kami, kerana kebanyakan kod kami hanya akan memproses input dan output. NodeJS tidak menyekat dan dilengkapi dengan perpustakaan yang mudah untuk mereka bentuk API: ExpressJS.

Jika anda memerlukan laman web yang menghadap pelanggan, anda mempunyai beberapa pilihan. Mula-mula anda boleh membuat lapisan dalam pelayan aplikasi anda yang akan menghasilkan halaman anda atau anda boleh membina aplikasi Single Page Javascript yang akan disampaikan oleh server hosting web statik.

Di Visage, kami pergi untuk pilihan kedua dan memutuskan untuk membuat satu aplikasi untuk pengguna dan satu untuk admin. Ini semata-mata kerana kita akan mempunyai jangkaan yang lebih besar untuk pengguna daripada yang kita perlukan dengan admin, dan ingin menyimpan kedua-dua pangkalan data mudah (juga, untuk pertimbangan CORS di kemudian hari). Inilah sistem kami seperti:

Semua data dalam satu tempat

Delegasikan penyimpanan data sensitif pada awal

Kecuali ia penting untuk perniagaan anda, tidak ada alasan yang baik untuk menyimpan data peribadi sensitif dalam sistem anda. Keselamatan adalah perkara yang rumit, dan jika anda mengubah kod anda setiap hari sehingga anda dapat memasuki pasaran produk anda, ia akan pecah. Anggapkan bahawa sesiapa yang tidak sengaja boleh melanggar permohonan anda jika mereka benar-benar mahu.

Kunci di sini adalah untuk tidak memegang apa-apa data yang akan menjadi kemenangan cepat untuk penggodam. Tiada siapa yang merompak sebuah bank yang tidak mempunyai wang. Jika anda merancang produk SaaS, anda mungkin memerlukan pengesahan dan pembayaran dalam talian. Terdapat banyak pihak ketiga yang anda boleh menggabungkan dengan yang akan menangani dengan cara yang lebih baik daripada yang mungkin anda boleh.

Auth0, sebagai contoh, adalah pihak ketiga yang paling terkenal untuk mengendalikan Pengesahan. Stripe juga merupakan pilihan yang baik untuk pembayaran dalam talian. Mereka akan mendedikasikan semua sumber dan pasukan kejuruteraan keselamatan terbaik di planet ini untuk memastikan data anda selamat - atau mereka tidak mempunyai perniagaan.

Tanda sebenar pada kereta di San Francisco

Perkhidmatan awan adalah kawan terbaik anda

Oleh itu, pada masa ini, kami mempunyai satu cara untuk menyimpan semua data, pengesahan, pembayaran dalam talian, dan aplikasi web yang boleh digunakan klien dengan API yang boleh kami jual kepada rakan kongsi untuk kes penggunaan yang berbeza. Pangkalan pengguna kami semakin berkembang dan menjadi jelas bahawa mereka mahu dapat mengakses aplikasi pada bila-bila masa. Jadi sudah tiba masanya untuk berfikir tentang kebolehskalaan dan ketersediaan.

Kami bergantung pada satu pelayan tetapi ia hanya boleh mengendalikan permintaan yang banyak, dan menukar pelayan atau mengeluarkan versi baharu bermakna menurunkan aplikasi semasa pembebasan. Keutamaan kami ialah: mengimbangi beban, auto-scaling, pembalakan, replikasi dan back-up automatik. Sudah tentu, jika anda seorang jurutera sahaja di syarikat anda, cuba menangani semua isu ini dengan sendiri akan menjadi kegilaan lengkap.

Nasib baik kita hidup dalam satu masa yang hanya satu jurutera baik bulat dengan mudah boleh membina sistem sedemikian dalam beberapa hari menggunakan perkhidmatan Cloud seperti Amazon Web Services, Google Cloud Services atau Azure. Kami memutuskan untuk memindahkan sistem kami ke AWS kerana pada masa itu ia adalah penyelesaian yang paling lengkap dan kami mempunyai 2 tahun kredit percuma.

Inilah sebabnya mengapa saya kebanyakannya akan bercakap mengenai penyelesaian AWS dalam jawatan ini, tetapi ada perkhidmatan yang sama di platform lain. Ini juga adalah masa yang kita pilih untuk memulakan modul kami di dalam bekas Docker kerana banyak sebab lain yang tidak akan diliputi dalam siaran ini (anda boleh menyemak artikel ini untuk maklumat lanjut: https://medium.freecodecamp.org / amazon-fargate-goodbye-infrastructure-3b66c7e3e413).

Bagaimana anda membuat keputusan untuk menjalankan aplikasi anda benar-benar bergantung kepada kes penggunaan anda, seperti fleksibiliti yang anda perlukan berbanding masa yang anda boleh gunakan untuk menguruskan infrastruktur anda.

Tidak ada jawapan yang baik atau buruk.

Anda boleh memilih untuk menyusun semua modul anda dan menggunakan sistem pengurusan bekas seperti ECS / EKS dalam enjin AWS atau Kubernet di GCP. Jika tidak dan anda tidak mahu berurusan dengan perkara seperti auto-scaling dan load-balancing sendiri, anda boleh menggunakan Elastic Beanstalk atau App Engine.

Jika anda ingin pergi tanpa pelayan penuh anda juga boleh menggabungkan penggunaan fungsi Lambda dan API Gateway. Kami memutuskan untuk pergi untuk ECS. Kami menggunakan 3 contoh di 3 zon ketersediaan, load balancer, auto-scaling set-up bergantung pada penggunaan CPU, mengintegrasikan semua peti bekas kami dengan Cloudwatch dan Metrik penyiapan untuk melihat ralat, panggilan luaran dan masa respon API.

Ketersediaan Tinggi: Tahukah anda bahawa Giraffe hampir tidak pernah tidur? 99% uptime

Untuk Pangkalan Data kami, kami menggunakan MongoDB, kerana model kami sesuai untuk pangkalan data NoSQL, dan untuk konsistensi yang tinggi. Kami memutuskan untuk mengambil kesempatan daripada MongoDB Atlas dan menggunakan 3 replika untuk membolehkan ketersediaan yang tinggi. Antara perkhidmatan lain, Atlas menyediakan auto-scaling, back-up automatik dan membolehkan anda untuk kembali ke masa yang lancar dalam kes bencana.

Kami juga membuat keputusan untuk menjadi tuan rumah semua fail web statik kami di S3 dan menggunakan Cloudfront sebagai CDN supaya aplikasi JS kami dapat memuatkan dengan cepat di mana saja di dunia dan dilayan seberapa banyak kali yang diminta. Cloudflare juga merupakan pilihan yang baik dan menawarkan perlindungan DDOS daripada kotak.

Untuk kesederhanaan kami memutuskan menggunakan Route 53 sebagai DNS kami dengan menggunakan pelayan nama mereka untuk semua domain kami. Ini adalah salah satu perkhidmatan kegemaran saya di AWS. Ia menjadikan hidup anda lebih mudah. Setiap kali anda ingin melayani sesuatu melalui nama domain, sama ada ia adalah contoh EC2, IP elastik, load balancer, pengedaran Cloudfront atau apa-apa yang benar-benar, secara peribadi atau secara terbuka, ia membawa anda beberapa minit kerana ia sangat terintegrasi dengan semua perkhidmatan yang lain.

Gabungkan itu dengan Pengurus Sijil yang membolehkan anda mendapatkan sijil SSL (wildcards included) secara percuma dalam beberapa minit dan untuk menggunakannya pada semua pelayan anda dengan menandakan kotak, dan anda mempunyai cara paling cepat yang boleh dipercayai untuk membolehkan HTTPS pada semua modul anda. Selamat tinggal "Let's Encrypt" Sijil SSL yang saya perlu memperbaharui dan memasang pada pelayan saya setiap 3 bulan atau lebih .

Bermula untuk kelihatan baik

Memutuskan strategi caching

Semua orang membenci pengurusan cache, caching boleh berlaku di banyak lapisan yang berlainan, dan isu yang berkaitan dengan cache sukar untuk menghasilkan, dan mimpi buruk untuk debug.

Malangnya prestasi sistem teragih banyak bergantung kepada strategi caching yang baik. Terdapat banyak artikel yang baik mengenai strategi caching yang baik supaya saya tidak akan terperinci. Hanya tahu bahawa jika sumber Web Statik anda berat, anda mungkin ingin memanfaatkan cache pelayar pengguna anda dengan bijak menggunakan header cache kawalan.

Jika halaman muka pengguna anda dijana pada pelayan aplikasi berulang kali, gunakan proksi caching seperti Squid. Tetapi yang paling penting, terdapat peluang yang tinggi bahawa anda akan membuat permintaan yang sama ke pangkalan data anda berulang kali. Untuk menurunkan beban pangkalan data anda dan simpan pada masa pemindahan data, gunakan sistem cache caching objek seperti memcached untuk objek yang sering digunakan dan jarang dikemas kini.

Kami mula mempertimbangkan menggunakan memcached kerana kami sering meminta profil calon dan tawaran kerja yang sama berulang kali. Melaksanakannya pada mesin yang dioptimumkan memori meningkatkan prestasi API kami dengan lebih dari 30% apabila kami menilai semua permintaan masa tindak balas dalam sehari. Memcached diedarkan juga, supaya ia dapat berjalan di pelayan yang berbeza tetapi masih bertindak seperti itu hanya satu ruang memori yang besar untuk menyimpan objek anda.

cache, cache di mana-mana

Lokasi, lokasi, lokasi

Sekarang kita mempunyai sistem yang didistribusikan yang tidak mempunyai titik kegagalan tunggal (jika anda menganggap AWS ELBs dan memcached yang diedarkan), dan boleh auto-naik naik dan turun. Kami juga menggunakan caching untuk meminimumkan pemindahan data rangkaian. Terlihat cantik. Pada ketika itu, anda mungkin ingin mengaudit pihak ketiga anda untuk melihat sama ada mereka akan menyerap beban serta anda.

Tetapi masih, sesetengah pengguna kami mengadu bahawa aplikasinya agak lambat untuk mereka, terutamanya apabila mereka memuat naik fail. Memang, walaupun fail web statik kami di-cache di seluruh dunia (ihsan CDN), semua pelayan aplikasi kami dikerahkan di sebelah barat Amerika Syarikat sahaja. Pengguna dari Asia Timur mengalami lebih banyak latensi terutamanya untuk pemindahan data besar.

Penyelesaiannya adalah mudah: menggunakan kluster ECS yang sama di rantau baru di Asia bersama-sama dengan pengimbang beban baru, dan bergantung pada Route 53 Geoproximity Routing untuk pengguna laluan ke pengimbang beban "terdekat". MongoDB Atlas juga membolehkan anda untuk menggunakan replika anda di seluruh wilayah supaya tidak ada kerja tambahan yang diperlukan.

Dan di sini kita! Sistem diedarkan kami sedia.

Kesimpulannya

Walaupun sistem yang diedarkan yang anda lihat disini telah dipermudahkan untuk siaran ini, kami memeriksa bahagian-bahagian yang paling mungkin anda lihat dalam banyak aplikasi web moden. Topik lain yang berkaitan dengan tetapi tidak dilindungi adalah seni bina mikroservis, penyimpanan fail dan penyulitan, pangkalan data sharding, tugas yang dijadualkan, pengkomputeran selari tak segerak ... mungkin dalam jawatan yang seterusnya!

Titik utama saya ialah: jangan cuba untuk membina sistem yang sempurna apabila anda memulakan produk anda. Kebanyakan pilihan reka bentuk anda akan didorong oleh apa produk anda dan siapa yang menggunakannya. Anda hanya akan tahu bahawa apabila anda mencapai pasaran produk patut dan mula mempunyai gambaran yang baik tentang pangkalan pengguna anda, dan itu boleh mengambil bulan, bahkan tahun.

Tumpukan pada mencari tahu apa yang orang perlukan, dan cuba tampil dengan penyelesaian masalah mereka, walaupun ia mempunyai banyak langkah manual. Kemudian fikirkan cara untuk mengautomasikan, menghabiskan masa pengekodan dan memusnahkan, dan gunakan pihak ketiga di mana ia masuk akal.

Jangan skala tetapi selalu berfikir, kod, dan merancang untuk penskalaan. Bina sistem anda secara berturut-turut, jangan alamat isu reka bentuk sistem berdasarkan ciri-ciri yang belum matang, dan akhirnya selalu berusaha mencari perhitungan terbaik antara masa yang akan dibelanjakan dan keuntungan prestasi, wang, dan menurunkan risiko.

Jika anda menyukai artikel ini dan mendapati mana-mana yang berguna, tekan butang tepukan dan ikuti saya untuk lebih banyak artikel seni bina dan pembangunan!