컨텍스트 인식 애플리케이션 및 복잡한 이벤트 처리 아키텍처
게시 됨: 2022-03-11전 세계적으로 휴대전화 사용량이 지속적으로 증가하고 있습니다. 2013년 기준으로 인터넷 사용자의 약 73%가 모바일 장치를 통해 콘텐츠를 소비했으며 이 비율은 2017년까지 거의 90%에 이를 것으로 예상됩니다.
물론 모바일 혁명에는 여러 가지 이유가 있습니다. 그러나 가장 중요한 것 중 하나는 오늘날 거의 모든 스마트폰에 위치 센서, 동작 센서, 블루투스 및 Wi-Fi가 장착되어 있기 때문에 모바일 앱이 일반적으로 더 풍부한 컨텍스트에 액세스할 수 있다는 것입니다. 앱은 데이터를 활용하여 기능과 가치를 극적으로 높일 수 있는 "컨텍스트 인식"을 달성하고 앱 스토어에서 눈에 띄게 만들 수 있습니다.
이 자습서에서는 복잡한 이벤트 처리 예제를 통해 컨텍스트 인식 앱을 만드는 방법을 살펴봅니다. 우리는 매우 간단한 예를 사용할 것입니다: 당신의 지역에서 가장 좋은 연료 가격을 찾는 연료 가격 앱.
상황 인식 앱
Designing Calm Technology에서 Mark Weiser와 John Seely Brown은 차분한 기술을 "정보를 제공하지만 우리의 집중이나 관심을 요구하지 않는 것"이라고 설명합니다.
컨텍스트 인식 모바일 앱은 이러한 개념과 매우 일치하며 이 경로에서 중요하고 가치 있는 단계입니다. 그들은 센서에서 수집한 상황 정보를 사용하여 사용자에게 가치 있는 정보를 사전에 제공하고 사용자 측에서 최소한의 노력으로 이를 수행합니다. Mark Weiser와 John Seely Brown은 의심할 여지 없이 이 기술 발전에 박수를 보낼 것입니다.
컨텍스트 인식은 앱이 액세스할 수 있는 컨텍스트 데이터를 기반으로 감지하고 반응할 수 있다는 아이디어입니다. 이러한 앱은 모바일 장치에서 사용할 수 있는 풍부한 센서 데이터를 사용하여 적절한 컨텍스트에서 사용자에게 정확하고 관련성 높은 정보를 제공합니다. 장치 사용 과정에서 관찰되는 경향 및/또는 사용자가 제공한 피드백을 통해 이러한 앱은 시간이 지남에 따라 실제로 "학습"되어 "더 똑똑하고" 더 유용해질 수 있습니다.
복잡한 이벤트 처리
복합 이벤트 처리(CEP)는 여러 이벤트에 대한 보다 정교한 분석(예: 시간 경과에 따라, 서로 다른 소스 등)을 사용하는 이벤트 처리의 한 형태이며, 보다 의미 있는 정보와 패턴을 추론하기 위해 해당 내용을 통합 및 분석합니다.
모바일 앱에서 CEP는 모바일 장치의 센서 및 앱이 액세스할 수 있는 외부 데이터 소스에서 생성된 이벤트에 적용될 수 있습니다.
연료 가격 앱의 주요 기능
복잡한 이벤트 처리 자습서의 목적을 위해 연료 가격 앱의 기능이 다음으로 제한된다고 가정하겠습니다.
- 사용자와 지리적으로 관련된 위치(예: 사용자의 집 위치 및 사용자의 직장 위치)를 자동으로 감지
- 사용자의 집 및 직장 위치에서 합리적인 거리 내에 있는 주유소를 자동으로 식별
- 집과 직장에서 가까운 최적의 연료 가격을 사용자에게 자동으로 알려줍니다.
자, 시작하겠습니다.
사용자의 집 및 직장 위치 감지
사용자의 집과 직장 위치를 자동으로 감지하는 논리부터 시작하겠습니다. 복잡한 이벤트 처리 예제에서 일을 단순하게 유지하기 위해 사용자가 상당히 정상적인 작업 일정을 가지고 있다고 가정하겠습니다. 따라서 우리는 사용자가 일반적으로 오전 2시에서 3시 사이에 집에 있고 일반적으로 오후 2시에서 3시 사이에 사무실에 있을 것이라고 가정할 수 있습니다.
이러한 가정을 기반으로 두 가지 CEP 규칙을 정의하고 사용자의 스마트폰에서 위치 및 시간 데이터를 수집합니다.
- 집 위치 규칙
- 일주일 동안 오전 2시에서 3시 사이에 위치 데이터 수집
- 대략적인 집 주소를 얻기 위해 위치 데이터를 클러스터링
- 직장 위치 규칙
- 평일 오후 2시에서 3시 사이에 위치 데이터 수집
- 대략적인 직장 위치를 얻기 위해 위치 데이터를 클러스터링
위치를 감지하는 고급 알고리즘은 다음과 같습니다.
위치 데이터에 대해 다음과 같은 간단한 JSON 데이터 구조를 가정해 보겠습니다.
{ "uid": "some unique identifier for device/user", "location": [longitude, latitude] "time": "time in user's timezone" }
참고: CEP 워크플로의 다른 모듈에서 안전하게 사용할 수 있도록 센서 데이터를 변경할 수 없도록(또는 값 유형) 만드는 것이 항상 좋은 방법입니다.
구현
각 모듈은 하나의 작업만 수행하고 작업이 완료되면 다음을 호출하는 구성 가능한 모듈 패턴 을 사용하여 알고리즘을 구현합니다. 이것은 모듈화 철학의 유닉스 규칙을 따릅니다.
특히, 각 모듈은 config
객체를 받아들이는 함수와 다음 모듈에 데이터를 전달하기 위해 호출되는 next
함수입니다. 따라서 각 모듈은 센서 데이터를 받을 수 있는 함수를 반환합니다. 다음은 모듈의 기본 서명입니다.
// 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); } }
사용자의 집과 직장 위치를 추론하는 알고리즘을 구현하려면 다음 모듈이 필요합니다.
- 시간 필터 모듈
- 누산기 모듈
- 클러스터링 모듈
이러한 각 모듈은 다음 하위 섹션에서 더 자세히 설명됩니다.
시간 필터 모듈
우리의 시간 필터는 위치 데이터 이벤트를 입력으로 받아 이벤트가 관심 있는 시간 조각 내에 발생한 경우에만 next
모듈로 데이터를 전달하는 간단한 기능입니다. 따라서 이 모듈의 config
데이터는 관심 있는 시간 조각의 시작 및 종료 시간으로 구성됩니다. (더 정교한 버전의 모듈은 여러 시간 조각을 기반으로 필터링할 수 있습니다.)
다음은 시간 필터 모듈의 의사 코드 구현입니다.
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); } }; }
누산기 모듈
누산기의 책임은 단순히 위치 데이터를 수집하여 next
모듈로 전달하는 것입니다. 이 함수는 데이터를 저장할 내부 고정 크기 버킷을 유지 관리합니다. 발견된 각각의 새 위치는 버킷이 가득 찰 때까지 버킷에 추가됩니다. 버킷에 축적된 위치 데이터는 배열로 다음 모듈로 전송됩니다.
두 가지 유형의 누산기 버킷이 지원됩니다. 버킷 유형은 다음과 같이 데이터가 다음 단계로 전달된 후 버킷 콘텐츠에 수행되는 작업에 영향을 줍니다.
텀블링 창 버킷(
type = 'tumbling'
): 데이터를 전달한 후 전체 버킷을 비우고 새로 시작합니다(버킷 크기를 다시 0으로 줄임).실행 기간 유형(
type = 'running'
): 데이터를 전달한 후 버킷에서 가장 오래된 데이터 요소만 버립니다(버킷 크기를 1 감소).
다음은 누산기 모듈의 기본 구현입니다.
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; } }; }
클러스터링 모듈
물론 좌표 지오메트리에는 2D 데이터를 클러스터화하는 정교한 기술이 많이 있습니다. 다음은 위치 데이터를 클러스터링하는 간단한 방법입니다.

- 위치 집합에서 각 위치에 대한 이웃 찾기
- 이웃 중 일부가 기존 클러스터에 속해 있으면 클러스터로 이웃을 확장합니다.
- 이웃 세트의 위치가 임계값보다 크면 이웃을 새 클러스터로 추가합니다.
다음은 이 클러스터링 알고리즘의 구현입니다( 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; }); }
위의 코드는 두 지리적 위치 사이의 거리(미터)를 계산하는 distance()
함수가 있다고 가정합니다. [longitude, latitude]
형식의 두 위치 지점을 받아 그 사이의 거리를 반환합니다. 다음은 이러한 함수의 샘플 구현입니다.
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; }
클러스터링 알고리즘을 정의하고 구현하면(앞서 설명한 createClusters()
함수에서) 이를 클러스터링 모듈의 기초로 사용할 수 있습니다.
function clusterize(config, next) { return function(data) { var clusters = createClusters(data, config.radius); next(clusters); }; }
모두 함께 당겨
이제 필요한 모든 구성 요소 기능이 정의되었으므로 집/직장 위치 규칙을 코딩할 준비가 되었습니다.
예를 들어 다음은 집 위치 규칙의 가능한 구현입니다.
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);
이제 위치 데이터가 스마트폰에서 수신될 때마다(websocket, TCP, HTTP를 통해) 이 데이터를 home_rule
함수로 전달하여 사용자의 집에 대한 클러스터를 차례로 감지합니다.
그러면 사용자의 "홈 위치"가 홈 위치 클러스터의 중심으로 간주됩니다.
참고: 이것이 완전히 정확하지 않을 수 있지만 간단한 예에는 적합합니다. 특히 이 앱의 목표는 사용자의 정확한 집 위치를 아는 것이 아니라 단순히 사용자의 집 주변 지역을 아는 것이기 때문입니다.
다음은 클러스터 세트에 있는 모든 포인트의 위도와 경도를 평균하여 클러스터에 있는 포인트 세트의 "중심"을 계산하는 간단한 예제 함수입니다.
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]; }
유사한 접근 방식을 사용하여 작업 위치를 추론할 수 있지만 유일한 차이점은 오후 2시와 3시 사이(오전 2시와 3시와 반대) 사이의 시간 필터를 사용한다는 것뿐입니다.
따라서 당사의 연료 앱은 사용자 개입 없이도 사용자의 직장 및 집 위치를 자동으로 감지할 수 있습니다. 이것은 최상의 상황 인식 컴퓨팅입니다!
가까운 주유소 찾기
상황 인식을 설정하기 위한 어려운 작업은 이제 완료되었지만 모니터링할 주유소 가격(즉, 사용자의 집이나 직장 위치에 관련성이 있을 만큼 충분히 가까운 주유소)을 식별하기 위한 규칙이 하나 더 필요합니다. 이 규칙은 연료 앱에서 지원하는 모든 지역의 모든 주유소 위치에 액세스해야 합니다. 규칙은 다음과 같습니다.
- 주유소 규칙
- 각 가정 및 직장 위치에 가장 가까운 주유소 찾기
이는 앱에 알려진 모든 주유소에 적용할 위치 필터로 앞에서 설명한 거리 기능을 사용하여 쉽게 구현할 수 있습니다.
연료 가격 모니터링
연료 앱이 사용자가 선호하는(즉, 주변) 주유소 목록을 얻으면 해당 주유소에서 가장 좋은 연료 가격을 쉽게 확인할 수 있습니다. 또한 이러한 주유소 중 하나에 특별 가격이 있거나 제안이 있을 때, 특히 사용자가 이러한 주유소 근처에서 감지되는 경우 사용자에게 알릴 수 있습니다.
결론
이 복잡한 이벤트 처리 튜토리얼에서 우리는 컨텍스트 인식 컴퓨팅의 표면을 거의 긁지 않았습니다.
우리의 간단한 예에서 우리는 단순한 연료 가격 보고 앱에 위치 컨텍스트를 추가하고 더 똑똑하게 만들었습니다. 이제 앱은 각 장치에서 다르게 작동하며 시간이 지남에 따라 위치 패턴을 감지하여 사용자에게 제공하는 정보의 가치를 자동으로 향상시킵니다.
상황 인식 앱의 정확성과 유용성을 높이기 위해 훨씬 더 많은 논리와 센서 데이터를 추가할 수 있습니다. 예를 들어 영리한 모바일 개발자는 소셜 네트워크 데이터, 날씨 데이터, POS 터미널 거래 데이터 등을 활용하여 앱에 컨텍스트 인식을 추가하고 더 실행 가능하고 시장성이 있도록 만들 수 있습니다.
컨텍스트 인식 컴퓨팅을 사용하면 가능성이 무궁무진합니다. 우리의 삶을 더 단순하게 만들기 위해 이 강력한 기술을 사용하는 더 많은 스마트 앱이 앱 스토어에 계속 나타날 것입니다.