Semua dengan akhir liburan! ... Beberapa orang akan mengatakan bahwa selamat ini begitu-begitu. Tapi, pasti, banyak yang akan segera berlibur, jadi ambil sedikit lagi. Ya, kami tidak kehilangan momentum dan pada hari yang hangat ini kami berbagi pengalaman dengan mitra kami. Ini akan menjadi tentang mengoptimalkan pekerjaan dengan database. Lebih detail di bawah cut!
Saya memberikan lantai kepada penulis.Kami menyambut Anda, para pembaca Habr! Kami adalah tim
WaveAccess , dalam artikel ini kami akan berbagi dengan Anda pengalaman menggunakan layanan database Azure Cosmos DB (DB) dalam proyek komersial. Kami akan memberi tahu Anda mengapa database dimaksudkan, dan nuansa yang harus kami hadapi selama pengembangan.
Apa itu Azure Cosmos DB
Azure Cosmos DB adalah layanan database komersial yang didistribusikan secara global dengan paradigma multi-model, yang disediakan sebagai solusi PaaS. Dia adalah generasi selanjutnya dari Azure DocumentDB.
Basis data dikembangkan pada 2017 oleh Microsoft dengan partisipasi Leslie Lamport, Ph.D dalam Ilmu Komputer (pemenang Turing Prize 2013 untuk kontribusi mendasar pada teori sistem terdistribusi, pengembang LaTex, pencipta spesifikasi TLA +).
Karakteristik utama Azure Cosmos DB adalah:
- Database non-relasional;
- Dokumen di dalamnya disimpan sebagai JSON;
- Penskalaan horisontal dengan pilihan wilayah geografis;

- Paradigma data multi-model: nilai kunci, dokumen, grafik, keluarga kolom;
- Latensi rendah untuk 99% permintaan: kurang dari 10 ms untuk operasi baca dan kurang dari 15 ms untuk operasi tulis (diindeks);
- Dirancang untuk throughput tinggi;
- Ini menjamin ketersediaan, konsistensi data, latensi pada tingkat SLA 99,999%;
- Bandwidth yang bisa dikonfigurasi
- Replikasi otomatis (master-slave);
- Pengindeksan data otomatis;
- Tingkat konsistensi data yang dapat disesuaikan. 5 level yang berbeda (Kuat, Staleness Terbatas, Sesi, Awalan Konsisten, Akhirnya);
Pada grafik, Anda dapat melihat ketergantungan berbagai tingkat konsistensi pada ketersediaan, kinerja, dan konsistensi data.

- Untuk transisi yang mudah ke Cosmos DB dari database-nya, ada banyak API untuk mengakses data: SQL, JavaScript, GREMLIN, MongoDB, Cassandra, Azure Blob;
- Firewall yang dapat disesuaikan;
- Ukuran basis data khusus.
Tugas yang kami selesaikan
Ribuan sensor yang terletak di seluruh dunia mengirimkan informasi (pemberitahuan selanjutnya) setiap beberapa detik. Pemberitahuan ini harus disimpan dalam database, dan kemudian mencarinya dan menampilkannya di UI operator sistem.
Persyaratan Pelanggan:
- Menggunakan tumpukan teknologi Microsoft, termasuk cloud Azure;
- Throughput 100 permintaan per detik;
- Notifikasi tidak memiliki struktur yang jelas dan dapat berkembang lebih jauh;
- Untuk pemberitahuan kritis, kecepatan pemrosesan adalah penting;
- Ketahanan sistem yang tinggi.
Berdasarkan kebutuhan pelanggan, kami secara ideal didekati dengan database komersial yang non-relasional, terdistribusi secara global, dan dapat diandalkan.

Jika kita melihat basis data yang mirip dengan Cosmos DB, kita dapat memanggil Amazon DynamoDB, Google Cloud Spanner. Tetapi Amazon DynamoDB tidak terdistribusi secara global, dan Google Cloud Spanner memiliki tingkat konsistensi dan tipe model data yang lebih sedikit (hanya tabular, relasional).
Untuk alasan ini, kami memilih Azure Cosmos DB. Untuk berinteraksi dengan database, kami
menggunakan Azure Cosmos DB SDK untuk .NET , karena backend ditulis dalam .NET.
Nuansa yang kami temui
1. Manajemen Basis DataUntuk mulai menggunakan database, pertama-tama, Anda harus memilih alat untuk mengelolanya. Kami menggunakan Azure Cosmos DB Data Explorer di portal Azure dan
DocumentDbExplorer . Ada juga utilitas Azure Storage Explorer.
2. Menyiapkan koleksi databaseDi Cosmos DB, setiap basis data terdiri dari koleksi dan dokumen.
Fitur koleksi yang dapat disesuaikan untuk diperhatikan:
- Ukuran koleksi: tetap atau tidak terbatas;
- Bandwidth dalam satuan permintaan per detik RU / s (dari 400 RU / s);

- Kebijakan pengindeksan (termasuk atau mengecualikan dokumen dan jalur ke dan dari indeks, mengatur berbagai jenis indeks, mengatur mode pembaruan indeks).
Contoh Indeks Khas
{ "id": "datas", "indexingPolicy": { "indexingMode": "consistent", "automatic": true, "includedPaths": [ { "path": "/*", "indexes": [ { "kind": "Range", "dataType": "Number", "precision": -1 }, { "kind": "Hash", "dataType": "String" }, { "kind": "Spatial", "dataType": "Point" } ] } ], "excludedPaths": [] } }
Agar pencarian substring berfungsi, untuk bidang string Anda perlu menggunakan indeks Hash ("kind": "Hash").
3. Transaksi basis dataTransaksi diimplementasikan dalam basis data pada tingkat prosedur tersimpan (mengeksekusi prosedur tersimpan adalah operasi atom). Prosedur tersimpan JavaScript
var helloWorldStoredProc = { id: "helloWorld", body: function () { var context = getContext(); var response = context.getResponse(); response.setBody("Hello, World"); } }
4. Saluran perubahan basis dataUbah Feed mendengarkan perubahan dalam koleksi. Ketika perubahan pada dokumen pengumpulan terjadi, database melempar acara tentang perubahan ke semua pelanggan saluran ini.
Kami menggunakan Ubah Umpan untuk melacak perubahan koleksi. Saat membuat saluran, Anda harus terlebih dahulu membuat koleksi
AUX tambahan yang mengoordinasikan pemrosesan saluran perubahan untuk beberapa peran kerja.
5. Batasan basis data:- Kurangnya operasi massal (prosedur tersimpan yang digunakan untuk penghapusan massal , memperbarui dokumen);
- Kurangnya pembaruan sebagian dokumen;
- Tidak ada operasi SKIP (kompleksitas implementasi pagination). Untuk menerapkan pagination dalam permintaan notifikasi, kami menggunakan RequestContinuation (tautan ke elemen terakhir sebagai hasil dari penerbitan) dan MaxItemCount (jumlah elemen yang dikembalikan dari database). Secara default, hasilnya dikembalikan dalam batch (tidak lebih dari 100 item dan tidak lebih dari 1 MB di setiap paket). Jumlah item yang dikembalikan dapat ditingkatkan menjadi 1000 menggunakan parameter MaxItemCount.
6. Memproses kesalahan basis data ke-429Ketika bandwidth pengumpulan mencapai maksimum, database mulai menghasilkan kesalahan "429 permintaan terlalu banyak". Untuk memprosesnya, Anda dapat menggunakan pengaturan
RetryOptions di SDK, di mana MaxRetryAttemptsOnThrottledRequests adalah jumlah upaya untuk menyelesaikan permintaan, dan MaxRetryWaitTimeInSeconds adalah total waktu upaya koneksi.
7. Prakiraan biaya penggunaan basis dataUntuk memperkirakan biaya menggunakan database, kami menggunakan
kalkulator online RU / s. Dalam rencana dasar, satu unit permintaan untuk elemen 1 KB sesuai dengan perintah GET sederhana dengan tautan ke dirinya sendiri atau pengidentifikasi elemen ini.
Kesimpulan
Azure Cosmos DB mudah digunakan, mudah dan fleksibel untuk dikonfigurasi melalui portal Azure. Banyaknya API akses data memudahkan untuk bermigrasi ke Cosmos DB. Tidak perlu melibatkan administrator basis data untuk memelihara basis data. Jaminan keuangan SLA, penskalaan horizontal global membuat basis data ini sangat menarik di pasar. Sangat cocok untuk digunakan dalam aplikasi perusahaan dan global yang menuntut toleransi kesalahan dan bandwidth yang tinggi. Kami di WaveAccess terus menggunakan Cosmos DB dalam proyek kami.
Tentang penulis
Tim
WaveAccess menciptakan perangkat lunak yang secara teknis canggih, sangat sarat, dan toleran terhadap kesalahan untuk perusahaan di seluruh dunia.
Alexander Azarov , wakil presiden senior pengembangan perangkat lunak di WaveAccess, berkomentar:
Sekilas, tugas-tugas sulit dapat diselesaikan dengan metode yang relatif sederhana. Penting tidak hanya mempelajari alat-alat baru, tetapi juga untuk menyempurnakan pengetahuan teknologi yang sudah dikenal.
Blog perusahaan