Что такое реальное расчет?
Пожалуйста, смотрите изображение ниже:
Возьмите статистику горячих продуктов в качестве примера, чтобы увидеть традиционные методы расчета:
1 Сохраните поведение пользователя, журнал и другую информацию в базе данных.
2 Сохраните информацию заказа в базе данных.
3 Используйте триггер или Coroutine для установления локальных индексов или удаленных независимых индексов.
4JOIN Заказ Информация о заказе, информация о пользователе, информацию о продукте и т. Д., Совокучите продукт в течение 20 минут и вернитесь в топ-10.
5web или приложение дисплей.
Это воображаемая сцена, но предполагая, что у вас есть опыт работы с подобными сценами, вы должны испытывать такие проблемы и трудности:
1. Проблема горизонтального расширения (масштабирование)
Очевидно, что если это веб -сайт E -Commerce с определенным масштабом, объем данных очень большой. Поскольку информация о транзакциях включает в себя транзакции, трудно напрямую отказаться от способности транзакций базы данных отношений и перейти в базу данных NOSQL с лучшими возможностями масштабирования.
Ну, это обычно делается. К счастью, мы можем архивировать к дате и кэшировать результаты с помощью пакетной обработки автономных вычислений.
Однако требования здесь в течение 20 минут, что сложно.
2. Проблемы с производительностью <br /> Эта проблема согласуется с масштабированием.
Вопрос в том, сколько раз нам нужно войти в склад?
Как насчет 10 минут?
А как насчет 5 минут?
А как насчет реального времени?
Кроме того, бизнес -уровень также сталкивается с ограничениями односторонней вычислительной мощности и требует горизонтального расширения, поэтому необходимо рассмотреть проблему согласованности.
Поэтому здесь все очень сложно.
3. Проблемы расширения бизнеса <br /> Предполагая, что мы должны не только обрабатывать статистику горячих продаж товаров, но и клик в статистической рекламе или быстро определить характеристики пользователя на основе поведения пользователя, чтобы скорректировать информацию, которую они видят, подождите, бизнес слой будет более сложным.
Может быть, у вас есть лучший способ, но на самом деле нам нужно новое познание:
То, что произошло в этом мире, было реальным.
Таким образом, нам нужна модель, которая рассчитывается в режиме реального времени, а не модель пакетной обработки.
Эта модель, которая нам нужна, должна иметь возможность обрабатывать много данных, поэтому лучше всего иметь хорошую способность к масштабированию.
Затем эта вычислительная модель является моделью расчета реального времени, которая также может рассматриваться как потоковая вычислительная модель.
Теперь предполагая, что у нас есть такая модель, мы можем с радостью разработать новые бизнес -сценарии:
Какой самый пересылка Weibo?
Какие самые горячие продукты?
Какие горячие точки все ищут?
Какая реклама, какая позиция, наиболее щелкает?
Или мы можем спросить:
Что случилось в этом мире?
Какая самая горячая тема Weibo?
Мы используем простое количество скользящих окнов, чтобы раскрыть таинственную завесу такого назового расчета реального времени.
Предположим, что наши бизнес -требования:
Статистика 10 самых горячих тем Вейбо за 20 минут.
Чтобы решить эту проблему, мы должны рассмотреть:
1. Источник данных <br /> здесь, предполагая наши данные, тема от Weibo Long Connection push.
2. Проблема моделирование
Тема, которую мы считаем, - это расширение числа#.
Например: @foreach_break: Привет,#比#, я люблю тебя,#weibo#.
«Мир» и «Вейбо» - темы.
3. Расчет двигателя
Мы используем шторм.
4. Определите время
Как определить время?
Определение времени - это сложная вещь, в зависимости от того, что требуется точность.
Согласно реальности, мы обычно используем Tick, чтобы представить эту концепцию.
В инфраструктуре Шторма этап запуска исполнителя использует таймер для запуска события «после некоторого периода времени».
Как показано ниже:
(DEFN SETUP-TICKS! : Component-ID Исполнитель-дата)))) Alse (топология Storm-Conf Topology-Enable-Message-Timeouts) (=: spout (: type executor-data)) (Log-Message «Тайм-ауты отключены для исполнителя» (: Компонент- ID Exec utor-Data) ":" ("(" (: Executor-ID Executor-Data) (график-рекуррирование (: работник пользователя-труда). Опубликовать eCet-queue [[nil (tupleimpl. Context [tick -time-secs] константы/system_task_id constants/system_tick_stream_id)])))))))))))))))))),),),)),))))))),),),)Каждый раз, такое событие будет запускаться.
Как Болт судит, что полученный кортеж представляет «тик»?
Отвечает за управление поток исполнителя Болта.
Public Static Boolean Isstick (Tuple Tuple) {return Tuple! В сочетании с кодом Clojure настройки!
Можно видеть, что в следующем коде System_task_id также передается в Tuple:
;
(Tupleimpl. Context [tick-time-secs] constants/system_task_id constants/system_tick_stream_id)))
Затем используйте следующий код, чтобы получить System_component_id:
Public String getComponentId (int taskId) {if (taskId == constants.system_id_id) {return Constants.system_component_id;С помощью инфраструктуры выше <br /> нам также нужны некоторые средства для завершения «инженерии» и превращения этой идеи в реальность.
Здесь давайте посмотрим на раздвижной окно -дизайн Майкла Дж. Нолл.
Топология
Строка Spoutid = WordGenrator "; / Временное окно RollingCountbolt составляет 9 секунд, а статистические результаты отправляются каждые 3 секунды в нисходящий Builter.Setbolt (Countrid, New RollingCountbolt (9, 3), 4) .fieldsGrouping (Spoutid, New IELDS ("" Word "))). ; Завершите полную агрегацию и подсчитайте Top-N Builder.Setbolt (TotalRankerid, New TotalRankSbolt (TOP_N)).Лучший дизайн выше следующего:
Объединение расчета агрегации со временем
Ранее мы описали инцидент с тиком, который запустит метод выполнения болта во время обратного вызова, который можно сделать:
RollingCountbolt:
@Override public void execute (tuple tuple) {if (tpleutils.istick (tuple)) {log.debug («Полученная галочка, Triggey Emit из текущих окон»); Отправьте его и пусть окно прокрутите EmitcurrentWindowCounts ();} else {// обычный кортеж, а количество тем может считать (Tuple);} // obj - тема, добавьте счет ++ // Обратите внимание, скорость здесь Является ли в основном основным. Болт может быть масштабируется. EmittcurrentWindowCounts () {Map <Object, long> counts = countcountsThenVanceWindow (); Engtt h_warning_template , ActualWindowlengthInseconds, WindowlengthInseconds);} Emit (Counts, FactionWindowlengthInseconds);}Код выше может быть немного абстрактным.
Intermedianksbolt & TotalRankingSbolt:
Public Final void выполняет (Tuple Tuple, BasicOutputCollector Collector) {if (tupleutils.istick (tuple)) {getLogger (). ;} Else {// Политы и сортируйте UpdaterAnkingSwithTuple (tuple);}}Среди них метод сортировки сортировки Интернета и TotalRankingSbolt немного отличается:
Метод сортировки сортировки сортировки Aggregate:
// Метод сортировки сортировки: @Override void Times агрегирована, а затем все темы shaper.getrankings ().
Метод сортировки сортировки TotalRankingSbolt:
// Сортация сортировки @override void updaterankswithtuple (tple tuple) {// Предлагаем средний результат промежуточного результата промежуточного интернета. ().Метод тяжелой сортировки относительно прост и груб, потому что только N, N не будет очень большим:
Private void () {collections.sort (RankedItems); Заключение
Рисунок ниже может быть результатом, который мы хотим.
Выше всего содержимое этой статьи.