Cara menggunakan grup konsumen di Redis Streams

Roshan Kumar adalah manajer produk senior di Redis Labs.

Redis Streams adalah struktur data baru, diperkenalkan di Redis 5.0, yang memungkinkan Anda membuat dan mengelola aliran data. Di artikel sebelumnya, saya menunjukkan cara menambahkan data ke aliran, dan cara membaca data dengan berbagai cara. Di artikel ini, saya akan menjelaskan cara menggunakan grup konsumen di Redis Streams. Grup konsumen adalah cara untuk membagi aliran pesan di antara beberapa klien untuk mempercepat pemrosesan atau meringankan beban bagi konsumen yang lebih lambat.

Di dunia yang sempurna, baik produsen data maupun konsumen bekerja dengan kecepatan yang sama, dan tidak ada kehilangan data atau backlog data. Sayangnya, hal itu tidak terjadi di dunia nyata. Di hampir semua kasus penggunaan pemrosesan aliran data waktu nyata, produsen dan konsumen bekerja pada kecepatan yang berbeda. Selain itu, terdapat lebih dari satu jenis konsumen, masing-masing dengan persyaratan dan kecepatan pemrosesannya sendiri. Redis Streams menjawab kebutuhan ini dengan serangkaian fitur yang sangat tertarik untuk mendukung konsumen. Salah satu fiturnya yang paling penting adalah grup konsumen.

Kapan menggunakan grup konsumen Redis Streams

Tujuan grup konsumen adalah untuk meningkatkan proses konsumsi data Anda. Mari pertimbangkan satu contoh - aplikasi pemrosesan gambar. Solusinya membutuhkan tiga komponen utama:

  1. Seorang produser (satu atau lebih kamera, mungkin) yang menangkap dan menyimpan gambar;
  2. Redis Stream yang menyimpan gambar (dalam penyimpanan data aliran) sesuai urutan kedatangannya; dan
  3. Prosesor gambar yang memproses setiap gambar. 
Redis Labs

Misalkan produser Anda menyimpan 500 gambar per detik, dan prosesor gambar hanya memproses 100 gambar per detik pada kapasitas penuhnya. Perbedaan kecepatan ini akan membuat backlog, dan prosesor gambar Anda tidak akan pernah bisa mengejar ketinggalan. Cara mudah untuk mengatasi masalah ini adalah dengan menjalankan lima prosesor gambar (seperti yang ditunjukkan pada Gambar 2), masing-masing memproses satu set gambar yang saling eksklusif. Anda dapat mencapai ini melalui grup konsumen, yang memungkinkan Anda untuk membagi beban kerja Anda dan mengarahkannya ke konsumen yang berbeda.

Redis Labs

Grup konsumen melakukan lebih dari sekedar partisi data - ini memastikan keamanan data dan memungkinkan pemulihan bencana.

Cara kerja grup konsumen Redis Streams

Grup konsumen adalah struktur data dalam Redis Stream. Seperti yang ditunjukkan pada Gambar 3, Anda dapat menganggap grup konsumen sebagai kumpulan daftar. Hal lain yang dapat dibayangkan adalah daftar item yang tidak dikonsumsi oleh konsumen mana pun - untuk diskusi kita, sebut saja ini sebagai "daftar yang tidak dikonsumsi". Saat data tiba di aliran, data tersebut segera didorong ke daftar yang tidak dikonsumsi.

Redis Labs

Grup konsumen memiliki daftar terpisah untuk setiap konsumen, biasanya dengan aplikasi terlampir. Dalam gambar 3, solusi kami memiliki N aplikasi identik (Aplikasi 1, Aplikasi 2,…. Aplikasi n) yang membaca data masing-masing melalui Konsumen 1, Konsumen 2,… Konsumen n.

Saat aplikasi membaca data menggunakan perintah XREADGROUP, entri data tertentu dihapus dari daftar yang tidak digunakan dan didorong ke daftar entri tertunda milik masing-masing konsumen. Jadi, tidak ada dua konsumen yang akan mengkonsumsi data yang sama.

Terakhir, ketika aplikasi memberi tahu streaming dengan perintah XACK, itu akan menghapus item dari daftar entri konsumen yang tertunda.

Sekarang setelah saya menjelaskan dasar-dasar grup konsumen, mari kita gali lebih dalam bagaimana siklus hidup data ini bekerja.

Membuat grup konsumen Redis Streams

Anda dapat membuat grup konsumen baru menggunakan perintah XGROUP CREATE, seperti yang ditunjukkan di bawah ini.

XGROUP BUAT mystream mygroup $ MKSTREAM

Seperti XREAD, tanda $ di akhir perintah memberi tahu stream untuk hanya mengirimkan data baru dari titik waktu tersebut ke depan. Opsi alternatifnya adalah 0 atau ID lain dari entri aliran. Saat menggunakan 0, streaming akan mengirimkan semua data dari awal streaming.

MKSTREAM membuat aliran baru, mystream dalam hal ini, jika belum ada.

Membaca dan mengelola data Redis Stream

Asumsikan Anda memiliki Redis Stream (mystream), dan Anda telah membuat grup konsumen (mygroup) seperti yang ditunjukkan di atas. Anda sekarang dapat menambahkan item dengan nama a, b, c, d, e seperti pada contoh berikut.

XADD mystream * nama a

Menjalankan perintah ini untuk nama a hingga e akan mengisi Redis Stream, mystream, dan daftar mystream grup konsumen yang tidak digunakan. Ini diilustrasikan pada Gambar 4.

Redis Labs

Di sini Anda dapat melihat bahwa konsumen Alice dan Bob belum memulai pekerjaan mereka. Aplikasi A menggunakan data melalui konsumen Alice, sedangkan Aplikasi B menggunakan data melalui Bob.

Mengkonsumsi data Redis Streams

Perintah untuk membaca data dari grup adalah XREADGROUP. Dalam contoh kami, ketika App A mulai memproses data, itu memanggil konsumen (Alice) untuk mengambil data, seperti dalam:

XREADGROUP GROUP mygroup COUNT 2 Alice STREAMS mystream>

Demikian pula, App B membaca data melalui Bob, sebagai berikut:

XREADGROUP GROUP mygroup COUNT 2 Bob STREAMS mystream>

Karakter khusus> di bagian akhir memberi tahu Redis Streams untuk hanya mengambil entri data yang tidak dikirim ke konsumen lain. Perhatikan juga bahwa tidak ada dua konsumen yang akan menggunakan data yang sama, yang akan mengakibatkan pemindahan data dari daftar yang tidak dikonsumsi ke Alice dan Bob seperti yang ditunjukkan pada Gambar 5.

Redis Labs

Menghapus pesan yang diproses dari daftar entri yang menunggu keputusan

Data dalam daftar entri tertunda konsumen Anda akan tetap ada sampai Aplikasi A dan Aplikasi B mengakui ke Redis Streams bahwa mereka telah berhasil menggunakan data tersebut. Ini dilakukan dengan menggunakan perintah XACK. Misalnya, Aplikasi A akan mengakui sebagai berikut setelah menggunakan d dan e, yang memiliki ID 1526569411111-0 dan 1526569411112-0.

XACK mystream mygroup 1526569411111-0 1526569411112-0

Kombinasi XREADGROUP dan XACK dapat dianalogikan dengan memulai transaksi dan melakukannya, yang memastikan keamanan data. 

Setelah menjalankan XACK, mari asumsikan App A XREADGROUP dieksekusi seperti yang ditunjukkan di bawah ini. Sekarang struktur datanya terlihat seperti Gambar 6.

XREADGROUP GROUP mygroup COUNT 2 Alice STREAMS mystream>
Redis Labs

Memulihkan dari kegagalan

Jika App B dihentikan karena kegagalan saat memproses b dan c, maka struktur datanya akan terlihat seperti Gambar 7.

Redis Labs

Sekarang Anda memiliki dua opsi:

1. Mulai ulang Aplikasi B dan muat ulang data dari konsumen (Bob).

Dalam kasus ini, Aplikasi B harus membaca data dari konsumen Anda (Bob) menggunakan perintah XREADGROUP, tetapi dengan satu perbedaan. Alih-alih> di akhir, App B akan meneruskan 0 (atau ID lebih rendah dari entri data sebelumnya yang diproses). Ingatlah bahwa> mengirimkan data baru dari daftar yang tidak terpakai ke konsumen.

XREADGROUP GROUP mygroup COUNT 2 Bob STREAMS mystream 0

Perintah di atas akan mengambil entri data yang sudah disimpan dalam daftar untuk konsumen Bob. Ini tidak akan mengambil data baru dari daftar yang tidak dikonsumsi. Aplikasi B dapat melakukan iterasi melalui semua data di Bob konsumen sebelum mengambil data baru.

2. Paksa Alice untuk mengklaim semua data dari Bob dan memprosesnya melalui Aplikasi A.

Ini sangat membantu jika Anda tidak dapat memulihkan App B karena node, disk, atau kegagalan jaringan. Dalam kasus seperti itu, konsumen lain (seperti Alice) dapat mengklaim data Bob dan terus memproses data tersebut, sehingga mencegah downtime layanan. Untuk mengklaim data Bob, Anda harus menjalankan dua set perintah:

XPENDING mystream mygroup - + 10 Bob

Ini akan mengambil semua entri data yang menunggu keputusan untuk Bob. Opsi - dan + mengambil seluruh rentang. Jika b dan c masing-masing memiliki ID 1526569411113-0 dan 1526569411114-0, perintah yang akan memindahkan data Bob ke Alice adalah sebagai berikut:

XCLAIM mystream mygroup Alice 0 1526569411113-0 1526569411114-0

Grup konsumen mempertahankan jam berjalan untuk data dalam daftar yang dikonsumsi. Misalnya, ketika App B membaca b, jam bekerja sampai Bob menerima ACK. Dengan opsi waktu di perintah XCLAIM, Anda dapat memberi tahu grup konsumen untuk hanya memindahkan data yang menganggur lebih lama dari waktu yang ditentukan. Anda juga dapat mengabaikannya dengan meneruskan 0 seperti yang ditunjukkan pada contoh di atas. Hasil dari perintah ini diilustrasikan pada Gambar 8. XCLAIM juga berguna ketika salah satu prosesor konsumen Anda lambat, menghasilkan simpanan data yang belum diproses.

Redis Labs

Di artikel sebelumnya, kami membahas dasar-dasar cara menggunakan Redis Streams. Kami membahas lebih dalam di artikel ini dan menjelaskan kapan harus menggunakan grup konsumen dan cara kerjanya. Grup konsumen di Redis Streams mengurangi beban Anda dalam hal mengelola partisi data, siklus proses, dan keamanan data. Selain itu, kemampuan skala kelompok konsumen dapat menguntungkan banyak aplikasi waktu nyata.

Dalam artikel ketiga yang akan datang di Redis Streams, saya akan mendemonstrasikan cara mengembangkan aplikasi klasifikasi waktu nyata menggunakan Redis Streams and Lettuce, perpustakaan sumber terbuka berbasis Java untuk Redis. Sementara itu, Anda dapat mempelajari lebih lanjut dengan mempelajari tutorial Aliran Redis di situs web proyek Redis. 

Roshan Kumar adalah manajer produk senior di  Redis Labs . Dia memiliki pengalaman luas dalam pengembangan perangkat lunak dan pemasaran teknologi. Roshan telah bekerja di Hewlett-Packard dan banyak perusahaan rintisan Silicon Valley yang sukses termasuk ZillionTV, Salorix, Alopa, dan ActiveVideo. Sebagai programmer yang antusias, dia merancang dan mengembangkan mindzeal.com, platform online yang menyelenggarakan kursus pemrograman komputer untuk siswa muda. Roshan memegang gelar sarjana dalam ilmu komputer dan MBA dari Santa Clara University.

-

Forum Teknologi Baru menyediakan tempat untuk mengeksplorasi dan mendiskusikan teknologi perusahaan yang sedang berkembang secara mendalam dan luas. Pemilihan ini subjektif, berdasarkan pilihan teknologi yang kami yakini penting dan paling menarik bagi pembaca. tidak menerima jaminan pemasaran untuk publikasi dan berhak untuk mengedit semua konten yang dikontribusikan. Kirim semua pertanyaan ke  [email protected] .