Perusahaan saya saat ini sedang bekerja untuk mengadopsi arsitektur layanan mikro tetapi kami menghadapi beberapa rasa sakit yang meningkat (kejutan!) Di sepanjang jalan. Salah satu poin pertentangan utama yang kami hadapi adalah bagaimana mengkomunikasikan data dalam jumlah besar antara berbagai layanan kami.
Sebagai sedikit latar belakang, kami memiliki penyimpanan dokumen yang berfungsi sebagai repositori untuk dokumen apa pun yang mungkin perlu kami tangani di seluruh perusahaan. Berinteraksi dengan toko tersebut dilakukan melalui layanan yang menyediakan klien dengan ID unik dan lokasi untuk melakukan streaming dokumen. Lokasi dokumen nanti dapat diakses melalui pencarian dengan ID yang diberikan.
Masalahnya adalah ini - Apakah masuk akal bagi semua layanan microser kami untuk menerima ID unik ini sebagai bagian dari API mereka untuk keperluan berinteraksi dengan dokumen atau tidak? Bagi saya ini terasa salah - layanan tidak lagi independen dan bergantung pada layanan toko dokumen. Meskipun saya mengakui ini mungkin menyederhanakan desain API dan mungkin bahkan memiliki beberapa peningkatan kinerja yang dihasilkan lebih dari mengimbangi manfaatnya.
Adakah yang tahu bagaimana pelangi unicorn (Netflix, Amazon, Google, dll.) Menangani pertukaran file / data besar di antara layanan mereka?
sumber
Jawaban:
Sayangnya saya tidak tahu bagaimana mereka menghadapi masalah seperti itu.
Itu melanggar Prinsip Tanggung Jawab Tunggal, yang seharusnya melekat dalam arsitektur layanan mikro Anda. Satu microservice - satu logis , secara fisik banyak contoh mewakili satu - harus berurusan dengan satu topik .
Dalam hal penyimpanan dokumen Anda, Anda memiliki satu titik, di mana semua pertanyaan untuk dokumen pergi (tentu saja Anda dapat membagi unit logis ini menjadi beberapa penyimpanan dokumen untuk beberapa jenis dokumen).
Jika "aplikasi" Anda perlu mengerjakan suatu dokumen, ia akan menanyakan masing-masing layanan mikro dan memproses hasilnya.
Jika layanan lain memerlukan dokumen aktual atau bagian dari itu, ia harus meminta layanan dokumen.
Ini adalah masalah arsitektur:
Kurangi kebutuhan untuk mentransfer sejumlah besar data
Idealnya, setiap layanan memiliki semua data dan tidak perlu transfer untuk hanya melayani permintaan. Sebagai perpanjangan dari ide ini - jika Anda memiliki kebutuhan untuk mentransfer data, pikirkan redundansi (* dengan cara yang positif_): Apakah masuk akal untuk memiliki data yang berlebihan di banyak tempat (di mana mereka diperlukan)? Pikirkan bagaimana inkonsistensi yang mungkin dapat membahayakan proses Anda. Tidak ada transfer yang lebih cepat karena sebenarnya tidak ada .
Kurangi ukuran data itu sendiri
Pikirkan bagaimana Anda bisa mengompres data Anda: Mulai dengan algortihms kompresi aktual hingga struktur data pintar . Semakin sedikit melewati kawat, semakin cepat Anda.
sumber
Jika ID dikembalikan oleh toko dokumen Anda dengan cara untuk dokumen referensi di seluruh sistem, maka masuk akal untuk semua layanan untuk menerima bahwa 'Dokumen ID' pada API mereka ketika kebutuhan layanan untuk mengetahui dokumen itu perlu bekerja dengan.
Ini tidak serta merta menciptakan ikatan yang lebih erat antara layanan daripada yang dibutuhkan. Layanan yang perlu mengakses dokumen harus tetap mengakses layanan penyimpanan dokumen dan mereka membutuhkan ID tersebut untuk memberi tahu toko dokumen mana yang akan diakses.
Layanan yang tidak mengakses dokumen secara langsung mungkin perlu meneruskan ID Dokumen, tetapi untuk layanan itu hanya string sewenang-wenang yang tidak membuat ketergantungan.
sumber
Secara pribadi, saya lebih suka tidak menggunakan layanan penyimpanan dokumen dan id dokumen terpisah, tetapi URL untuk mengakses dokumen (dengan otentikasi header yang tepat). Dengan pendekatan ini Anda tidak akan memerlukan layanan lain untuk mengandalkan layanan dokumen, alih-alih hanya menggunakan URL lengkap untuk mengakses dokumen. ketika penyimpanan tumbuh dan memberikan URL.
Namun Anda mungkin perlu layanan untuk mengunggah dokumen dan mendapatkan URL-nya.
sumber
Cek spesifikasi Amazon S3 REST API, tampaknya mereka mengembalikan objek penuh dalam byte. Tampaknya tidak banyak pilihan jika Anda mendesain sebuah layanan mikro. Tautan format respons Amazon S3
sumber