O que é cálculo real de tempo?
Por favor, veja a foto abaixo:
Tome as estatísticas dos produtos quentes como exemplo para ver os métodos tradicionais de cálculo:
1 Salve o comportamento do usuário, log e outras informações no banco de dados.
2 Salve as informações do pedido no banco de dados.
3 Use gatilho ou coroutina para estabelecer índices locais ou índices independentes remotos.
4JOIN Informações do pedido, detalhes do pedido, informações do usuário, informações do produto etc., agregue o produto em 20 minutos e retorne ao top 10.
5Web ou exibição de aplicativos.
Esta é uma cena imaginária, mas assumindo que você tem experiência em lidar com cenas semelhantes, deve ter esses problemas e dificuldades:
1. Problema de expansão horizontal (escala)
Obviamente, se for um site de comércio eletrônico com uma certa escala, a quantidade de dados é muito grande. Como as informações da transação envolvem transações, é difícil abandonar diretamente a capacidade de transação do banco de dados de relacionamento e migrar para o banco de dados NOSQL com melhores recursos de escala.
Bem, geralmente é feito. Felizmente, podemos arquivar até a data e cache os resultados pelo processamento de lote de computação offline.
No entanto, os requisitos aqui estão dentro de 20 minutos, o que é difícil.
2. Problemas de desempenho <BR /> Esse problema é consistente com a expansão.
A questão é: quantas vezes precisamos entrar no armazém?
Que tal 10 minutos?
Que tal 5 minutos?
E quanto a tempo real?
Além disso, a camada de negócios também enfrenta as limitações do poder de computação de ponto único e requer expansão horizontal, por isso é necessário considerar o problema da consistência.
Portanto, tudo é muito complicado aqui.
3. Problemas de expansão de negócios <BR /> Supondo que devemos não apenas lidar com as estatísticas de mercadorias de venda a quente, mas também clique em publicidade estatística ou determinar rapidamente as características do usuário com base no comportamento de acesso do usuário para ajustar as informações que eles vêem, a empresa A camada será mais complicada.
Talvez você tenha uma maneira melhor, mas, na verdade, o que precisamos é de uma nova cognição:
O que aconteceu neste mundo foi real -tempo.
Portanto, precisamos de um modelo calculado em tempo real, não um modelo de processamento em lote.
Esse modelo de que precisamos deve ser capaz de processar muitos dados, por isso é melhor ter uma boa capacidade de escala.
Em seguida, esse modelo de computação é um modelo de cálculo real, que também pode ser considerado como um modelo de computação de streaming.
Agora, assumindo que temos esse modelo, podemos projetar com prazer novos cenários de negócios:
Qual é o Weibo mais encaminhado?
Quais são os produtos mais quentes?
Quais são os pontos quentes que todos estão pesquisando?
Qual anúncio, qual posição, é a mais clicada?
Ou, podemos perguntar:
O que aconteceu neste mundo?
Qual é o tópico Weibo mais quente?
Utilizamos uma simples contagem de janelas deslizantes para revelar o véu misterioso do cálculo real de tempo real.
Suponha que nossos requisitos de negócios sejam:
Estatísticas 10 tópicos mais quentes do Weibo em 20 minutos.
Para resolver esse problema, precisamos considerar:
1. Fonte de dados <BR /> aqui, assumindo nossos dados, o tópico do Weibo Long Connection Push.
2. Modelagem de problemas
O tópico que pensamos ser a expansão do número#.
Por exemplo: @foreach_break: Olá,#比#, eu te amo,#weibo#.
"World" e "Weibo" são tópicos.
3. Motor de cálculo
Usamos tempestade.
4. Defina o tempo
Como definir o tempo?
A definição de tempo é uma coisa difícil, dependendo do que a precisão é necessária.
Segundo a realidade, geralmente usamos tick para representar esse conceito.
Na infraestrutura da Storm, a fase de inicialização do executor usa o timer para acionar o evento "após um período de tempo".
Como mostrado abaixo:
(Defn Setup Ticks! [Executor de trabalhador-Data] Ive-ive (:: Receber-wue Executor-Data) Contexto (:: Executor-Data do Trabalhador-Contexto)] (quando Tick-Time-Secs (ou (System-ID? ( : Componente-ID Executor-Data))) ALSE (Storm-Conf-Topologia-Enable-Message-timeouts) (=: SPOUT (: Type Execoror-Data))) (Log-Message "Timeouts desativado para Executor" (: Componente- ID Exec utor-Data) ":" ("(" (: Executor-ID Executor-Data) (Recorrente ao cronograma (: Trabalhador do usuário) Tick-tick-tick-SECS-Time-SECS (FN [] (Disruptor/ PUBLISH Receive-Queue [[Nil (Tupleimpl. Context [tick -Time-secs] Constants/System_Task_id Constants/System_Tick_Stream_id)]))))))))))))))))),),)Toda vez que esse evento será acionado.
Como Bolt julga que a tupla recebida representa "tick"?
Responsável pelo gerenciamento do thread do Executor da Bolt.
Public static boolean iSstick (tupla tupla) {return tuple! Combinado com o código CLOJURE de Configuração!
Pode -se observar que, no código a seguir, System_task_id também passou para a Tupla:
;
(Tupleimpl. Contexto [Tick-time-secs] Constants/System_task_id Constants/System_Tick_Stream_id))
Em seguida, use o código a seguir para obter o System_component_id:
Public string getComponentId (int taskId) {if (taskId == constants.system_id_id) {return constants.system_component_id;Com a infraestrutura acima <r />, também precisamos de alguns meios para concluir a "engenharia" e transformar a idéia em realidade.
Aqui, vejamos o design da janela deslizante de Michael G. Noll.
Topologia
String SpoutId = Wordgenrator "; / A janela de tempo do RollingCountbolt é de 9 segundos e os resultados estatísticos são enviados a cada 3 segundos ao Builter.SetBolt a jusante. O // intermediário; Preencha a agregação completa e conte o Top-N Topic Builder.setBolt (TotalRankerID, New TotalRankingSbolt (TOP_N)).
O design superior acima é o seguinte:
Combinando o cálculo da agregação com o tempo
Anteriormente, descrevemos o incidente de carrapato, que acionará o método de execução do Bolt durante o retorno de chamada, o que pode ser feito:
RollingCountbolt:
@Override public void Execute (tupla tupla) {if (tpleutils.istick (tupla)) {log.debug ("Tupla recebida, emit de ticks, emitis de ticks de tempo, as janelas atuais"); Envie -o e deixe a janela scroll emitcurrentwindowCounts ();} else {// tupla convencional, e a contagem de tópicos pode contar (tupla);} // obj é o tópico, adicione uma contagem ++ // preste atenção, a velocidade aqui Basicamente, é basicamente básico aqui. Parafuso pode ser escala. EmitcurrentWindowCounts () {map <Object, Long> Conde = CountCountSThenadvanceWindow (); _lengtt h_warning_template , Realwindowl comprimentonsegunds, windowlengthInseconds);} emiti (contagens, realwindowl comprimentonsegunds);}O código acima pode ser um pouco abstrato.
Intermediankingsbolt e TotalRankingsbolt:
Execute do vazio final (tupla tupla, colecionador BasicOutCollector) {if (tupleutils.istick (tupla)) {getLogger (). ;} Else {// polytes e classifique atualizações de atualização (tupla);}}Entre eles, o método agregado de classificação da Internet e TotalRankingsbolt é um pouco diferente:
Método de classificação de agregado intermediário do solo:
// intermediário -margem do método de classificação agregado: @Override void UpdateankingSwithtuple (tupla tupla) {// Esta etapa é extrair o número de tópicos e tópicos. Times é agregado e, em seguida, todos os tópicos shaper.getRankings ().O método de classificação agregado de TotalRankingsbolt:
// TOTALRANKINGSBOLT Método de classificação de @Override Atualmente, atualize -se (tupla TPLE) {// propõe o resultado médio do resultado intermediário do intermediário da internet. ().O método de classificação pesada é relativamente simples e rude, porque apenas n, n não será muito grande:
Private void () {Coleções.sort (RankedItems); Conclusão
A figura abaixo pode ser o resultado que queremos.
O acima é todo o conteúdo deste artigo.