Cara menggunakan kumpulan pengguna dalam Redis Streams

Roshan Kumar adalah pengurus produk kanan di Redis Labs.

Redis Streams adalah struktur data baru, diperkenalkan di Redis 5.0, yang membolehkan anda membuat dan menguruskan aliran data. Dalam artikel sebelumnya, saya menunjukkan cara menambahkan data ke aliran, dan cara membaca data dengan pelbagai cara. Dalam artikel ini, saya akan menerangkan cara menggunakan kumpulan pengguna dalam Redis Streams. Kumpulan pengguna adalah cara untuk membagi aliran mesej di antara beberapa pelanggan untuk mempercepat pemprosesan atau meringankan beban untuk pengguna yang lebih lambat.

Dalam dunia yang sempurna, kedua-dua pengeluar data dan pengguna bekerja pada kadar yang sama, dan tidak ada kehilangan data atau tunggakan data. Malangnya, itu tidak berlaku di dunia nyata. Dalam hampir semua kes penggunaan pemprosesan aliran data masa nyata, pengeluar dan pengguna bekerja dengan kelajuan yang berbeza. Di samping itu, terdapat lebih dari satu jenis pengguna, masing-masing mempunyai keperluan dan kecepatan pemprosesan sendiri. Redis Streams menangani keperluan ini dengan set ciri yang sangat menarik untuk menyokong pengguna. Salah satu ciri terpentingnya ialah kumpulan pengguna.

Bila hendak menggunakan kumpulan pengguna Redis Streams

Tujuan kumpulan pengguna adalah untuk meningkatkan proses penggunaan data anda. Mari kita pertimbangkan satu contoh - aplikasi pemprosesan gambar. Penyelesaiannya memerlukan tiga komponen utama:

  1. Pengeluar (satu atau lebih kamera, mungkin) yang menangkap dan menyimpan gambar;
  2. Redis Stream yang menyimpan gambar (di stor data aliran) mengikut urutan ia tiba; dan
  3. Pemproses gambar yang memproses setiap gambar. 
Makmal Redis

Katakan pengeluar anda menyimpan 500 gambar sesaat, dan pemproses gambar memproses hanya 100 gambar sesaat pada kapasiti penuh. Perbezaan kadar ini akan membuat tunggakan, dan pemproses gambar anda tidak akan dapat mengejar ketinggalan. Cara mudah untuk mengatasi masalah ini adalah dengan menjalankan lima pemproses gambar (seperti yang ditunjukkan dalam Gambar 2), masing-masing memproses sekumpulan gambar yang saling eksklusif. Anda dapat mencapainya melalui kumpulan pengguna, yang membolehkan anda membahagikan beban kerja dan mengarahkannya ke pengguna yang berbeza.

Makmal Redis

Kumpulan pengguna melakukan lebih banyak daripada pemisahan data - ia memastikan keselamatan data dan memungkinkan pemulihan bencana.

Bagaimana kumpulan pengguna Redis Streams berfungsi

Kumpulan pengguna adalah struktur data dalam Redis Stream. Seperti yang ditunjukkan dalam Gambar 3, anda boleh memikirkan kumpulan pengguna sebagai kumpulan senarai. Perkara lain yang dapat dibayangkan ialah senarai barang yang tidak dimakan oleh mana-mana pengguna - untuk perbincangan kita, mari kita sebut ini sebagai "senarai yang tidak dimakan." Ketika data tiba di aliran, data tersebut akan segera dimasukkan ke senarai yang tidak digunakan.

Makmal Redis

Kumpulan pengguna menyimpan senarai berasingan untuk setiap pengguna, biasanya dengan aplikasi yang dilampirkan. Pada gambar 3, penyelesaian kami mempunyai aplikasi N yang serupa (Aplikasi 1, Aplikasi 2,…. Aplikasi n) yang membaca data melalui Pengguna 1, Pengguna 2,… Pengguna n masing-masing.

Apabila aplikasi membaca data menggunakan perintah XREADGROUP, entri data tertentu dikeluarkan dari senarai yang tidak digunakan dan dimasukkan ke dalam senarai entri yang belum selesai yang menjadi milik pengguna masing-masing. Oleh itu, tidak ada dua pengguna yang menggunakan data yang sama.

Akhirnya, apabila aplikasi memberitahu aliran dengan arahan XACK, ia akan mengeluarkan item tersebut dari senarai entri yang belum selesai pengguna.

Setelah saya menjelaskan asas-asas kumpulan pengguna, mari kita menggali lebih mendalam bagaimana kitaran hayat data ini berfungsi.

Mewujudkan kumpulan pengguna Redis Streams

Anda boleh membuat kumpulan pengguna baru menggunakan perintah XGROUP CREATE, seperti gambar di bawah.

XGROUP BUAT kumpulan mystream $ MKSTREAM

Seperti XREAD, tanda $ di akhir arahan memberitahu aliran untuk menyampaikan hanya data baru dari masa itu ke depan. Pilihan alternatif adalah 0 atau ID lain dari entri aliran. Semasa menggunakan 0, aliran akan menyampaikan semua data dari awal aliran.

MKSTREAM membuat aliran baru, aliran saya dalam kes ini, jika ia belum wujud.

Membaca dan menguruskan data Redis Stream

Andaikan anda mempunyai Redis Stream (mystream), dan anda telah membuat kumpulan pengguna (mygroup) seperti yang ditunjukkan di atas. Anda kini boleh menambah item dengan nama a, b, c, d, e seperti contoh berikut.

XADD mystream * nama a

Menjalankan perintah ini untuk nama a hingga e akan mengisi Redis Stream, mystream, dan senarai pengguna pengguna mystream yang tidak digunakan. Ini digambarkan dalam Rajah 4.

Makmal Redis

Di sini anda dapat melihat bahawa pengguna Alice dan Bob belum memulakan pekerjaan mereka. Aplikasi A menggunakan data melalui pengguna Alice, sementara Aplikasi B menggunakan data melalui Bob.

Menggunakan data Redis Stream

Perintah untuk membaca data dari kumpulan adalah XREADGROUP. Dalam contoh kami, ketika Aplikasi A mulai memproses data, ia memanggil pengguna (Alice) untuk mengambil data, seperti dalam:

XREADGROUP GROUP mygroup COUNT 2 Alice STREAMS mystream>

Begitu juga, Aplikasi B membaca data melalui Bob, seperti berikut:

XREADGROUP GROUP mygroup COUNT 2 Bob STREAMS mystream>

Karakter khas> pada akhirnya memberitahu Redis Streams hanya mengambil entri data yang tidak dihantar kepada pengguna lain. Perhatikan juga bahawa tidak ada dua pengguna yang menggunakan data yang sama, yang akan mengakibatkan data dipindahkan dari senarai yang tidak dimakan ke Alice dan Bob seperti yang ditunjukkan pada Gambar 5.

Makmal Redis

Mengeluarkan mesej yang diproses dari senarai entri yang belum selesai

Data dalam senarai entri yang belum selesai pengguna anda akan tetap ada sehingga App A dan App B mengakui kepada Redis Streams bahawa mereka telah berjaya menggunakan data tersebut. Ini dilakukan dengan menggunakan arahan XACK. Sebagai contoh, Aplikasi A akan mengakui seperti berikut setelah menggunakan d dan e, yang mempunyai ID 1526569411111-0 dan 1526569411112-0.

XACK mystream mygroup 1526569411111-0 1526569411112-0

Kombinasi XREADGROUP dan XACK adalah serupa dengan memulakan transaksi dan melaksanakannya, yang menjamin keselamatan data. 

Setelah menjalankan XACK, mari kita anggap App A XREADGROUP dilaksanakan seperti yang ditunjukkan di bawah. Sekarang struktur data kelihatan seperti Gambar 6.

XREADGROUP GROUP mygroup COUNT 2 Alice STREAMS mystream>
Makmal Redis

Memulihkan dari kegagalan

Sekiranya Aplikasi B dihentikan kerana kegagalan semasa memproses b dan c, maka struktur data akan kelihatan seperti Gambar 7.

Makmal Redis

Kini anda tinggal dengan dua pilihan:

1. Mulakan semula Aplikasi B dan muatkan semula data dari pengguna (Bob).

Dalam kes ini, Aplikasi B mesti membaca data dari pengguna anda (Bob) menggunakan perintah XREADGROUP, tetapi dengan satu perbezaan. Daripada> pada akhir, Aplikasi B akan lulus 0 (atau ID lebih rendah daripada entri data sebelumnya yang diproses). Ingat bahawa> menghantar data baru dari senarai yang tidak digunakan kepada pengguna.

XREADGROUP GROUP mygroup COUNT 2 Bob STREAMS mystream 0

Perintah di atas akan mengambil entri data yang sudah disimpan dalam senarai untuk pengguna Bob. Ia tidak akan mengambil data baru dari senarai yang tidak digunakan. Aplikasi B dapat melakukan iterasi melalui semua data pada pengguna Bob sebelum mengambil data baru.

2. Memaksa Alice untuk menuntut semua data dari Bob dan memprosesnya melalui Aplikasi A.

Ini sangat berguna jika anda tidak dapat memulihkan Aplikasi B kerana nod, cakera, atau kegagalan rangkaian. Dalam kes seperti itu, mana-mana pengguna lain (seperti Alice) dapat menuntut data Bob dan terus memproses data tersebut, sehingga dapat mengelakkan waktu henti perkhidmatan. Untuk menuntut data Bob, anda mesti menjalankan dua set arahan:

MENGGANTIKAN kumpulan mystream - + 10 Bob

Ini akan mengambil semua entri data yang belum selesai untuk Bob. Pilihan - dan + ambil keseluruhan julat. Sekiranya b dan c mempunyai ID 1526569411113-0 dan 1526569411114-0 masing-masing, perintah yang akan memindahkan data Bob ke Alice adalah seperti berikut:

XCLAIM mystream mygroup Alice 0 1526569411113-0 1526569411114-0

Kumpulan pengguna mengekalkan jam berjalan untuk data dalam senarai habis. Contohnya, semasa Aplikasi B membaca b, jam akan masuk sehingga Bob menerima ACK. Dengan pilihan waktu dalam perintah XCLAIM, anda dapat memberitahu kumpulan pengguna untuk memindahkan data yang hanya diam lebih lama daripada waktu yang ditentukan. Anda juga boleh mengabaikannya dengan melewati 0 seperti yang ditunjukkan dalam contoh di atas. Hasil perintah ini digambarkan pada Gambar 8. XCLAIM juga berguna apabila salah satu pemproses pengguna anda lambat, sehingga mengakibatkan pengunduran data yang belum diproses.

Makmal Redis

Dalam artikel sebelumnya, kami membahas asas bagaimana menggunakan Redis Streams. Kami mengulas lebih mendalam mengenai artikel ini dan menerangkan kapan harus menggunakan kumpulan pengguna dan cara mereka bekerja. Kumpulan pengguna di Redis Stream mengurangkan beban anda ketika menguruskan partisi data, kitaran hidup mereka, dan keselamatan data. Tambahan, kemampuan skala pengguna kumpulan dapat memanfaatkan banyak aplikasi masa nyata.

Dalam artikel ketiga yang akan datang mengenai Redis Streams, saya akan menunjukkan bagaimana mengembangkan aplikasi klasifikasi masa nyata menggunakan Redis Streams dan Lettuce, perpustakaan sumber terbuka yang berpusat di Java untuk Redis. Sementara itu, anda boleh mengetahui lebih lanjut dengan menggunakan tutorial Redis Streams di laman web projek Redis. 

Roshan Kumar adalah pengurus produk kanan di  Redis Labs . Dia memiliki pengalaman luas dalam pengembangan perisian dan pemasaran teknologi. Roshan telah bekerja di Hewlett-Packard dan banyak syarikat permulaan Silicon Valley yang berjaya termasuk ZillionTV, Salorix, Alopa, dan ActiveVideo. Sebagai pengaturcara yang bersemangat, dia merancang dan mengembangkan mindzeal.com, platform dalam talian yang menganjurkan kursus pengaturcaraan komputer untuk pelajar muda. Roshan memiliki ijazah sarjana muda dalam bidang sains komputer dan MBA dari Santa Clara University.

-

Forum Teknologi Baru menyediakan tempat untuk meneroka dan membincangkan teknologi perusahaan yang baru muncul dalam kedalaman dan luas yang belum pernah terjadi sebelumnya. Pemilihannya bersifat subjektif, berdasarkan pilihan teknologi yang kami anggap penting dan paling menarik bagi pembaca. tidak menerima jaminan pemasaran untuk penerbitan dan berhak untuk mengedit semua kandungan yang disumbangkan. Hantarkan semua pertanyaan ke  [email protected] .