Apa itu perhitungan waktu nyata?
Silakan lihat gambar di bawah ini:
Ambil statistik produk panas sebagai contoh untuk melihat metode perhitungan tradisional:
1 Simpan perilaku pengguna, log, dan informasi lainnya dalam database.
2 Simpan informasi pesanan dalam database.
3 Gunakan pemicu atau coroutine untuk menetapkan indeks lokal, atau indeks independen jarak jauh.
4join informasi pesanan, detail pesanan, informasi pengguna, informasi produk, dll., Mengumpulkan produk dalam waktu 20 menit, dan kembali ke top-10.
5web atau tampilan aplikasi.
Ini adalah adegan imajiner, tetapi dengan asumsi bahwa Anda memiliki pengalaman dalam menangani adegan yang sama, Anda harus mengalami masalah dan kesulitan seperti itu:
1. Masalah ekspansi horizontal (skala-keluar)
Jelas, jika itu adalah situs web e -commerce dengan skala tertentu, jumlah data sangat besar. Karena informasi transaksi melibatkan transaksi, sulit untuk secara langsung meninggalkan kemampuan transaksi database hubungan dan bermigrasi ke database NoSQL dengan kemampuan skala-out yang lebih baik.
Nah, itu umumnya dilakukan. Untungnya, kami dapat mengarsipkan pada tanggal dan menyimpan hasil dengan pemrosesan batch komputasi offline.
Namun, persyaratan di sini dalam waktu 20 menit, yang sulit.
2. Masalah Kinerja <BR /> Masalah ini konsisten dengan skala-out.
Pertanyaannya adalah, berapa kali kita perlu memasuki gudang?
Bagaimana dengan 10 menit?
Bagaimana dengan 5 menit?
Bagaimana dengan waktu nyata?
Selain itu, lapisan bisnis juga menghadapi keterbatasan daya komputasi satu titik dan membutuhkan ekspansi horizontal, sehingga perlu untuk mempertimbangkan masalah konsistensi.
Karena itu, semuanya sangat rumit di sini.
3. Masalah Ekspansi Bisnis <BR /> Dengan asumsi kita tidak hanya harus menangani statistik barang penjualan panas, tetapi juga klik iklan statistik, atau dengan cepat menentukan karakteristik pengguna berdasarkan perilaku akses pengguna untuk menyesuaikan informasi yang mereka lihat menunggu, bisnis tersebut Lapisan akan lebih rumit.
Mungkin Anda memiliki cara yang lebih baik, tetapi pada kenyataannya, yang kami butuhkan adalah kognisi baru:
Apa yang terjadi di dunia ini adalah waktu nyata.
Jadi kita membutuhkan model yang dihitung secara real time, bukan model pemrosesan batch.
Model yang kita butuhkan harus dapat memproses banyak data, jadi yang terbaik adalah memiliki kemampuan skala yang baik.
Kemudian, model komputasi ini adalah model perhitungan waktu nyata, yang juga dapat dianggap sebagai model komputasi streaming.
Sekarang dengan asumsi bahwa kami memiliki model seperti itu, kami dapat dengan senang hati merancang skenario bisnis baru:
Weibo apa yang paling diteruskan?
Apa produk terpanasnya?
Apa hot spot yang dicari semua orang?
Iklan mana, posisi mana, yang paling diklik?
Atau, kita bisa bertanya:
Apa yang terjadi di dunia ini?
Apa topik Weibo terpanas?
Kami menggunakan jumlah jendela geser sederhana untuk mengungkap tabir misterius dari perhitungan waktu nyata yang disebut.
Asumsikan bahwa persyaratan bisnis kami adalah:
Statistik 10 topik Weibo terpanas dalam 20 menit.
Untuk menyelesaikan masalah ini, kita perlu mempertimbangkan:
1. Sumber Data <BR /> di sini, dengan asumsi data kami, topik dari Weibo Long Connection Push.
2. Pemodelan Masalah
Topik yang kami pikir adalah perluasan nomor#.
Misalnya: @foreach_break: halo,#比#, aku mencintaimu,#weibo#.
"Dunia" dan "Weibo" adalah topik.
3. Mesin menghitung
Kami menggunakan Storm.
4. Tentukan waktu
Bagaimana cara mendefinisikan waktu?
Definisi waktu adalah hal yang sulit, tergantung pada akurasi apa yang diperlukan.
Menurut kenyataan, kami biasanya menggunakan kutu untuk mewakili konsep ini.
Dalam infrastruktur Storm, fase startup pelaksana menggunakan timer untuk memicu peristiwa "setelah periode waktu tertentu".
Seperti yang ditunjukkan di bawah ini:
(DEFN Setup-Ticks! [Pekerja Executor-Data] ive-queue (: Recequ-Queue Executor-Data-Data) konteks (: Executor-Data-Data-Context) (ketika detik-waktu-detik (atau (sistem-id? : Komponen-id-eksekutor-data))) alse (storm-conf topology-enable-message-timeouts) (=: spout (: tipe executor-data))) (log-message "timeouts dinonaktifkan untuk pelaksana" (: komponen- ID Exec eli-data) ":" ("(" (: Executor-ID Executor-Data) (jadwal-berulang (: Pekerja pengguna-timer) Tick-Time-Secs-Time-Secs (FN [] (Disrupt/ Publikasikan ReceT-QueUe [[nil (tupleImpl. Context [Tick -Time-Secs] Konstanta/System_Task_ID Konstanta/System_tick_stream_id)])))))))))))))))),)))))))))))))))))))))))))Setiap kali, peristiwa seperti itu akan dipicu.
Bagaimana Bolt menilai bahwa tuple yang diterima mewakili "centang"?
Bertanggung jawab untuk mengelola utas Executor Bolt.
Public static boolean isstick (tuple tuple) {return tuple! Dikombinasikan dengan kode clojure dari setup-tick!
Dapat dilihat bahwa dalam kode berikut, System_Task_ID juga diteruskan ke Tuple:
;
(Tupleimpl. Konteks [centang-waktu-detik] Konstanta/System_task_id Constants/system_tick_stream_id))
Kemudian gunakan kode berikut untuk mendapatkan System_Component_id:
String publik getComponentId (int taskId) {if (taskId == constants.system_id_id) {return constants.system_component_id;Dengan infrastruktur di atas <br />, kami juga membutuhkan beberapa cara untuk menyelesaikan "rekayasa" dan mengubah ide menjadi kenyataan.
Di sini, mari kita lihat desain jendela geser Michael G. Noll.
Topologi
String SpoutID = WordGenrator "; / Jendela Waktu RollingCountbolt adalah 9 detik, dan hasil statistik dikirim setiap 3 detik ke builter hilir. ; Lengkapi agregasi lengkap dan hitung pembangun topik Top-n.setbolt (TotalRankerID, TotalRankingsBolt baru (TOP_N)).
Desain teratas di atas adalah sebagai berikut:
Menggabungkan perhitungan agregasi dengan waktu
Sebelumnya, kami menggambarkan insiden kutu, yang akan memicu metode pelaksanaan baut selama panggilan balik, yang dapat dilakukan:
RollingCountbolt:
@Override public void execute (tuple tuple) {if (tpleutils.istick (tuple)) {log.debug ("Menerima tuple, triggey memancarkan jendela saat ini"); Kirim dan biarkan gulungan jendela EmitCurrentWindowCounts ();} else {// tuple konvensional, dan jumlah topik dapat dihitung (tuple);} // obj adalah topiknya, tambahkan penghitungan ++ // Perhatikan, kecepatan di sini pada dasarnya mendasar di sini. Bolt dapat skala. EmitCurrentWindowCounts () {peta <objek, long> counts = countcountshenadvanceWindow (); lengtt h_warning_template , Aktualwindowlengthinseconds, windowlengthinseconds);} emit (hitungan, aktual windowlengthinseconds);}Kode di atas mungkin sedikit abstrak.
Intermediankingsbolt & TotalRankingsbolt:
Public Final Void Execute (Tuple Tuple, BasicOutputCollector Collector) {if (tupleutils.istick (tuple)) {getLogger (). ;} Else {// polytes dan urutkan updaterankingwithtuple (tuple);}}Di antara mereka, metode penyortiran agregat Internet dan TotalRankingsbolt sedikit berbeda:
Metode penyortiran agregat intermediatorkingsbolt:
// Intermediatorkingsbolt Metode penyortiran agregat: @Override void updateAnkingsWithTuple (tuple tuple) {// Langkah ini adalah untuk mengekstrak jumlah topik dan topik. waktu dikumpulkan, dan kemudian semua topik pembentuk.getRankings ().Metode penyortiran agregat dari TotalRankingsbolt:
// Metode penyortiran agregat TotalRankingsBolt @Override void Updaterankingswithtuple (TPLE TUPLE) {// mengusulkan hasil tengah dari perantara internet. ().Metode penyortiran berat relatif sederhana dan kasar, karena hanya n, n tidak akan terlalu besar:
Private void () {collections.sort (RankEdItems); Kesimpulan
Angka di bawah ini mungkin merupakan hasil yang kami inginkan.
Di atas adalah semua isi artikel ini.