Situasi saat ini
Kami menerapkan (dan sekarang memelihara) aplikasi web belanja online dalam arsitektur layanan mikro.
Salah satu persyaratannya adalah bahwa bisnis harus dapat menerapkan aturan tentang apa yang ditambahkan oleh pelanggan kami ke keranjang mereka, untuk menyesuaikan pengalaman mereka dan pesanan akhirnya. Jelas sekali, mesin aturan bisnis harus diberlakukan, dan kami menerapkan "layanan mikro" khusus untuk ini (jika kami masih bisa menyebutnya begitu).
Selama setahun, mesin aturan ini menjadi semakin kompleks, membutuhkan semakin banyak data (mis. Isi keranjang, tetapi juga informasi pengguna, perannya, layanan yang ada, beberapa informasi tagihan, dll.) Untuk dapat hitung aturan itu.
Untuk saat ini, layanan Microsoft kami shopping-cart
mengumpulkan semua data ini dari layanan Microsoft lainnya. Meskipun sebagian dari data ini digunakan oleh shopping-cart
, sebagian besar waktu itu terutama digunakan untuk memberi makan mesin aturan.
Persyaratan baru
Sekarang tiba kebutuhan untuk aplikasi lain / layanan mikro untuk menggunakan kembali mesin aturan untuk persyaratan yang sama. Dalam situasi saat ini, mereka harus mentransmisikan data yang sama, memanggil layanan mikro yang sama dan membangun (hampir) sumber daya yang sama untuk dapat memanggil mesin aturan.
Melanjutkan apa adanya, kami akan menghadapi beberapa masalah:
- setiap orang (memanggil mesin aturan) harus menerapkan kembali pengambilan data, bahkan jika mereka tidak membutuhkannya sendiri;
- permintaan ke mesin aturan sangat kompleks;
- melanjutkan ke arah ini, kita harus mengangkut data ini di seluruh jaringan untuk banyak permintaan (pikirkan μs A calling μs B memanggil mesin aturan, tetapi A sudah memiliki beberapa data yang dibutuhkan mesin aturan);
shopping-cart
telah menjadi besar karena semua pengambilan data;- Saya mungkin lupa banyak ...
Apa yang bisa kita lakukan untuk menghindari masalah ini?
Idealnya, kami akan menghindari menambah kerumitan pada mesin aturan. Kita juga harus memastikan bahwa itu tidak menjadi hambatan - misalnya beberapa data agak lambat untuk diambil (10s atau bahkan lebih) sehingga kami menerapkan pra-pengambilan shopping-cart
sedemikian rupa sehingga data lebih mungkin untuk berada di sana sebelum kita memanggil aturan mesin, dan pertahankan pengalaman pengguna yang dapat diterima.
Beberapa ide
- Biarkan mesin aturan mengambil data yang dibutuhkan. Ini akan menambah kompleksitas bahkan lebih, melanggar prinsip tanggung jawab tunggal ( bahkan lebih ... );
- Terapkan proxy μs sebelum mesin aturan untuk mengambil data;
- Terapkan "data fetcher" μs yang diminta oleh mesin aturan untuk mengambil semua data yang dibutuhkan sekaligus (penyelidikan komposit).
shopping-cart
, tetapi kami dapat dengan mudah menyesuaikannya untuk kebutuhan layanan-layanan microsoft lainnya (mereka masih terkait dengan pengguna, produk & pemesanan). Seperti yang kita lihat, mereka akan membutuhkan data input yang sama, terutama karena bisnis dapat memilih predikat untuk diterapkan. Semua data disediakan oleh layanan microser lainnya kecuali konten keranjang itu sendiri. Mengambil data tidak rumit per se tetapi menjadi kompleks ketika Anda harus memanggil ~ 10 layanan mikro lainnya dan mempertahankan struktur yang diharapkan oleh mesin aturan.Jawaban:
Mari kita mundur sejenak dan menilai tempat awal kita sebelum menuliskan jawaban yang mungkin panjang lebar ini. Kamu punya:
Ok, ini tidak terlalu bagus untuk layanan microser. Masalah langsung mencolok adalah kalian tampaknya salah paham apa itu microservices.
Anda perlu mendefinisikan beberapa jenis API atau metode komunikasi yang digunakan layanan microser Anda dan membuatnya menjadi umum. Ini mungkin perpustakaan yang bisa mereka impor. Mungkin mendefinisikan protokol pesan. Mungkin menggunakan alat yang sudah ada ( mencari bus pesan layanan mikro sebagai tempat awal yang baik).
Pertanyaan tentang komunikasi antarservice bukanlah masalah "terpecahkan", tetapi juga bukan masalah "roll your own" pada saat ini. Banyak alat dan strategi yang ada dapat membuat hidup Anda lebih mudah.
Apa pun yang Anda lakukan, pilih satu sistem dan cobalah untuk menyesuaikan API komunikasi Anda untuk menggunakan ini. Tanpa beberapa cara yang pasti untuk layanan Anda untuk berinteraksi Anda akan memiliki semua kelemahan dari layanan microser dan layanan monolitik dan tidak ada keuntungan dari keduanya.
Sebagian besar masalah Anda berasal dari ini.
Buat mereka tidak terlalu rumit.
Temukan cara untuk membuatnya kurang kompleks. Serius. Datamodels umum, pisahkan mesin aturan tunggal Anda menjadi yang lebih kecil, atau apalah. Jadikan mesin aturan Anda berfungsi lebih baik. Jangan mengambil pendekatan "selai semuanya ke dalam kueri dan terus membuatnya rumit" - serius perhatikan apa yang Anda lakukan dan mengapa.
Tetapkan semacam protokol untuk data Anda. Dugaan saya adalah kalian tidak memiliki rencana API yang ditetapkan (seperti di atas) dan sudah mulai menulis panggilan ISTIMEWA ad hoc kapan pun diperlukan. Ini semakin kompleks karena Anda sekarang harus mempertahankan setiap layanan setiap kali ada sesuatu yang diperbarui.
Lebih baik lagi, Anda bukan perusahaan pertama yang mengimplementasikan alat belanja online. Pergi riset perusahaan lain.
Sekarang apa...
Setelah ini, Anda setidaknya menyortir beberapa masalah terbesar.
Masalah berikutnya adalah pertanyaan ini tentang mesin aturan Anda. Saya harap ini cukup tanpa kewarganegaraan, sehingga Anda dapat mengukurnya. Jika ya, sementara suboptimal Anda setidaknya tidak akan mati dalam nyala api kemuliaan atau membangun solusi gila.
Anda ingin mesin aturan Anda menjadi stateless. Buat sedemikian rupa sehingga hanya memproses data. Jika Anda menemukan itu sebagai hambatan, buatlah agar Anda dapat menjalankan beberapa di belakang penyeimbang proxy / beban. Tidak ideal, tetapi masih bisa diterapkan.
Luangkan waktu untuk mempertimbangkan apakah ada layanan microser Anda yang benar-benar harus dimasukkan ke dalam mesin aturan Anda. Jika Anda meningkatkan overhead sistem Anda secara signifikan hanya untuk mencapai "arsitektur layanan microser" Anda perlu menghabiskan lebih banyak waktu merencanakan ini.
Atau, dapatkah mesin aturan Anda dipecah menjadi beberapa bagian? Anda mungkin mendapatkan keuntungan hanya dengan membuat bagian dari layanan spesifik mesin aturan Anda.
Dengan asumsi masalah ini ada setelah menyelesaikan masalah di atas Anda perlu menyelidiki dengan serius mengapa ini terjadi. Anda memiliki mimpi buruk yang sedang berlangsung tetapi alih-alih mencari tahu mengapa (10 detik? Untuk mengirim data portal belanja di sekitar? Panggil saya sinis, tapi ini agak masuk akal) Anda tampaknya menambal gejala daripada melihat masalah yang menyebabkan gejala pada posisi pertama.
Anda telah menggunakan frasa "pengambilan data" berulang kali. Apakah data ini dalam database? Jika tidak, pertimbangkan untuk melakukan ini - jika Anda menghabiskan begitu banyak waktu "secara manual" untuk mengambil data, sepertinya menggunakan database nyata adalah ide yang bagus.
Anda mungkin dapat memiliki desain dengan database untuk data yang Anda ambil (tergantung pada apa ini, Anda telah menyebutkannya berkali-kali), beberapa mesin aturan, dan klien Anda.
Satu catatan terakhir adalah Anda ingin memastikan Anda menggunakan versi API dan layanan yang tepat. Rilis minor seharusnya tidak merusak kompatibilitas. Jika Anda menemukan diri Anda melepaskan semua layanan Anda pada saat yang sama bagi mereka untuk bekerja, Anda tidak memiliki arsitektur layanan mikro, Anda memiliki arsitektur monolitik terdistribusi.
Dan pada akhirnya, layanan microser bukan solusi satu ukuran untuk semua. Tolong, demi semua yang suci, jangan lakukan saja karena ini adalah hal yang baru.
sumber
Dengan jumlah informasi yang disajikan tentang mesin aturan dan input dan outputnya, saya kira saran Anda tidak. 2 ada di jalur yang benar.
Konsumen saat ini dari mesin aturan dapat melakukan outsourcing proses pengumpulan informasi yang diperlukan untuk komponen tujuan yang lebih khusus.
Contoh: Anda saat ini menggunakan mesin aturan untuk menghitung diskon yang perlu diterapkan terhadap isi keranjang belanja. Pembelian sebelumnya, faktor geografis, dan faktor penawaran saat ini.
Persyaratan baru adalah menggunakan banyak informasi yang sama ini untuk mengirim email penawaran kepada pelanggan sebelumnya berdasarkan spesial mendatang dan pembelian sebelumnya. Pembelian sebelumnya, faktor penawaran saat ini dan yang akan datang ke dalamnya.
Saya akan memiliki dua layanan terpisah untuk ini. Mereka masing-masing akan bergantung pada layanan mesin aturan untuk beberapa pengangkatannya yang berat. Masing-masing dari mereka akan mengumpulkan data yang diperlukan yang dibutuhkan untuk permintaan mereka ke mesin aturan.
Mesin aturan hanya menerapkan aturan, konsumen tidak perlu khawatir tentang data apa yang dibutuhkan mesin aturan untuk konteks tertentu, dan layanan perantara baru ini hanya melakukan satu hal: Merakit konteks dan meneruskan permintaan ke mesin aturan dan mengembalikan respons yang tidak dimodifikasi.
sumber
Pengumpulan data yang diperlukan untuk keputusan harus dilakukan di luar mesin aturan. Ini karena mereka dirancang terbaik sebagai layanan tanpa kewarganegaraan jika memungkinkan. Pengambilan data harus melibatkan pemrosesan asinkron dan status holding. Tidak masalah jika pengambilan dilakukan oleh proxy yang menghadap layanan keputusan, oleh penelepon, atau dengan proses bisnis.
Sebagai masalah praktis untuk implementasi, saya akan menyebutkan bahwa IBM Decision Manager Operasional mulai mendokumentasikan dan sudah mendukung penggunaan produk dalam wadah buruh pelabuhan . Saya yakin bahwa produk lain juga menyediakan dukungan ini dan itu akan menjadi arus utama.
sumber
Dalam pemikiran sederhana saya, saya kira, itu akan membantu untuk mengambil kembali semua data yang diperlukan dengan membuat satu set panggilan async ke layanan pengambilan data segera setelah pelanggan mulai membeli dan menyimpan data. Jadi ketika Anda harus memanggil layanan aturan data sudah ada di sana. Dan terus tersedia untuk layanan lain juga selama sesi.
sumber