Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[Unifal SACIC 2016] NodeJS: JavaScript no servidor, vantagens e oportunidades

[Unifal SACIC 2016] NodeJS: JavaScript no servidor, vantagens e oportunidades

Talysson de Oliveira Cassiano

September 20, 2016
Tweet

More Decks by Talysson de Oliveira Cassiano

Other Decks in Programming

Transcript

  1. O problema com servidores web tradicionais @students = Student .joins(:courses)

    .where(courses: { name: 'Computer Science' }) .limit(1000)
  2. O que os outros núcleos do CPU fazem enquanto o

    banco de dados é consultado?
  3. Linha do tempo - 3 requests simultâneos Requisição Consulta BD

    Resposta Esperando Esperando Esperando Requisição Consulta BD Resposta Esperando Esperando Esperando Esperando Esperando Esperando Requisição Consulta BD Resposta Tempo total: 9s 0 3 6 7 2 1 4 5 8 9
  4. o problema com servidores web tradicionais × O processo é

    bloqueado enquanto espera × Processador não é aproveitado no tempo ocioso × Tempo total é a soma do tempo de todas as requisições × Disponibilidade menor da aplicação
  5. × Threads são computacionalmente caras × Quantidade limitada no pool

    de threads × São uma abstração ruim se usadas implicitamente × Difíceis de se manter escaláveis × Exemplo: servidor Apache Escalando um servidor com threads
  6. 1. Um certo evento irá acontecer 2. Uma função (chamada

    de callback) é criada para ser chamada quando o evento acontecer 3. O processo continua até que o evento ocorra 4. Quando ocorre, o processo para e o callback é chamado 5. Após o callback finalizar, o processamento volta para onde parou 6. Código continua até que um novo evento aconteça Programação orientada a eventos
  7. programação orientada a eventos e Javascript $('.button').click(function(data) { // Esta

    função é o nosso callback // que espera o evento de click :) }); // O código aqui continua sendo processado // enquanto o botão não foi clicado ainda
  8. programação orientada a eventos e Javascript × A comunidade JavaScript

    sempre usou eventos × Abstração fácil de ser aprendida e intuitiva × Sistemas baseados em eventos tem só uma thread × Esta thread é chamada de event loop × Um evento pode ser, por exemplo, “consulta ao banco de dados completa”
  9. Tempo total: 7s Linha do tempo - 3 requests simultâneos

    com eventos Requisição [Consulta BD] Resposta Esperando Requisição [Consulta BD] Resposta Esperando Esperando Esperando Requisição [Consulta BD] Resposta 0 3 6 7 2 1 4 5 8 9
  10. × JavaScript rodando fora do navegador × Não é um

    servidor como Apache ou NGINX × Concorrência baseada em eventos × Entrada/saída não-bloqueante e assíncrona × Baixíssimo consumo de memória × Mesma linguagem no backend e no frontend NodeJS
  11. var http = require('http'); var server = http.createServer(function(request, response) {

    response.write('Hello world'); response.end(); }); server.listen(3000); console.log('Server is listening on http://localhost:3000'); servidor simples que responde “Hello World”
  12. var http = require('http'); var fs = require('fs'); var server

    = http.createServer(function(request, response) { fs.readFile('~/my_file.mkv', function(fileContent) { response.write(fileContent); response.end(); }); }); server.listen(3000); console.log('Server is listening on http://localhost:3000'); servidor simples que lê e envia um arquivo
  13. var http = require('http'); var fs = require('fs'); var server

    = http.createServer(function(request, response) { fs.readFile('~/my_file.mkv', function(fileContent) { response.write(fileContent); response.end(); }); }); server.listen(3000); console.log('Server is listening on http://localhost:3000'); servidor simples que lê e envia um arquivo
  14. var http = require('http'); var fs = require('fs'); var server

    = http.createServer(function(request, response) { fs.readFile('~/my_file.mkv', function(fileContent) { response.write(fileContent); response.end(); }); }); server.listen(3000); console.log('Server is listening on http://localhost:3000'); servidor simples que lê e envia um arquivo
  15. var http = require('http'); var database = require('./database'); var server

    = http.createServer(function(request, response) { database.query('SELECT * FROM users', function(users) { response.write(users); response.end(); }); }); server.listen(3000); console.log('Server is listening on http://localhost:3000'); servidor simples que CONsulta o banco de dados
  16. × Utiliza função require para importar módulos × Utiliza module.exports

    para exportar módulos × Se o caminho do arquivo é relativo ou absoluto, procura o arquivo × Caso contrário, importa uma dependência ou biblioteca padrão com o nome passado sistema de módulos: CommonJS
  17. // importa arquivo user da mesma pasta do arquivo atual

    var user = require('./user'); // importa arquivo loginService na pasta anterior var loginService = require('../loginService'); // importa biblioteca padrão http var HTTP = require('http'); // importa dependência mysql var mySQL = require('mysql'); application.js
  18. × npm é o gerenciador de dependências padrão × Não

    tem só dependências de backend × Utiliza arquivo package.json para definir aplicação gerenciamento de dependências
  19. Instalando pacote com npm > npm init # arquivo package.json

    criado > npm install --save express # agora é possível usar require('express') # express foi adicionado ao package.json
  20. express - micro-framework para aplicações web var express = require('express');

    // módulo que instalamos var database = require('./database'); var app = express(); app.get('/download_file', function(request, response) { database.query('SELECT * FROM users', function(users) { response.send(users); }); }); app.listen(3000); console.log('Server is listening on http://localhost:3000');
  21. × Scripts de tarefas rápidas × Processadores de código (JavaScript,

    CSS...) × Ferramentas de teste automatizado Ferramentas em linha de comando
  22. Onde usar o Node? × Aplicações web comuns × Aplicações

    web em tempo real (chats, por exemplo) × APIs web de alta performance × Ferramentas em linha de comando × Aplicações web isomórficas/universais
  23. × Mantém a conexão aberta o tempo todo × Necessitam

    de um servidor robusto × Troca de mensagens entre servidor-cliente e cliente-cliente × Socket.IO é o pacote mais usado para isso × Socket.IO pode ser usado em conjunto, inclusive com o Express Aplicações em tempo real com websockets
  24. aplicação simples em tempo real com socket.io var express =

    require('express'); var app = express(); var SocketIO = require('socket.io'); var socketApp = new SocketIO(app); // recebe uma aplicação http/express socketApp.on('connection', function(client) { // evento de nova conexão client.broadcast.emit('new_user', { // emite evento a todos os clientes message: `User ${ client.id } logged into chat :)` }); }); app.listen(3000); console.log('Server listening on http://localhost:3000');
  25. × Compartilham código entre o backend e o frontend ×

    É um tópico avançado, não nos aprofundaremos × Só é possível porque o Node é em JavaScript × Primeira vez que há esta oportunidade de compartilhamento desde um bom tempo × Tema começou a ser explorado pelo AirBnB em 2013 × Mais complexas porém com a vantagem de ter uma única linguagem principal Aplicações isomórficas/universais
  26. Por onde começar com node? × Estude JavaScript × Repita

    o item anterior até entender programação assíncrona × Não use NodeJS como se fosse Ruby/PHP/Java × Aprenda o sistema de módulos (CommonJS) × Aprenda a usar o npm e as dependências × Estude como fazer um sistema web com o Express × Não use MongoDB até que saiba explicar o porquê
  27. Quem usa Node? × Netflix × AirBnB × Walmart ×

    PayPal × Trello × Westfield × Uber × Globo × Codeminer42 × Sprinklr × Lambda3 × Pling × Qualquer empresa onde há frontends