Arsitektur layanan antrian pesan terdistribusi di Yandex.Cloud

Hai, nama saya Vasily Bogonatov. Saya adalah salah satu dari mereka yang meletakkan tangan dan kepala saya dan menempatkan jiwa saya ke dalam layanan antrian pesan persisten yang didistribusikan dari Antrian Pesan Yandex. Layanan ini go public pada akhir Mei, tetapi di dalam Yandex telah lama digunakan secara aktif dalam berbagai produk.

Hari ini saya ingin memberi tahu pembaca Habr tentang antrian pesan secara umum dan tentang Antrian Pesan Yandex pada khususnya. Pertama, saya ingin menjelaskan apa "antrian pesan tetap yang didistribusikan" dan mengapa itu diperlukan. Tunjukkan nilai praktisnya, mekanisme bekerja dengan pesan, berbicara tentang API dan kegunaan. Pada paruh kedua artikel, kita akan melihat sisi teknis: bagaimana Yandex Database digunakan dalam antrian kami (ini adalah dasar yang dapat diandalkan dari layanan kami), bagaimana pendekatan yang naif dan lebih baik untuk membangun tampilan arsitektur, masalah apa yang disebabkan oleh distribusi dan bagaimana mereka dapat dipecahkan.



Apa itu antrian pesan persisten yang didistribusikan?


Wikipedia mendefinisikan antrian pesan sebagai "komponen rekayasa perangkat lunak yang digunakan untuk interaksi antar proses atau antar-threaded dalam satu proses". Bahkan, konsep ini agak lebih luas: proses berinteraksi menggunakan antrian dapat ditemukan di server yang berbeda dan bahkan di pusat data yang berbeda.

Kami akan sedikit menjelaskan persyaratannya.

Antrian pesan adalah repositori yang menyediakan penempatan dan pembacaan data dalam urutan tertentu.

Dua jenis entitas biasanya berinteraksi dengan antrian:

  • penulis (produsen) - mengirim pesan ke antrian;
  • pembaca (konsumen) - menerima (baca) pesan dari antrian.

Saat menggunakan antrian, pembaca dan penulis saling independen. Mereka dapat bekerja dengan kinerja, keandalan, ketersediaan yang berbeda dan bahkan dapat ditulis dalam bahasa pemrograman yang berbeda.

Skenario utama untuk antrian: andal dan cepat mengirimkan pesan dari penulis ke pembaca. Tidak seperti database, antrian tidak dimaksudkan untuk penyimpanan pesan jangka panjang. Dalam banyak implementasi populer, ada parameter yang sesuai - "Periode penyimpanan pesan". Ini menentukan berapa lama pesan disimpan sampai dihapus secara permanen.

Kami menemukan konsep antrian, pergi ke "distribusi" dan "ketekunan".

  • Distribusi dalam kasus kami berarti adanya cluster yang menyimpan dan memproses data dan antrian metadata, menggabungkan semua node menjadi satu keseluruhan menggunakan jaringan komputer.
  • Kegigihan menyiratkan bahwa semua pesan dalam antrian ditulis ke disk, dan penulis menerima konfirmasi pengiriman hanya setelah rekaman berhasil.

Distribusi dan ketekunan tidak mempengaruhi fungsi utama dari antrian, mereka memberikan toleransi kesalahan dan keandalan penyimpanan data. Jenis kegagalan apa yang dapat terjadi dalam sistem kami, kami akan pertimbangkan sedikit kemudian. Namun, saya tidak dapat menyangkal kesenangan diri dan sedikit membuka kartu: dalam seluruh sejarah keberadaan layanan, kami tidak kehilangan satu pesan pun yang disimpan dari klien.

Untuk apa antrian pesan?


Antrian memungkinkan Anda untuk memisahkan bagian-bagian layanan yang secara logis independen dari satu sama lain, yaitu, ia menyediakan decoupling , yang sangat diminati dalam layanan-layanan microsoft yang sekarang populer. Ini meningkatkan skalabilitas dan keandalan: Anda selalu dapat meningkatkan aliran rekaman dalam antrian dan menambahkan lebih banyak pembaca - penangan pesan, sedangkan kegagalan pembaca tidak mempengaruhi pekerjaan penulis.

Antrian meratakan beban puncak: mereka bertindak sebagai penyangga bagi pembaca. Jika kapasitas pembaca saat ini tidak mencukupi untuk pemrosesan instan semua pesan yang masuk, pesan yang antri akan diproses nanti ketika beban menurun. Buffer berguna untuk layanan dengan beban yang tidak stabil, di mana peristiwa masuk instan tidak diperlukan.

Mari kita lihat cara kerjanya, menggunakan contoh robot pencarian (setelah semua, Yandex mulai dengan pencarian!), Yang mengunduh, memproses dan menempatkan halaman web ke dalam database. Mari kita ambil arsitektur seperti itu.



Antrian pesan memecahkan masalah berikut di sini:

  1. Robot bekerja jauh lebih cepat daripada pekerja yang bertanggung jawab untuk parsing dan memuat halaman ke dalam database. Di luar jalur, tautan akan menumpuk dan mengisi memori atau disk yang tersedia. Hal yang sama akan terjadi jika pekerja sementara tidak tersedia.
  2. Tanpa antrian, robot perlu "mengetahui" antarmuka kerja para pekerja untuk menetapkan tugas kepada mereka. Antarmuka dapat berubah saat produk berkembang.
  3. Seorang pekerja individu memiliki keandalan yang cukup rendah, sehingga tidak ada jaminan bahwa tautan yang ditransmisikan akan sepenuhnya diproses olehnya.

Antrian menyediakan penyimpanan data yang andal dengan penskalaan, memungkinkan Anda untuk menunda pemrosesan tautan. Jika satu pekerja gagal, tautan mentah setelah jangka waktu tertentu akan dikembalikan ke antrian untuk diproses oleh pekerja lain. Antrian memiliki antarmuka sendiri, yang diuji dan dijelaskan dalam dokumentasi, sehingga robot pencarian dan sistem pekerja dapat mengembangkan tim yang berbeda dalam bahasa pemrograman yang berbeda. Ini tidak akan memengaruhi kinerja secara keseluruhan.

Bagaimana Antrian Pesan Yandex berfungsi dengan pesan


Tiga tahap utama dapat dibedakan di sini:

  • menulis pesan ke antrian;
  • membaca pesan dari antrian;
  • Menghapus pesan dari antrian.

Catatan dianggap berhasil jika pesan telah disimpan dengan aman dan akan segera tersedia untuk pembaca. Rekaman deduplikasi dimungkinkan: ketika upaya yang berulang untuk merekam pesan terkirim diabaikan.

Pada saat membaca pesan disembunyikan dari antrian untuk jangka waktu yang disebut Visibilitas Timeout, dan menjadi tidak dapat diakses oleh pembaca lain. Jika batas waktu visibilitas berakhir, pesan kembali ke antrian dan tersedia untuk diproses lagi. Urutan pembacaan pesan ditentukan oleh antrian, bukan oleh pembaca.

Pembaca itu sendiri dan koneksi jaringan dengannya berpotensi tidak dapat diandalkan. Waktu tunggu visibilitas diperlukan untuk dapat mengembalikan pesan ke antrian ketika pembaca macet atau koneksi terputus. Kalau tidak, kemungkinan satu pesan tidak akan pernah diproses dengan benar.

Setelah berhasil membaca, pesan dikirim ke klien dengan tanda pengenal ReceiptHandle. Identifier menunjukkan data spesifik yang harus dihapus dari antrian pesan.

Jenis antrian dalam Antrian Pesan Yandex


Jenis pertama dan paling umum digunakan adalah Antrian Standar. Ini ditandai dengan throughput yang tinggi (ribuan pesan per detik), kinerja luar biasa dan waktu pelaksanaan operasi dasar yang singkat. Antrian standar terdiri dari pecahan logis dan mendukung penskalaan bandwidth yang hampir linier.


Antrian standar tidak mendukung deduplikasi pesan saat menulis ke antrian dan tidak menjamin urutan pembacaan. Karena penggunaan sharding, permintaan baca mungkin tidak mengembalikan satu pesan, bahkan jika mereka dalam antrian. Paling sering ini terjadi dalam mode polling pendek , ketika membaca berasal dari satu beling yang dipilih secara acak.

Tipe kedua - FIFO - adalah kebalikan dari antrian standar. Ini memberikan urutan pembacaan yang ketat, mendukung deduplikasi saat menulis dan upaya berulang untuk membaca pesan. Kinerja dan skalabilitas lebih rendah dari standar. Kinerja antrian FIFO terbatas hingga 30 permintaan per detik. FIFO direkomendasikan untuk digunakan ketika Anda perlu mencoba memastikan semantik pengiriman “tepat sekali”. Biasanya, kata "antrian" berarti FIFO.


API Antrian Pesan Yandex


API adalah komponen yang sangat penting dari produk apa pun. Antarmuka perangkat lunak yang baik harus sederhana dan mudah, membutuhkan pengenalan minimal dengan dokumentasi untuk penggunaan yang efektif. Seharusnya tidak membiarkan melakukan tindakan aneh atau tidak perlu dan melindungi dari kesalahan bodoh, melaporkan pelanggaran "kontrak" tepat waktu.

Jika sistem memiliki API seperti itu, ia dengan cepat menerima pengguna yang setia dan dikelilingi oleh “pembungkus” yang nyaman untuk berbagai platform dan bahasa pemrograman.

API Layanan Antrian Sederhana Amazon (AWS SQS API) adalah contoh dari antarmuka semacam itu, diuji oleh waktu dan sejumlah besar klien. Oleh karena itu, kami memutuskan untuk tidak membuat antarmuka unik untuk Antrian Pesan Yandex, tetapi menerapkan dukungan untuk AWS SQS API, dan dengan sangat hati-hati.

Dalam kebanyakan kasus, cukup bagi pengguna SQS untuk mengubah titik akhir (alamat layanan), wilayah (saat ini kami hanya menggunakan "ru-central1") dan mendapatkan kredensial baru dalam Yandex.Cloud. Segala sesuatu yang lain, misalnya, skrip yang menggunakan baris perintah AWS , kode yang menggunakan AWS SDK, atau layanan yang sudah jadi pada Seledri atau boto , kemungkinan besar tidak akan disentuh. Logika dan fungsionalitas layanan antrian akan tetap sama.


Penjelasan terperinci tentang metode Antrian Pesan Yandex ada dalam dokumentasi layanan .

Sedikit tentang kenyamanan


Antrian Pesan Yandex adalah layanan terkelola, yaitu, Yandex. Cloud bertanggung jawab atas pengoperasian server dan perangkat lunak. Tim layanan memantau kesehatan antrian, dengan cepat mengganti disk yang gagal, menghilangkan jeda jaringan dan meluncurkan pembaruan. Pembaruan tidak menghentikan layanan: sementara kami menginstal versi baru YMQ pada satu kelompok server, penyeimbang beban dengan hati-hati mengalihkan lalu lintas ke yang lain. Jadi pengguna tidak memperhatikan apa pun.

Untuk membuatnya lebih nyaman bagi Anda untuk mengontrol operasi antrian, kami telah menambahkan sejumlah besar grafik visual ke YMQ, hanya sebagian kecil dari mereka yang ditampilkan di sini. Grafik terletak di konsol Yandex.Cloud, di bagian "Statistik".


Kami akan memberi tahu Anda tentang empat grafik paling berguna menurut kami:

  • Grafik "Pesan Antrian" membantu Anda memantau akumulasi data dalam antrian. Pertumbuhan dalam grafik dapat berarti bahwa penangan tidak mengelola beban atau pemrosesan telah berhenti.
  • Grafik "Usia pesan tertua dalam antrian" : nilai besar menunjukkan masalah dengan pemrosesan pesan. Jika semuanya berfungsi dengan benar, pesan tidak boleh dalam antrian untuk waktu yang lama.
  • Grafik "Jumlah upaya untuk membaca pesan" menunjukkan kapan pesan mulai dibaca beberapa kali. Ini mungkin berarti bahwa penangan macet ketika mereka menerima beberapa pesan.
  • Grafik "Waktu antrian" menunjukkan berapa lama waktu berlalu sejak pesan dikirim ke antrian sampai pawang menerimanya.

Grafik membantu untuk secara instan mengevaluasi dinamika antrian dan adanya kegagalan tanpa perlu melihat log.

Kami membahas lebih atau kurang poin-poin umum, sekarang mari kita beralih ke detailnya.

Bagaimana Antrian Basis Data Yandex menggunakan Basis Data Yandex


Layanan Antrian Pesan Yandex dibangun di atas basis data Yandex Database (YDB) yang toleran terhadap kesalahan yang didistribusikan secara geografis, yang memberikan konsistensi dan dukungan ketat untuk transaksi ACID. Kami sekarang tidak akan membongkar perangkat dan karakteristiknya, kami akan membatasi diri pada skema umum.


Antrian di YMQ terdiri dari pecahan logis, diwakili oleh beberapa set tetap tabel YDB. Setiap tabel menyimpan informasi sendiri. Misalnya, ada tabel keadaan umum yang disebut negara, yang menyimpan dan jumlah sebenarnya pesan. Ada tabel dengan metadata data dan pesan. Ada tabel dengan atribut terkait.

Semua operasi utama dengan antrian - bekerja dengan pesan, mengubah atribut, membuat dan menghapus - ini berfungsi dengan hierarki tabel dan direktori YDB, atau kueri transaksional ke satu atau lebih tabel antrian. Data di dalam tabel antrian adalah sumber kebenaran absolut. Oleh karena itu, selain operasi database yang benar dan stabil, perlu untuk memastikan penyimpanan yang andal dan ketersediaan data yang tinggi.

Informasi kami disimpan dalam beberapa replika: satu salinan di masing-masing dari tiga pusat data Yandex. Jika salah satu pusat data tidak tersedia, jumlah replika yang tersisa berlipat ganda. Dengan demikian, tingkat keandalan yang diperlukan dipulihkan. Bahkan jika seluruh pusat data dan satu meja layanan di tempat lain gagal, data akan sepenuhnya dapat diakses.

Versi pertama dari arsitektur Antrian Pesan Yandex


Versi pertama dari arsitektur YMQ, yang kami sebut naif, tampak seperti ini.


Diagram menunjukkan jalur permintaan HTTPS dari klien YMQ ke repositori YDB. Mari kita lihat komponen-komponen utamanya:

  1. L3-balancer mengirimkan permintaan ke pusat data Yandex yang terdekat dengan pengguna. Ini mengurangi latensi jaringan, meskipun beban didistribusikan secara tidak merata.
  2. Nginx pada mesin virtual Yandex.Cloud mengakhiri koneksi HTTPS, memberikan perlindungan terhadap serangan jaringan dan proksi permintaan lebih lanjut ke server YMQ, sudah dalam HTTP.
  3. Server HTTP YMQ mengimplementasikan logika SQS HTTP API, memvalidasi dan menerjemahkan permintaan ke dalam format protobuf yang sangat diketik.
  4. Sistem Aktor YMQ - Sistem Aktor . Secara bersamaan meluncurkan ribuan aktor yang berbeda bertukar informasi. Sistem aktor dari setiap host adalah bagian dari sebuah cluster. Semua aktor di cluster hidup dan bertindak sebagai satu kesatuan. Logika bisnis YMQ diimplementasikan di berbagai pelaku yang terlibat dalam permintaan transaksi ke YDB.
  5. Tablet YDB ("tablet") - bagian dari inti YDB, yang bertanggung jawab untuk bekerja dengan tabel dalam kueri dan transaksi. Tablet itu sendiri tidak menyimpan data. Ini adalah struktur kontrol dalam memori yang dapat memulihkan keadaan jika terjadi kegagalan perangkat keras.
  6. Penyimpanan adalah penyimpanan yang andal, didistribusikan, dan tahan terhadap kesalahan.

Arsitektur ini memiliki kelemahan: semua server di gugus bekerja secara independen dengan tabel dari antrian yang sama. Ini memengaruhi kinerja secara negatif dan mencegah pengaturan cache pesan tersembunyi dan dapat dibaca yang dapat diandalkan. Sulit untuk membatasi aliran permintaan, dan ini sangat penting untuk layanan yang sangat dimuat.

Arsitektur Antrian Pesan Yandex dengan master antrian


Load firing menunjukkan bahwa versi pertama arsitektur bertahan sekitar 450 pesan per detik per antrian dengan satu beling. Itu sangat kecil.
Masalah utama adalah pertanyaan pertengkaran. Sejumlah besar transaksi yang bertentangan secara logis dengan cepat membawa cache pesan tersembunyi ke keadaan yang tidak konsisten. Untuk mengatasi masalah tersebut, kami memperkenalkan entitas khusus - master antrian.


Master antrian adalah aktor yang, dalam kondisi normal, ada dalam satu cluster dalam satu instance dan melewati semua permintaan yang terkait dengan antrian tertentu. Jika permintaan ke antrian tiba di server di mana master yang diinginkan tidak ada, aktor proxy khusus mengalihkan permintaan dan kemudian menerjemahkan respons yang diterima kembali dari master.

Saat menggunakan Antrian Wizard, cache yang benar dari pesan yang tidak dikunci mengurangi pertikaian ketika bekerja dengan tabel. Implementasi pembatasan aliran permintaan disederhanakan, misalnya, melalui ember Leaky . Metrik antrian cepat dan akurat tersedia: jumlah pesan, lalu lintas total, dan sejenisnya. Anda dapat mengelompokkan permintaan serupa.

Secara teori, arsitektur semacam itu memiliki kelemahan tertentu yang terkait dengan sentralisasi:

  1. Mengurangi toleransi kesalahan: jika mesin virtual dengan master gagal, semua antrian dengan master di atasnya tidak akan tersedia. Namun, mekanisme khusus YDB memungkinkan Anda untuk meningkatkan master baru di dalam cluster hanya dalam beberapa detik. Ini sebagian besar memecahkan masalah.
  2. Skalabilitas terbatas: semua permintaan melalui satu host. Kerugiannya adalah tablet YDB diratakan. Mereka melakukan semua kerja keras dengan data. Dan master secara tidak sinkron mengirimkan permintaan dan memproses hasil yang diterima. Ini membuatnya menjadi entitas "ringan" yang tidak menciptakan efek "bottleneck" selama pengujian stres.

Antrian Wisaya Antrian


Transaksi terdistribusi dengan tabel database menyebabkan biaya tambahan tertentu, sehingga ide untuk mengurangi jumlah kueri tampak logis bagi kami. Seratus transaksi untuk merekam pesan satu per satu lebih baik untuk berubah menjadi satu transaksi untuk merekam seratus pesan sekaligus. Dengan master antrian, menerapkan pemrosesan batch (batching) seperti itu jauh lebih mudah.


Batching sedikit meningkatkan latensi selama operasi. Sebaliknya, bandwidth meningkat secara signifikan. Dengan batching, antrian single-shard dapat memproses hingga 30.000 permintaan per detik.

Secara umum, pemuatan antrian bisa sangat berbeda: ribuan pesan per detik dan beberapa pesan per hari. Kami perlu mengoptimalkan pekerjaan dengan antrian menggunakan algoritma yang fleksibel. Opsi frontal dengan akumulasi pesan dalam buffer ke nomor ambang batas atau reset timer tidak cocok untuk kita. Oleh karena itu, kami mengembangkan algoritma batching adaptif untuk YMQ yang bekerja dengan baik dalam kedua kasus. Karyanya ditampilkan dalam format grafik waktu.


Di sini, ketika pesan baru tiba, satu dari tiga skenario dimungkinkan:

  1. Transaksi dimulai secara instan jika tidak ada transaksi lain dari jenis ini yang berjalan.
  2. Jika sudah ada transaksi yang berjalan, pesan ditambahkan ke buffer dan menunggu transaksi selesai.
  3. Jika ukuran buffer melebihi nilai ambang batas, transaksi paralel lain diluncurkan. Jumlah transaksi bersamaan terbatas.

Gagasan batching adaptif menyerupai algoritma Nagle untuk TCP / IP. : , latency . , . .


Yandex Message Queue, , . , , -.

YDB . YMQ .

, , , .


YMQ . . «» .


YDB . , , , «». , . .


: . , «» . -, «» , «», .

« » . , , .

Yandex Message Queue


Yandex Message Queue – - . . , . .

  • - , , . .
  • API , . , .
  • , : , . , . . boto, 24/7, - .
  • , , . .

. - . . .

:

  • 5, ;
  • YDB;
  • , , , ;
  • , ;
  • . .

.

Kesimpulannya


Tugas tim infrastruktur di Yandex adalah menciptakan dan memelihara solusi yang andal, dapat diskalakan, dan produktif, berdasarkan pada produk-produk baru yang dapat diluncurkan dengan cepat dan berhasil yang meningkatkan kehidupan pengguna akhir. Di dalam perusahaan, layanan antrian kami telah lama membuktikan kegunaannya dan telah menjadi bagian dari arsitektur Yandex.Video, Yandex.Market, Yandex.Pendidikan, Yandex.Taxi, dan layanan lainnya.

Sekarang tersedia di ekosistem Yandex.Cloud dan dapat digunakan untuk membangun layanan di dalam dan di luar Cloud itu sendiri. Sekarang pengguna baru saat pendaftaran menerima hibah uang untuk sosialisasi, sehingga Anda dapat mencoba Antrean Pesan Yandex secara gratis.

Source: https://habr.com/ru/post/id455642/


All Articles