Cara menggunakan Redis untuk aplikasi pemeteran masa nyata

Roshan Kumar adalah pengurus produk kanan di Redis Labs .

Pengukuran bukan hanya masalah pengiraan yang mudah. Metering sering dikelirukan dengan pengukuran, tetapi biasanya lebih daripada itu. Metering melibatkan pengukuran, tetapi sebagai proses yang sedang berlangsung, biasanya dengan tujuan mengatur penggunaan atau aliran sumber dari masa ke masa. Aplikasi moden menggabungkan pengukuran dalam berbagai cara, mulai dari menghitung orang, objek, atau acara hingga mengatur penggunaan, mengendalikan akses, dan mengalokasikan kapasitas.

Penyelesaian pengukuran biasanya mesti memproses data dalam jumlah yang banyak sambil memenuhi syarat prestasi yang ketat. Bergantung pada skala penyelesaian, pengiraan dan pengukuran mungkin melibatkan ribuan jika tidak berjuta-juta kemas kini ke pangkalan data setiap saat. Keperluan utama pangkalan data untuk menyokong penyelesaian tersebut adalah throughput yang tinggi untuk operasi tulis dan latensi rendah (sub milidetik) untuk respons.

Redis, platform pangkalan data dalam memori terbuka, memberikan kedua-dua faedah ini dan juga menjimatkan kos dari segi penggunaan sumber perkakasan yang minimum. Dalam artikel ini kita akan mengkaji ciri-ciri tertentu Redis yang menjadikannya pilihan yang baik untuk penyelesaian meteran, dan bagaimana kita dapat menggunakan Redis untuk tujuan tersebut. Tetapi pertama, mari kita lihat beberapa penggunaan pemeteran yang lebih biasa.

Aplikasi pemeteran biasa

Pengukuran diperlukan dalam aplikasi yang mesti mengukur penggunaan sumber dari masa ke masa. Berikut adalah empat senario biasa:

  1. Model harga berdasarkan penggunaan . Tidak seperti model pembayaran sekali pakai atau langganan, model harga berdasarkan penggunaan membolehkan pengguna membayar hanya untuk penggunaan sebenar. Pengguna menikmati fleksibiliti, kebebasan, dan penjimatan kos yang lebih besar sementara penyedia memperoleh pengekalan pengguna yang lebih besar.

    Melaksanakan model sedemikian boleh menjadi sukar. Kadang kala sistem pengukuran mesti mengesan banyak item penggunaan dan banyak metrik dalam satu rancangan. Sebagai contoh, penyedia awan boleh menetapkan tahap harga yang berbeza untuk kitaran CPU, penyimpanan, throughput, bilangan nod, atau jangka masa perkhidmatan digunakan. Syarikat telekomunikasi boleh menetapkan tahap penggunaan yang dibenarkan selama beberapa minit, data, atau teks. Penyelesaian pengukuran mesti menguatkan pembatasan, pengisian, atau memperluas perkhidmatan bergantung pada jenis harga berdasarkan penggunaan.

  2. Mengehadkan penggunaan sumber . Setiap perkhidmatan di Internet boleh disalahgunakan melalui penggunaan yang berlebihan melainkan jika perkhidmatan itu terhad. Perkhidmatan popular seperti Google AdWords API dan Twitter Stream API menggabungkan had kadar untuk alasan ini. Beberapa kes penyalahgunaan yang melampau menyebabkan penolakan perkhidmatan (DoS). Untuk mengelakkan penyalahgunaan, perkhidmatan dan penyelesaian yang dapat diakses di Internet mesti dirancang dengan peraturan pembatasan kadar yang betul. Malah halaman pengesahan dan log masuk yang sederhana mesti mengehadkan bilangan percubaan untuk selang waktu tertentu.

    Contoh lain di mana menyekat penggunaan sumber menjadi mustahak adalah ketika mengubah keperluan perniagaan memberi beban yang lebih besar pada sistem warisan daripada yang dapat mereka dukung. Kadar yang membatasi panggilan ke sistem warisan membolehkan perniagaan menyesuaikan diri dengan permintaan yang semakin meningkat tanpa perlu mengganti sistem warisan mereka.

    Selain mencegah penyalahgunaan dan mengurangkan beban, pembatasan kadar yang baik juga membantu pengurusan senario lalu lintas yang sesak. Sebagai contoh, API yang menguatkuasakan kaedah had kadar kekerasan boleh membenarkan 1000 panggilan setiap jam. Tanpa polisi yang membentuk lalu lintas, pelanggan boleh memanggil API 1000 kali dalam beberapa saat pertama setiap jam, mungkin melebihi yang dapat disokong oleh infrastruktur. Algoritma pembatasan kadar yang popular seperti Token Bucket dan Leaky Bucket mencegah ledakan dengan bukan sahaja mengehadkan panggilan, tetapi juga menyebarkannya dari masa ke masa.

  3. Pembahagian sumber . Kesesakan dan kelewatan adalah senario biasa dalam aplikasi yang berkaitan dengan perutean paket, pengurusan pekerjaan, kesesakan lalu lintas, kawalan orang ramai, pemesejan media sosial, pengumpulan data, dan sebagainya. Model antrian menawarkan beberapa pilihan untuk menguruskan ukuran giliran berdasarkan kadar kedatangan dan keberangkatan, tetapi menerapkan model ini dalam skala besar tidak mudah.

    Backlog dan kesesakan adalah kebimbangan berterusan ketika berhadapan dengan aliran data yang pantas. Pereka yang pandai perlu menentukan had panjang giliran yang boleh diterima, sambil menggabungkan pemantauan prestasi giliran dan perutean dinamik berdasarkan ukuran barisan.

  4. Mengira pada skala untuk membuat keputusan masa nyata . Laman web e-dagang, aplikasi permainan, media sosial, dan aplikasi mudah alih menarik berjuta-juta pengguna harian. Oleh kerana lebih banyak bola mata menghasilkan pendapatan yang lebih besar, menghitung pengunjung dan tindakan mereka dengan tepat sangat penting untuk perniagaan. Pengiraan juga berguna untuk kes penggunaan seperti percubaan ralat, peningkatan masalah, pencegahan serangan DDoS, profil lalu lintas, peruntukan sumber berdasarkan permintaan, dan pengurangan penipuan.

Cabaran reka bentuk pemeteran

Arkitek penyelesaian harus mempertimbangkan banyak parameter ketika membuat aplikasi pengukuran, bermula dengan empat ini:

  1. Kerumitan reka bentuk. Menghitung, melacak, dan mengatur volume data — terutama ketika mereka mencapai kecepatan tinggi — adalah tugas yang menakutkan. Arkitek penyelesaian dapat menangani pemeteran pada lapisan aplikasi dengan menggunakan struktur bahasa pengaturcaraan. Walau bagaimanapun, reka bentuk seperti ini tidak tahan terhadap kegagalan atau kehilangan data. Pangkalan data berasaskan cakera tradisional kuat, dan menjanjikan tahap ketahanan data yang tinggi semasa kegagalan. Tetapi tidak hanya mereka gagal memberikan prestasi yang diperlukan, mereka juga meningkatkan kerumitan tanpa struktur data dan alat yang tepat untuk melaksanakan pemeteran.
  2. Kependaman. Metering biasanya melibatkan banyak pembaruan berterusan untuk jumlah. Latensi membaca / menulis rangkaian dan cakera bertambah sambil berurusan dengan jumlah yang banyak. Ini dapat menyebabkan bola salji dapat mengumpulkan banyak data yang membawa kepada kelewatan. Sumber latensi lain adalah reka bentuk program yang memuatkan data pengukuran dari pangkalan data ke memori utama program, dan menulis kembali ke pangkalan data apabila selesai mengemas kini penghitung.
  3. Kesesuaian dan ketekalan. Merangka penyelesaian untuk mengira berjuta-juta dan berbilion item menjadi rumit apabila peristiwa ditangkap di kawasan yang berlainan, dan semuanya perlu bersatu di satu tempat. Ketekalan data menjadi masalah jika banyak proses atau utas mengemas kini kiraan yang sama secara serentak. Teknik mengunci mengelakkan masalah konsistensi dan memberikan konsistensi tahap transaksi, tetapi memperlahankan penyelesaiannya.
  4. Ketahanan. Pengukuran mempengaruhi jumlah pendapatan, yang menunjukkan bahawa pangkalan data sementara tidak sesuai dari segi ketahanan. Datastore dalam memori dengan pilihan ketahanan adalah pilihan yang tepat.

Menggunakan Redis untuk aplikasi pemeteran

Pada bahagian berikut kita akan mengkaji bagaimana menggunakan Redis untuk menghitung dan mengukur meter. Redis mempunyai struktur data bawaan, perintah atom, dan kemampuan time-to-live (TTL) yang dapat digunakan untuk membuat kes penggunaan meteran. Redis berjalan pada satu utas. Oleh itu, semua kemas kini pangkalan data dilakukan secara bersiri, membolehkan Redis berfungsi sebagai penyimpanan data tanpa kunci. Ini menyederhanakan reka bentuk aplikasi kerana pemaju tidak perlu mengeluarkan usaha untuk menyegerakkan benang atau melaksanakan mekanisme penguncian untuk konsistensi data.  

Atomic Redis memerintahkan untuk mengira

Redis memberikan arahan untuk meningkatkan nilai tanpa syarat membacanya ke memori utama aplikasi.

Perintah Penerangan
INCR kunci Menambah nilai integer kekunci satu
INCRBY kenaikan kunci Menambah nilai integer kunci dengan nombor yang diberikan
INCRBYFLOAT kenaikan kunci Menambah nilai apungan kunci dengan jumlah yang diberikan
DECR kunci Turunkan nilai integer kekunci satu
DECRBY pengurangan kunci Turunkan nilai integer kunci dengan nombor yang diberikan
HINCRBY kenaikan bidang utama Menambah nilai integer medan hash dengan nombor yang diberikan
HINCRBYFLOAT kenaikan bidang utama Tingkatkan nilai apungan medan hash dengan jumlah yang diberikan

Redis menyimpan bilangan bulat sebagai integer asas-10 64-bit yang ditandatangani. Oleh itu had maksimum bagi bilangan bulat adalah bilangan yang sangat besar: 263 - 1 = 9,223,372,036,854,775,807.

Time-to-live terbina dalam (TTL) pada kekunci Redis

Salah satu kes penggunaan yang biasa dalam pengukuran adalah untuk mengesan penggunaan terhadap waktu dan untuk membatasi sumber daya setelah waktu habis. Di Redis, seseorang dapat menetapkan nilai masa untuk hidup untuk kunci. Redis akan mematikan kekunci secara automatik setelah tamat masa yang ditetapkan. Jadual berikut menyenaraikan beberapa kaedah kunci tamat tempoh.

Perintah Penerangan
EXPIRE detik penting Tetapkan masa kunci untuk hidup dalam beberapa saat
EXPIREAT cap waktu utama Tetapkan masa tamat untuk kunci sebagai cap waktu Unix
PEXPIRE milisaat utama Tetapkan masa kunci untuk hidup dalam milisaat
PEXPIREAT cap waktu utama Tetapkan masa tamat untuk kunci sebagai cap waktu UNIX dalam milisaat
SET nilai kunci [saat EX] [PX milisaat] Tetapkan nilai rentetan ke kunci bersama dengan masa pilihan untuk hidup

Mesej di bawah memberi anda masa untuk hidup pada kunci dari segi detik dan milisaat.

Perintah Penerangan
TTL kunci Luangkan masa untuk hidup dengan kunci
PTTL kunci Luangkan masa untuk hidup dengan kunci dalam milisaat

Buat semula struktur data dan arahan untuk pengiraan yang cekap

Redis sangat disukai kerana struktur datanya seperti Daftar, Set, Kumpulan Diurutkan, Hash dan Hyperloglog. Banyak lagi yang boleh ditambah melalui API modul Redis.

Makmal Redis

Struktur data redis dilengkapi dengan perintah bawaan yang dioptimumkan untuk dilaksanakan dengan kecekapan maksimum dalam memori (tepat di mana data disimpan). Beberapa struktur data membantu anda mencapai lebih banyak daripada pengiraan objek. Sebagai contoh, struktur data Set menjamin keunikan untuk semua elemen.

Set Diurut melangkah lebih jauh dengan memastikan bahawa hanya elemen unik yang ditambahkan ke set, dan membolehkan anda memesan elemen berdasarkan skor. Menyusun elemen anda mengikut masa dalam struktur data Set Diurut, misalnya, akan menawarkan pangkalan data siri masa. Dengan bantuan perintah Redis, anda boleh mendapatkan unsur-unsur anda dalam urutan tertentu, atau menghapus item yang anda tidak perlukan lagi.

Hyperloglog adalah struktur data khas lain yang menganggarkan berjuta-juta item unik tanpa perlu menyimpan objek itu sendiri atau memori impak.

Struktur data Perintah Penerangan
Senaraikan LLEN kunci Dapatkan panjang senarai
Tetapkan SCARD kunci Dapatkan bilangan ahli dalam satu set (kardinaliti)
Set yang disusun ZCARD kunci Dapatkan bilangan ahli dalam satu set yang disusun
Set yang disusun ZLEXCOUNT kunci min maks Hitung bilangan ahli dalam satu set yang disusun antara julat leksikografi yang diberikan
Hash HLEN kunci Dapatkan bilangan medan dalam hash
Hiploglog PFCOUNT kunci Dapatkan anggaran kardinaliti set yang diperhatikan oleh struktur data Hyperloglog
Bitmap BITCOUNT kunci [permulaan akhir] Kiraan menetapkan bit dalam rentetan

Rediskan kegigihan dan replikasi dalam ingatan

Kes penggunaan meter seperti pembayaran melibatkan menyimpan dan mengemas kini maklumat yang penting bagi perniagaan. Kehilangan data mempunyai kesan langsung terhadap pendapatan. Ini juga dapat memusnahkan rekod penagihan, yang sering merupakan persyaratan kepatuhan atau pemerintahan.

Anda dapat menyesuaikan ketekalan dan ketahanan dalam Redis berdasarkan keperluan data anda. Sekiranya anda memerlukan bukti rekod tetap untuk data pemeteran anda, anda dapat mencapai ketahanan melalui kemampuan ketekunan Redis. Redis menyokong AOF (file append-only), yang menyalin perintah tulis ke disk semasa ia berlaku, dan snapshotting, yang mengambil data seperti yang ada pada satu masa dan menulisnya ke disk.

Senibina Redis bebas kunci terbina dalam

Pemprosesan redis adalah satu utas; ini memastikan integriti data, kerana semua arahan menulis secara bersiri secara automatik. Senibina ini melegakan para pemaju dan arkitek dari beban menyegerakkan benang dalam persekitaran multithread.

Sekiranya aplikasi mudah alih pengguna popular, ribuan dan kadang-kadang berjuta-juta pengguna mungkin mengakses aplikasi tersebut secara serentak. Katakanlah aplikasi mengukur masa yang digunakan, dan dua atau lebih pengguna dapat berkongsi minit secara bersamaan. Benang selari dapat mengemas kini objek yang sama tanpa membebankan beban tambahan untuk memastikan integriti data. Ini mengurangkan kerumitan reka bentuk aplikasi sambil memastikan kelajuan dan kecekapan.

Rediskan pelaksanaan sampel pemeteran

Mari lihat contoh kod. Beberapa senario di bawah memerlukan pelaksanaan yang sangat kompleks sekiranya pangkalan data yang digunakan bukan Redis.

Menyekat beberapa percubaan log masuk

Untuk mengelakkan akses ke akaun yang tidak dibenarkan, laman web kadang-kadang menyekat pengguna membuat banyak percubaan masuk dalam jangka waktu yang ditetapkan. Dalam contoh ini, kami mengehadkan pengguna daripada membuat lebih daripada tiga percubaan log masuk dalam satu jam menggunakan fungsi kunci masa-untuk-hidup yang mudah.

Kunci untuk menahan bilangan percubaan log masuk:

user_login_attempts:

Langkah-langkah:

Dapatkan jumlah percubaan semasa:

DAPATKAN percubaan_login_ pengguna:

Sekiranya batal, tetapkan kunci dengan masa tamat dalam beberapa saat (1 jam = 3600 saat):

SET user_login_attempts: 1 3600

Sekiranya tidak batal dan jika kiraannya lebih besar dari 3, maka laksanakan kesalahan:

Sekiranya tidak kosong, dan jika kiraannya kurang dari atau sama dengan 3, tambahkan jumlahnya:

INCR user_login_attempts:

Setelah percubaan masuk berjaya, kunci boleh dipadamkan seperti berikut:

DEL pengguna_login_bercuba:

Bayar semasa awak hendak pergi

Struktur data Redis Hash memberikan arahan mudah untuk mengesan penggunaan dan penagihan. Dalam contoh ini, anggap setiap pelanggan mempunyai data penagihan mereka yang tersimpan dalam Hash, seperti yang ditunjukkan di bawah:

penagihan_ pelanggan:

     penggunaan

     kos

     .

     .

Katakan setiap unit berharga dua sen, dan pengguna menghabiskan 20 unit. Perintah untuk mengemas kini penggunaan dan penagihan adalah:

pelanggan hincrby: penggunaan 20

pelanggan hincrbyfloat: kos .40

Seperti yang anda perhatikan, aplikasi anda dapat mengemas kini informasi dalam pangkalan data tanpa memerlukannya memuatkan data dari pangkalan data ke dalam ingatannya sendiri. Selain itu, anda boleh mengubah bidang individu objek Hash tanpa membaca keseluruhan objek.

Harap maklum: Tujuan dari contoh ini adalah untuk menunjukkan cara menggunakan hincrbydan hincrbyfloatperintah. Dengan reka bentuk yang baik, anda mengelakkan menyimpan maklumat berlebihan seperti penggunaan dan kos.