Aplikasi yang Sadar Konteks dan Arsitektur Pemrosesan Peristiwa yang Kompleks
Diterbitkan: 2022-03-11Penggunaan ponsel di seluruh dunia terus meningkat. Pada tahun 2013, sekitar 73% pengguna Internet mengonsumsi konten melalui perangkat seluler dan persentase ini diperkirakan akan mencapai hampir 90% pada tahun 2017.
Tentu saja ada banyak alasan untuk revolusi seluler. Tetapi salah satu yang paling signifikan adalah bahwa aplikasi seluler umumnya mendapatkan akses ke konteks yang lebih kaya karena hampir semua smartphone saat ini dilengkapi dengan sensor lokasi, sensor gerak, bluetooth, dan wifi. Dengan memanfaatkan datanya, aplikasi dapat mencapai "kesadaran konteks" yang dapat secara dramatis meningkatkan kemampuan dan nilainya, dan benar-benar dapat membuatnya menonjol di toko aplikasi.
Dalam tutorial ini, kita akan mengeksplorasi pembuatan aplikasi kontekstual melalui contoh pemrosesan peristiwa yang kompleks. Kami akan menggunakan contoh yang cukup sederhana: aplikasi harga bahan bakar yang menemukan harga bahan bakar terbaik di wilayah Anda.
Aplikasi sadar konteks
Dalam Merancang Teknologi Tenang, Mark Weiser dan John Seely Brown menggambarkan teknologi yang tenang sebagai "apa yang memberi tahu tetapi tidak menuntut fokus atau perhatian kita."
Aplikasi seluler yang peka konteks sangat konsisten dengan gagasan ini dan merupakan langkah penting dan berharga di jalur ini. Mereka menggunakan informasi kontekstual yang diperoleh dari sensor mereka untuk secara proaktif memberikan informasi berharga kepada pengguna dan mereka melakukannya dengan sedikit usaha dari pihak pengguna. Mark Weiser dan John Seely Brown tidak diragukan lagi akan memuji kemajuan teknologi ini.
Kesadaran konteks adalah gagasan bahwa aplikasi dapat merasakan dan bereaksi berdasarkan data kontekstual yang dapat diaksesnya. Aplikasi semacam itu memanfaatkan data sensor yang kaya yang tersedia di perangkat seluler untuk memberikan informasi yang akurat dan relevan kepada pengguna dalam konteks yang sesuai. Melalui tren yang diamati selama penggunaan perangkat, dan/atau melalui umpan balik yang diberikan oleh pengguna, aplikasi semacam itu sebenarnya dapat "belajar" dari waktu ke waktu, sehingga menjadi "lebih pintar" dan lebih berguna.
Pemrosesan acara yang kompleks
Pemrosesan peristiwa kompleks (CEP) adalah bentuk pemrosesan peristiwa yang menggunakan analisis yang lebih canggih dari beberapa peristiwa (yaitu, dari waktu ke waktu, dari sumber yang berbeda, dan sebagainya), mengintegrasikan dan menganalisis kontennya untuk menyimpulkan informasi dan pola yang lebih bermakna.
Dalam aplikasi seluler, CEP dapat diterapkan ke peristiwa yang dihasilkan dari sensor perangkat seluler serta sumber data eksternal yang dapat diakses oleh aplikasi.
Fitur utama dari aplikasi harga bahan bakar kami
Untuk tujuan tutorial pemrosesan peristiwa kompleks kami, mari kita asumsikan bahwa fitur aplikasi harga bahan bakar kami terbatas pada hal berikut:
- secara otomatis mendeteksi lokasi yang relevan secara geografis bagi pengguna (misalnya, lokasi rumah pengguna dan lokasi kerja pengguna)
- secara otomatis mengidentifikasi stasiun bahan bakar dalam jarak yang wajar dari rumah dan lokasi kerja pengguna
- secara otomatis memberi tahu pengguna tentang harga bahan bakar terbaik di dekat rumah dan kantor
Oke, mari kita mulai.
Mendeteksi lokasi rumah dan kantor pengguna
Mari kita mulai dengan logika untuk secara otomatis mendeteksi lokasi rumah dan kantor pengguna. Untuk menjaga hal-hal sederhana untuk contoh pemrosesan peristiwa kompleks kami, kami akan mengasumsikan bahwa pengguna memiliki jadwal kerja yang cukup normal. Oleh karena itu, kami dapat mengasumsikan bahwa pengguna biasanya berada di rumah antara pukul 2 dan 3 pagi, dan biasanya akan berada di kantor antara pukul 2 hingga 3 sore.
Berdasarkan asumsi tersebut, kami mendefinisikan dua aturan CEP dan mengumpulkan data lokasi dan waktu dari ponsel cerdas pengguna:
- Aturan Lokasi Rumah
- kumpulkan data lokasi antara jam 2 dan 3 pagi selama seminggu
- mengelompokkan data lokasi untuk mendapatkan perkiraan alamat rumah
- Aturan Lokasi Kerja
- kumpulkan data lokasi antara pukul 14:00 dan 15:00 untuk hari kerja
- mengelompokkan data lokasi untuk mendapatkan perkiraan lokasi kerja
Algoritma tingkat tinggi untuk mendeteksi lokasi digambarkan di bawah ini.
Mari kita asumsikan struktur data JSON sederhana berikut untuk data lokasi:
{ "uid": "some unique identifier for device/user", "location": [longitude, latitude] "time": "time in user's timezone" }
Catatan: Itu selalu merupakan praktik yang baik untuk membuat data sensor tidak berubah (atau jenis nilai), sehingga dapat digunakan dengan aman oleh modul yang berbeda dalam alur kerja CEP.
Penerapan
Kami akan mengimplementasikan algoritme kami menggunakan pola modul yang dapat dikomposisi , di mana setiap modul hanya melakukan satu tugas dan memanggil berikutnya saat tugas selesai. Ini sesuai dengan filosofi Unix Rule of Modularity.
Secara khusus, setiap modul adalah fungsi yang menerima objek config
dan fungsi next
yang dipanggil untuk meneruskan data ke modul berikutnya. Dengan demikian, setiap modul mengembalikan fungsi yang dapat menerima data sensor. Berikut adalah tanda tangan dasar dari sebuah modul:
// nominal structure of each composable module function someModule(config, next) { // do initialization if required return function(data) { // do runtime processing, handle errors, etc. var nextData = SomeFunction(data); // optionally call next with nextData next(nextData); } }
Untuk menerapkan algoritme kami dalam menyimpulkan lokasi rumah dan kantor pengguna, kami memerlukan modul berikut:
- Modul filter waktu
- Modul akumulator
- Modul pengelompokan
Masing-masing modul ini dijelaskan secara lebih rinci dalam subbagian berikut.
Modul filter waktu
Filter waktu kami adalah fungsi sederhana yang mengambil peristiwa data lokasi sebagai input dan hanya meneruskan data ke modul next
jika peristiwa itu terjadi dalam irisan waktu yang diinginkan. Oleh karena itu, data config
untuk modul ini terdiri dari waktu mulai dan waktu berakhir dari potongan waktu yang diinginkan. (Versi modul yang lebih canggih dapat memfilter berdasarkan beberapa irisan waktu.)
Berikut adalah implementasi pseudocode dari modul filter waktu:
function timeFilter(config, next) { function isWithin(timeval) { // implementation to compare config.start <= timeval <= config.end // return true if within time slice, false otherwise } return function (data) { if(isWithin(data.time)) { next(data); } }; }
Modul akumulator
Tanggung jawab akumulator hanyalah mengumpulkan data lokasi untuk kemudian diteruskan ke modul next
. Fungsi ini mempertahankan bucket internal berukuran tetap untuk menyimpan data. Setiap lokasi baru yang ditemukan ditambahkan ke ember sampai ember penuh. Data lokasi yang terakumulasi dalam ember kemudian dikirim ke modul berikutnya sebagai larik.
Dua jenis bucket akumulator didukung. Jenis bucket mempengaruhi apa yang dilakukan terhadap isi bucket setelah data diteruskan ke fase berikutnya, sebagai berikut:
Tumbling window bucket (
type = 'tumbling'
): setelah meneruskan data, mengosongkan seluruh bucket dan memulai yang baru (mengurangi ukuran bucket kembali ke 0)Menjalankan tipe jendela (
type = 'running'
): setelah meneruskan data, hanya membuang elemen data terlama di bucket (mengurangi ukuran bucket sebesar 1)
Berikut adalah implementasi dasar dari modul akumulator:
function accumulate(config, next) { var bucket = []; return function (data) { bucket.unshift(data); if(bucket.length >= config.size) { var newSize = (config.type === 'tumbling' ? 0 : bucket.length - 1); next(bucket.slice(0)); bucket.length = newSize; } }; }
Modul pengelompokan
Tentu saja ada banyak teknik canggih dalam geometri koordinat untuk mengelompokkan data 2D. Berikut adalah salah satu cara sederhana untuk mengelompokkan data lokasi:
- temukan tetangga untuk setiap lokasi di satu set lokasi
- jika beberapa tetangga termasuk dalam cluster yang ada, maka perluas tetangga dengan cluster
- jika lokasi di himpunan tetangga lebih dari ambang batas, tambahkan tetangga sebagai cluster baru
Berikut implementasi dari algoritma clustering ini (menggunakan Lo-Dash
):
var _ = require('lodash'); function createClusters(location_data, radius) { var clusters = []; var min_points = 5; // Minimum cluster size function neighborOf(this_location, all_locations) { return _.filter(all_locations, function(neighbor) { var distance = distance(this_point.location, neighbor.location); // maximum allowed distance between neighbors is 500 meters. return distance && (500 > distance); } } _.each(location_data, function (loc_point) { // Find neighbors of loc_point var neighbors = neighborOf(loc_point, location_data, radius); _.each(clusters, function (cluster, index) { // Check whether some of the neighbors belong to cluster. if(_.intersection(cluster, neighbors).length){ // Expand neighbors neighbors = _.union(cluster, neighbors); // Remove existing cluster. We will add updated cluster later. clusters[index] = void 0; } }); if(neighbors.length >= min_points){ // Add new cluster. clusters.unshift(neighbors); } }); return _.filter(clusters, function(cluster){ return cluster !== void 0; }); }
Kode di atas mengasumsikan adanya fungsi distance()
yang menghitung jarak (dalam meter) antara dua lokasi geografis. Ia menerima dua titik lokasi dalam bentuk [longitude, latitude]
dan mengembalikan jarak di antara mereka. Berikut adalah contoh implementasi dari fungsi tersebut:
function distance(point1, point2) { var EARTH_RADIUS = 6371000; var lng1 = point1[0] * Math.PI / 180; var lat1 = point1[1] * Math.PI / 180; var lng2 = point2[0] * Math.PI / 180; var lat2 = point2[1] * Math.PI / 180; var dLat = lat2 - lat1; var dLon = lng2 - lng1; var a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); var arc = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); var distance = EARTH_RADIUS * arc; return distance; }
Dengan algoritma pengelompokan kami yang ditentukan dan diimplementasikan (dalam fungsi createClusters()
kami yang ditunjukkan sebelumnya), kami dapat menggunakannya sebagai dasar untuk modul pengelompokan kami:
function clusterize(config, next) { return function(data) { var clusters = createClusters(data, config.radius); next(clusters); }; }
Menarik semuanya bersama-sama
Semua fungsi komponen yang diperlukan sekarang telah ditentukan, jadi kami siap untuk membuat kode aturan lokasi rumah/kantor kami.
Di sini, misalnya, adalah kemungkinan penerapan aturan lokasi rumah:
var CLUSTER_RADIUS = 150; // use cluster radius of 150 meters var BUCKET_SIZE = 500; // collect 500 location points var BUCKET_TYPE = 'tumbling'; // use a tumbling bucket in our accumulator var home_cluster = clusterize({radius: CLUSTER_RADIUS}, function(clusters) { // Save clusters in db }); var home_accumulator = accumulate({size: BUCKET_SIZE, type: BUCKET_TYPE}, home_cluster); var home_rule = timeFilter({start: "2AM", end: "3AM"}, home_accumulator);
Sekarang setiap kali data lokasi diterima dari ponsel pintar (melalui soket web, TCP, HTTP) kami meneruskan data ini ke fungsi home_rule
yang pada gilirannya mendeteksi cluster untuk rumah pengguna.
"Lokasi rumah" pengguna kemudian diasumsikan sebagai pusat dari cluster lokasi rumah.
Catatan: Meskipun ini mungkin tidak sepenuhnya tepat, itu cukup untuk contoh sederhana kami, terutama karena tujuan aplikasi ini dalam hal apa pun hanyalah untuk mengetahui area di sekitar rumah pengguna, daripada mengetahui lokasi rumah pengguna yang tepat.
Berikut adalah contoh fungsi sederhana yang menghitung "pusat" dari sekumpulan titik dalam sebuah cluster dengan rata-rata garis lintang dan garis bujur dari semua titik dalam kumpulan cluster:
function getCentre(cluster_data) { var len = cluster_data.length; var sum = _.reduce(cluster_data, function(memo, cluster_point){ memo[0] += cluster_point[0]; memo[1] += cluster_point[1]; return memo; }, [0, 0]); return [sum[0] / len, sum[1] / len]; }
Pendekatan serupa dapat digunakan untuk menyimpulkan lokasi kerja, dengan satu-satunya perbedaan adalah bahwa ia akan menggunakan filter waktu antara 2 dan 3 sore (berlawanan dengan 2 dan 3 pagi).
Dengan demikian, aplikasi bahan bakar kami dapat secara otomatis mendeteksi lokasi kerja dan rumah pengguna tanpa memerlukan campur tangan pengguna. Ini adalah komputasi sadar konteks yang terbaik!
Menemukan SPBU terdekat
Kerja keras untuk membangun kesadaran konteks sekarang telah dilakukan, tetapi kita masih memerlukan satu aturan lagi untuk mengidentifikasi harga SPBU mana yang harus dipantau (yaitu, SPBU mana yang cukup dekat dengan rumah atau lokasi kerja pengguna agar relevan). Aturan ini membutuhkan akses ke semua lokasi stasiun bahan bakar untuk semua wilayah yang didukung oleh aplikasi bahan bakar. Aturannya adalah sebagai berikut:
- Aturan SPBU
- temukan SPBU terdekat untuk setiap lokasi rumah & kantor
Ini dapat dengan mudah diimplementasikan menggunakan fungsi jarak yang ditunjukkan sebelumnya sebagai filter lokasi untuk diterapkan ke semua stasiun bahan bakar yang dikenal oleh aplikasi.
Pemantauan harga bahan bakar
Setelah aplikasi bahan bakar memperoleh daftar stasiun bahan bakar pilihan (yaitu, terdekat) bagi pengguna, aplikasi dapat dengan mudah melihat harga bahan bakar terbaik di stasiun tersebut. Itu juga dapat memberi tahu pengguna ketika salah satu SPBU ini memiliki harga atau penawaran khusus, terutama ketika pengguna terdeteksi berada di dekat SPBU tersebut.
Kesimpulan
Dalam tutorial pemrosesan peristiwa yang kompleks ini, kami benar-benar baru saja menggores permukaan komputasi sadar-konteks.
Dalam contoh sederhana kami, kami menambahkan konteks lokasi ke aplikasi pelaporan harga bahan bakar sederhana dan membuatnya lebih pintar. Aplikasi sekarang berperilaku berbeda di setiap perangkat dan seiring waktu mendeteksi pola lokasi untuk secara otomatis meningkatkan nilai informasi yang diberikannya kepada penggunanya.
Tentunya lebih banyak lagi logika dan data sensor yang dapat ditambahkan untuk meningkatkan akurasi dan utilitas aplikasi kita yang sadar konteks. Pengembang seluler yang cerdas dapat, misalnya, menggunakan data jejaring sosial, data cuaca, data transaksi terminal POS, dan sebagainya untuk menambahkan lebih banyak kesadaran konteks ke aplikasi kami dan membuatnya lebih layak dan dapat dipasarkan.
Dengan komputasi konteks-sadar, kemungkinan tidak terbatas. Semakin banyak aplikasi pintar akan terus muncul di toko aplikasi yang menggunakan teknologi canggih ini untuk membuat hidup kita lebih sederhana.