Slide 1

Slide 1 text

NodeJS: JavaScript no servidor Vantagens & oportunidades

Slide 2

Slide 2 text

Talysson / @talyssonoc talyssonoc.github.io

Slide 3

Slide 3 text

O problema com servidores web tradicionais

Slide 4

Slide 4 text

O problema com servidores web tradicionais @students = Student .joins(:courses) .where(courses: { name: 'Computer Science' }) .limit(1000)

Slide 5

Slide 5 text

O que os outros núcleos do CPU fazem enquanto o banco de dados é consultado?

Slide 6

Slide 6 text

Esperam.

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

Qual a solução adotada para o problema em servidores tradicionais?

Slide 10

Slide 10 text

Threads

Slide 11

Slide 11 text

× 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

Slide 12

Slide 12 text

Qual seria uma solução diferente para o problema?

Slide 13

Slide 13 text

Programação orientada a eventos

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Confuso?

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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”

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Não seria bom ter este sistema baseado em eventos de verdade no servidor?

Slide 20

Slide 20 text

Um cara chamado Ryan Dahl concorda com você!

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

× 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

Slide 26

Slide 26 text

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”

Slide 27

Slide 27 text

E o poder dos eventos?!

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

Sistema de módulos: CommonJS

Slide 33

Slide 33 text

× 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

Slide 34

Slide 34 text

user.js var user = { name: 'Mr. Anderson', codeName: 'Neo' }; module.exports = user;

Slide 35

Slide 35 text

// 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

Slide 36

Slide 36 text

Gerenciamento de dependências

Slide 37

Slide 37 text

× 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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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');

Slide 40

Slide 40 text

Ferramentas em linha de comando

Slide 41

Slide 41 text

× Scripts de tarefas rápidas × Processadores de código (JavaScript, CSS...) × Ferramentas de teste automatizado Ferramentas em linha de comando

Slide 42

Slide 42 text

Onde usar o NodeJS?

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

aplicações em tempo real

Slide 45

Slide 45 text

× 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

Slide 46

Slide 46 text

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');

Slide 47

Slide 47 text

Aplicações isomórficas/universais

Slide 48

Slide 48 text

× 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

Slide 49

Slide 49 text

Por onde começar?

Slide 50

Slide 50 text

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ê

Slide 51

Slide 51 text

Quem usa Node?

Slide 52

Slide 52 text

Quem usa Node? × Netflix × AirBnB × Walmart × PayPal × Trello × Westfield × Uber × Globo × Codeminer42 × Sprinklr × Lambda3 × Pling × Qualquer empresa onde há frontends

Slide 53

Slide 53 text

perguntas?

Slide 54

Slide 54 text

Obrigado!