실시간 계산이란 무엇입니까?
아래 그림을 참조하십시오 :
전통적인 계산 방법을 보려면 핫 제품 통계를 예로 들어보십시오.
1 데이터베이스에서 사용자 동작, 로그 및 기타 정보를 저장하십시오.
2 데이터베이스에 주문 정보를 저장합니다.
3 트리거 또는 코 루틴을 사용하여 로컬 인덱스 또는 원격 독립 인덱스를 설정하십시오.
4 순서 정보, 주문 세부 정보, 사용자 정보, 제품 정보 등을 조작하고 20 분 이내에 제품을 집계하고 10 위로 돌아갑니다.
5Web 또는 앱 디스플레이.
이것은 상상의 장면이지만 비슷한 장면을 다루는 경험이 있다고 가정하면 그러한 문제와 어려움을 경험해야합니다.
1. 수평 확장 문제 (스케일 아웃)
분명히, 특정 규모의 e -Commerce 웹 사이트 인 경우 데이터의 양은 매우 큽니다. 트랜잭션 정보에는 트랜잭션이 포함되므로 관계 데이터베이스의 트랜잭션 능력을 직접 포기하고 더 나은 스케일 아웃 기능으로 NOSQL 데이터베이스로 마이그레이션하기가 어렵습니다.
글쎄, 그것은 일반적으로 완료됩니다. 다행스럽게도 날짜까지 보관하고 오프라인 컴퓨팅을 배치하여 결과를 캐시 할 수 있습니다.
그러나 여기의 요구 사항은 20 분 이내에 이루어 지므로 어렵습니다.
2. 성능 문제 <br />이 문제는 각 노드에 테이블이 흩어져 있기 때문에 샤드를 수행했다고 가정합니다.
문제는 창고에 몇 번이나 들어가야합니까?
10 분은 어떻습니까?
5 분은 어떻습니까?
실시간은 어떻습니까?
또한 비즈니스 계층은 단일 포인트 컴퓨팅 전력의 한계에 직면하고 수평 확장이 필요하므로 일관성 문제를 고려해야합니다.
따라서 모든 것이 매우 복잡합니다.
3. 비즈니스 확장 문제 <br /> 우리는 핫 판매 상품의 통계를 처리 할뿐만 아니라 통계 광고 클릭을 처리하거나 사용자의 액세스 동작에 따라 대기하는 정보를 조정하기 위해 사용자의 특성을 신속하게 결정해야한다고 가정합니다. 레이어가 더 복잡합니다.
어쩌면 당신은 더 나은 방법을 가지고 있지만 실제로 우리에게 필요한 것은 새로운 인식입니다.
이 세상에서 일어난 일은 실시간이었습니다.
따라서 배치 처리 모델이 아닌 실시간으로 계산되는 모델이 필요합니다.
우리가 필요로하는이 모델은 많은 데이터를 처리 할 수 있어야하므로 너무 많은 일관성과 복제를 고려할 필요가없는 것이 가장 좋습니다.
그런 다음이 컴퓨팅 모델은 실시간 계산 모델로 스트리밍 컴퓨팅 모델로 간주 될 수 있습니다.
이제 우리는 그러한 모델이 있다고 가정하면 새로운 비즈니스 시나리오를 행복하게 설계 할 수 있습니다.
가장 전달 된 Weibo는 무엇입니까?
가장 인기있는 제품은 무엇입니까?
모두가 찾고있는 핫스팟은 무엇입니까?
어떤 광고, 어떤 위치가 가장 클릭됩니까?
또는 우리는 다음을 물어볼 수 있습니다.
이 세상에서 무슨 일이 있었습니까?
가장 인기있는 Weibo 주제는 무엇입니까?
우리는 간단한 슬라이딩 윈도우 수를 사용하여 실시간 계산의 신비한 베일을 공개합니다.
우리의 비즈니스 요구 사항이 다음과 같다고 가정합니다.
통계 10 20 분 만에 가장 인기있는 Weibo 주제.
이 문제를 해결하려면 다음을 고려해야합니다.
1. 데이터 소스 <br /> 여기서, 우리의 데이터를 가정하면 Weibo Long Connection Push의 주제.
2. 문제 모델링
우리가 생각하는 주제는#번호의 확장은이 주제가 다른 주제보다 더 많이 나타났습니다.
예 : @foreach_break : 안녕하세요,#比#, 사랑합니다,#Weibo#.
"World"와 "Weibo"는 주제입니다.
3. 엔진 계산
우리는 폭풍을 사용합니다.
4. 시간을 정의하십시오
시간을 정의하는 방법?
시간의 정의는 정확도가 필요한 것에 따라 어려운 일입니다.
현실에 따르면, 우리는 일반적으로 진드기를 사용 하여이 개념을 대표합니다.
Storm의 인프라에서 Executor 스타트 업 단계는 타이머를 사용하여 "일정 기간 후에"이벤트를 트리거합니다.
아래 그림과 같이 :
(defn setup-ticks! : component-id executor-data)))) alse (Storm-Conf Topology-enable-message timeouts) (= : Spout (: type intine executor-data))) id exec uTor-data) ":"( "("(: executor-id executor-data) (스케줄 재생 (: 사용자-타이머 워크)) 진드기 시간 secs 진드기 시간-시간-시간- 수신-큐어 [nil (tupleimpl. context [tick -time-secs]))))))))))))))))))))))))))),)마다, 그러한 이벤트가 트리거 될 때, 하류의 볼트가 그러한 이벤트를 수신 할 때, 결과를 늘리거나 결과를 흐름으로 보낼지를 선택할 수 있습니다.
볼트는 수신 된 튜플이 "진드기"를 나타내는 것을 어떻게 판단합니까?
Bolt의 실행자 스레드 관리를 담당합니다. 정보 큐 소비 메시지가 Bolt에 가입하면 실행 방법으로 호출됩니다.
public static boolean isstick (튜플 튜플) {return tuple! = null && constants.system_component_id. Clojure 코드와 결합하여 System_tick_stream_id는 콜백 이벤트에서 어떻게 전달 되었습니까?
다음 코드에서 System_task_id도 튜플로 전달된다는 것을 알 수 있습니다.
;
(TupleImpl. Context [Tick-Time-Secs] 상수/System_Task_id 상수/System_Tick_stream_id)))
그런 다음 다음 코드를 사용하여 system_component_id를 얻습니다.
public string getComponentId (int taskId) {if (taskId == constants.system_id_id) {return constants.system_component_id (taskId);}};<br /> 이상의 인프라를 사용하면 "엔지니어링"을 완성하고 아이디어를 현실로 바꾸는 방법도 필요합니다.
여기, Michael G. Noll의 슬라이딩 창 디자인을 살펴 보겠습니다.
토폴로지
String Spoutid = "Counderdiarker"; / RollingCountbolt의 시간 창은 9 초이며 통계 결과는 3 초마다 다운 스트림 빌터로 전송됩니다. 세트 볼트 (Countrid, New RollingCountbolt (9, 3), 4) .FieldSGrouping (Spoutid, New Ields ( ""Word ")) ; // 중간체 랭킹 볼트, 집계의 일부는 Top-N Topic Builder를 계산합니다 전체 집계를 완료하고 Top-N Topic Builder.setbolt (TotalRankerid, New TotalRankingsbolt (Top_n))를 계산하십시오.
위의 상위 디자인은 다음과 같습니다.
집계 계산을 시간과 결합합니다
앞서, 우리는 진드기 사건을 설명했는데, 이는 콜백 중에 볼트의 실행 메소드를 트리거 할 것입니다.
RollingCountbolt :
@override public void execute (튜플 튜플) {if (tpleutils.istick (tuple)) {log.debug ( "진드기, triggey가 현재 창의 triggey 방출"); 그것을 보내고 창문 스크롤 emitcurrentwindowcounts ();} else {// 기존 튜플, 그리고 주제 카운트를 셀 수 있습니다 (튜플);} // obj는 주제입니다. 계산 ++ // 여기에 속도를 추가하십시오. 기본적으로 기본적으로 유량의 속도에 따라 초당 백만 위안 일 수 있습니다. 볼트는 void countobjandack (tuple) {객체 obj = getple.getValue (0); EmitCurrentWindOwCounts () {Map <객체, long> int actenadvancewindow (); Engtt h_warning_template , 실제 Windowlengthinseconds, Windowlengthinseconds);} emit (counts, 실제 Windowlengthinseconds);}위의 코드는이 그림을 보면 진드기가 도착하자마자 다음과 같습니다.
Intermediankingsbolt & Totalrankingsbolt :
공개 최종 void execute (튜플 튜플, BasicOutputCollector Collector) {if (tupleutils.istick (tuple)) {getLogger (). ;} else {// polytes and sind up updateankingswithTuple (tuple);}}그중에서도 인터넷 및 TotalRankingsbolt의 집계 분류 방법은 약간 다릅니다.
중간체 랭킹 볼트 집계 분류 방법 :
// intermediatorankingsbolt 집계 정렬 방법 : @override void updateAnkingswithtuple (튜플) {// 주제와 주제의 수를 추출하는 것입니다. 시간이 집계되고 모든 주제는 shaper.getRankings ();}.TotalRankingsbolt의 집계 분류 방법 :
// THELLANKINGBOLT의 집계 정렬 방법 @Override void updateRankingswithtuple (tple tuple) {// 인터넷의 중간 결과의 중간 결과를 제안합니다 (). rankingstobemerged);무거운 분류 방법은 비교적 단순하고 무례합니다. n, n만이 크지 않기 때문입니다.
private void () {collections.sort (rankeditems); 결론
아래 그림은 우리가 원하는 결과 일 수 있습니다.
위는이 기사의 모든 내용입니다.