93
O Elefante Poliglota Dickson S. Guedes @guediz PGDay PR 2015 - Curitiba, PR

O Elefante Poliglota

Embed Size (px)

Citation preview

Page 1: O Elefante Poliglota

O ElefantePoliglota

Dickson S. Guedes@guediz

PGDay PR 2015 - Curitiba, PR

Page 2: O Elefante Poliglota

poliglotaadjetivo e substantivo de dois gêneros

1. que ou aquele que sabe ou fala muitas línguas.2. que está escrito em muitas línguas; poliglótico.3. diz-se da ave que é capaz de imitar muitos sons e

arremedar outras aves.

Page 3: O Elefante Poliglota

ATENÇÃO: esta palestra é umaviagem!

Page 4: O Elefante Poliglota

vamos começar com umahipótese

Page 5: O Elefante Poliglota

seria possível transformar umservidor Postgres em um

servidor WEB?

Page 6: O Elefante Poliglota

ahn?! que esse careca tafalando?

Page 7: O Elefante Poliglota
Page 8: O Elefante Poliglota

vamos começar a viagem…

Page 9: O Elefante Poliglota

no mundo "dos computadô"

Page 10: O Elefante Poliglota
Page 11: O Elefante Poliglota

o dado nu e crú

Page 12: O Elefante Poliglota

[ entrada ] -> [ processamento ] -> [ saida ]

Page 13: O Elefante Poliglota

continuo processo de transformação dedados

Page 14: O Elefante Poliglota
Page 15: O Elefante Poliglota

no mundo "das Internet"

Page 16: O Elefante Poliglota
Page 17: O Elefante Poliglota

Browser

Page 18: O Elefante Poliglota

Apache, Rails, Django, JBoss,Cowboy, Phoenix, Node.js

Page 19: O Elefante Poliglota

Javascript

Page 20: O Elefante Poliglota

JSON

Page 21: O Elefante Poliglota

Javascript Object Notation{ "nome": "Joao", "endereco" : { "cep": "88000-00", "rua": "Das Saudades", "nro": 453, "bairro": "Centro" }, "dependentes": [ { "nome": "Maria", "parentesco": "esposa" }, { "nome": "Mario", "parentesco": "filho" }, { "nome": "Marina", "parentesco": "filha" } ]}

Page 22: O Elefante Poliglota

ecoandovar pessoa = { "nome": "Joao", "endereco" : { "cep": "88000-00", "rua": "Das Saudades", "nro": 453, "bairro": "Centro" }, "dependentes": [ { "nome": "Maria", "parentesco": "esposa" }, { "nome": "Mario", "parentesco": "filho" }, { "nome": "Marina", "parentesco": "filha" } ]}

console.log(pessoa.nome); => "Joao" console.log(pessoa["dependentes"][0]["nome"]); => "Maria"

Page 23: O Elefante Poliglota

Voltando ao Javascript

Page 24: O Elefante Poliglota

callbackvar audita = function(objeto) { console.log(objeto.nome + " foi inserido!");}

var pessoa = new Pessoa();

pessoa.on('after-save', audita);

pessoa = { "nome": "Joao", ... }pessoa.save();

=> Joao foi inserido!

Page 25: O Elefante Poliglota

alguem lembra?

Page 26: O Elefante Poliglota
Page 27: O Elefante Poliglota

Websockets

Page 28: O Elefante Poliglota

pub/sub

Page 29: O Elefante Poliglota

o movimento deJavascriptização

Page 30: O Elefante Poliglota

Node.js

Page 31: O Elefante Poliglota
Page 32: O Elefante Poliglota

respirem …

Page 33: O Elefante Poliglota
Page 34: O Elefante Poliglota

no mundo do Postgres

Page 35: O Elefante Poliglota
Page 36: O Elefante Poliglota

a extensibilidade que liberta

Page 37: O Elefante Poliglota
Page 38: O Elefante Poliglota

Postgres não é apenas umSGDB

Page 39: O Elefante Poliglota

é uma plataforma dedesenvolvimento de aplicações

Page 40: O Elefante Poliglota

o catalogo# \dt pg_catalog. List of relations Schema | Name | Type | Owner ------------+-------------------------+-------+---------- pg_catalog | pg_aggregate | table | postgres ... pg_catalog | pg_class | table | postgres ... pg_catalog | pg_database | table | postgres pg_catalog | pg_foreign_data_wrapper | table | postgres pg_catalog | pg_foreign_server | table | postgres pg_catalog | pg_foreign_table | table | postgres pg_catalog | pg_index | table | postgres ... pg_catalog | pg_language | table | postgres ... pg_catalog | pg_operator | table | postgres ... pg_catalog | pg_type | table | postgres pg_catalog | pg_user_mapping | table | postgres

Page 41: O Elefante Poliglota

operadores (pg_operator)+-/*o seu mais novo operador pode estar aqui…

Page 42: O Elefante Poliglota

tipos (pg_type)integernumerictext…jsonjsonbo seu tipo pode estar aqui também

Page 43: O Elefante Poliglota

linguagens (pg_language)plpgsqlplperlplpythonplv8 - javascripta sua linguagem pode estar aqui também

Page 44: O Elefante Poliglota
Page 45: O Elefante Poliglota

respirem …

Page 46: O Elefante Poliglota
Page 47: O Elefante Poliglota

plv8

Page 48: O Elefante Poliglota

plv8 - Javascript no Postgres

Page 49: O Elefante Poliglota

vamos usar o mesmo exemplo doJavascript

DO LANGUAGE plv8 $$var pessoa = { "nome": "Joao", "endereco" : { "cep": "88000-00", "rua": "Das Saudades", "nro": 453, "bairro": "Centro" }, "dependentes": [ { "nome": "Maria", "parentesco": "esposa" }, { "nome": "Mario", "parentesco": "filho" }, { "nome": "Marina", "parentesco": "filha" } ]}

plv8.elog(NOTICE, pessoa.nome);plv8.elog(NOTICE, pessoa["dependentes"][0]["nome"]);$$;

Page 50: O Elefante Poliglota

FDW - foreign data wrappers(pg_foreign_data_wrapper)

file_fdwpostgres_fdwmysql_fdwmongo_fdwmulticornque tal o seu aqui também?

Page 51: O Elefante Poliglota

FDW - um exemplo nativoCREATE EXTENSION postgres_fdw;

CREATE SERVER servidor_de_consultas FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host '192.168.1.1', dbname 'banco', port '5432');

CREATE USER MAPPING FOR CURRENT_USERSERVER servidor_de_consultas OPTIONS (user 'usuario_consulta', password 'consulta');

CREATE FOREIGN TABLE pessoas (cpf numeric, nome varchar) SERVER servidor_de_consultas OPTIONS ( schema_name 'recursos_humanos', table_name 'tb_funcionarios');

EXPLAIN (ANALYZE,VERBOSE, BUFFERS) SELECT * FROM pessoas WHERE cpf = 1234567891; QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------ Foreign Scan on public.pessoas (cost=100.00..118.06 rows=3 width=104) (actual time=46.039..46.040 rows=1 loops=1) Output: cpf, nome Remote SQL: SELECT cpf, nome FROM recursos_humanos.tb_funcionarios WHERE ((cpf = 1234567891::numeric)) Planning time: 0.061 ms Execution time: 105.232 ms(5 registros)

Page 52: O Elefante Poliglota

FDW - um exemplo multicornhttp://multicorn.org/implementing-an-fdw/

Page 53: O Elefante Poliglota

BGW - background workers

Page 54: O Elefante Poliglota

BGW - uma visão geralexecuta junto com o postgresmorre junto com o postgresmas também pode ser dinamicoé um daemono poder esta nas mãos de seu criadorvocê tem que escreve-lo em C

Page 55: O Elefante Poliglota

BGW - um exemplopostmaster|-̀- autovacuum|-̀- checkpointer|-̀- bgwriter|-̀- matador_de_conexoes_ociosas|-̀- analisador_da_saude_do_banco...

Page 56: O Elefante Poliglota

background worker como umaporta de entrada

Page 57: O Elefante Poliglota

BGW é em C, ou seja …

Page 58: O Elefante Poliglota

Mas você pode inicia-lo utilizando umafunção do banco

--

SELECT net_http_server(8000);

Page 59: O Elefante Poliglota

e um novo BGW iniciapostmaster|-̀- autovacuum|-̀- checkpointer|-̀- bgwriter|-̀- matador_de_conexoes_ociosas|-̀- analisador_da_saude_do_banco|-̀- net_http_server...

Page 60: O Elefante Poliglota

LISTEN/NOTIFY

Page 61: O Elefante Poliglota

LISTEN SESSAO A SESSAO B

psql -d banco | psql -d banco |> LISTEN usuario_logou; | > ...

Page 62: O Elefante Poliglota

LISTEN SESSAO A SESSAO B

psql -d banco | psql -d banco |> LISTEN usuario_logou; | > ...> LISTEN usuario_logou; | > ... | > INSERT INTO login (current_timestamp, 'JOSE');... o cara coxilou por uns minutos ... |

Page 63: O Elefante Poliglota

LISTEN SESSAO A SESSAO B

psql -d banco | psql -d banco |> LISTEN usuario_logou; | > ...> LISTEN usuario_logou; | > ... | > INSERT INTO login (current_timestamp, 'JOSE');... o cara coxilou por uns minutos ... | | > NOTIFY usuario_logou, 'JOSE'; |

Page 64: O Elefante Poliglota

LISTEN SESSAO A SESSAO B

psql -d banco | psql -d banco |> LISTEN usuario_logou; | > ...> LISTEN usuario_logou; | > ... | > INSERT INTO login (current_timestamp, 'JOSE');... o cara coxilou por uns minutos ... | | > NOTIFY usuario_logou, 'JOSE';> LISTEN usuario_logou; | |

Page 65: O Elefante Poliglota

LISTEN SESSAO A SESSAO B

psql -d banco | psql -d banco |> LISTEN usuario_logou; | > ...> LISTEN usuario_logou; | > ... | > INSERT INTO login (current_timestamp, 'JOSE');... o cara coxilou por uns minutos ... | | > NOTIFY usuario_logou, 'JOSE';> LISTEN usuario_logou; | |Notificação assíncrona "usuario_logou" com |mensagem "JOSE" recebida do processo do |servidor com PID 25439. |

Page 66: O Elefante Poliglota

a contrib tcntest=# create table tcndatatest-# (test(# a int not null,test(# b date not null,test(# c text,test(# primary key (a, b)test(# );CREATE TABLEtest=# create trigger tcndata_tcn_triggertest-# after insert or update or delete on tcndatatest-# for each row execute procedure triggered_change_notification();CREATE TRIGGER

Page 67: O Elefante Poliglota

vendo o resultado da tcntest=# listen tcn;LISTENtest=# insert into tcndata values (1, date '2012-12-22', 'one'),test-# (1, date '2012-12-23', 'another'),test-# (2, date '2012-12-23', 'two');INSERT 0 3Asynchronous notification "tcn" with payload ""tcndata",I,"a"='1',"b"='2012-12-22'" received from server process with PID 22770.Asynchronous notification "tcn" with payload ""tcndata",I,"a"='1',"b"='2012-12-23'" received from server process with PID 22770.Asynchronous notification "tcn" with payload ""tcndata",I,"a"='2',"b"='2012-12-23'" received from server process with PID 22770.test=# update tcndata set c = 'uno' where a = 1;UPDATE 2Asynchronous notification "tcn" with payload ""tcndata",U,"a"='1',"b"='2012-12-22'" received from server process with PID 22770.Asynchronous notification "tcn" with payload ""tcndata",U,"a"='1',"b"='2012-12-23'" received from server process with PID 22770.test=# delete from tcndata where a = 1 and b = date '2012-12-22';DELETE 1Asynchronous notification "tcn" with payload ""tcndata",D,"a"='1',"b"='2012-12-22'" received from server process with PID 22770.

Page 68: O Elefante Poliglota
Page 69: O Elefante Poliglota

respirem …

Page 70: O Elefante Poliglota

finalizando …

Page 71: O Elefante Poliglota

(quase)

Page 72: O Elefante Poliglota

hipoteticamente pensando …

Page 73: O Elefante Poliglota

como poderia ser um servidor web noPostgres?

Page 74: O Elefante Poliglota

iniciando a aplicaçãoCREATE SCHEMA todo_list;

CREATE TABLE todo_list.itens( conteudo jsonb );

CREATE INDEX ix_itens_id ON todo_list.itens USING GIN ((conteudo->'id'));

SELECT pg_web_app_start('todo_list', 8000);

Page 75: O Elefante Poliglota

guedes@betelgeuse ~$curl -X PUT http://ip.servidor:8000/item/ -d '{ "id": 1, "descricao": "compartilhar conhecimento"}'{ "response": "created" }

curl -X GET http://ip.servidor:8000/item/1{ "id": 1, "descricao": "compartilhar conhecimento"}

curl -X DELETE http://ip.servidor:8000/item/1{ "response": "deleted" }

curl -X GET http://ip.servidor:8000/item/1

Page 76: O Elefante Poliglota

qual é a magica dopg_web_app_start('todo_list', 8000) ?

Page 77: O Elefante Poliglota

todo_list.app()CREATE FUNCTION todo_list.app() RETURNS jsonb LANGUAGE plv8 AS $$var TodoListApp = PgWebApp();

TodoListApp.get('/', function(req, res) { res.send('<html> .... </html>');});

TodoListApp.get('/item/:id', function(req, res) { plv8.execute('SELECT * FROM todo_list.itens WHERE id = $1', [ req.params.id ]);});

TodoListApp.put('/item', function(req, res) { plv8.execute('INSERT INTO todo_list.itens VALUES ($1)', [ req.body ]);});

TodoListApp.post('/item', function(req, res) { plv8.execute('UPDATE todo_list.itens SET conteudo = $1 WHERE id = $2', [ req.body, req.params.id ]);});

TodoListApp.delete('/item', function(req, res) { plv8.execute('DELETE FROM todo_list.itens WHERE id = $1', [ req.params.id ]);});

TodoListApp.on('usuario_logado', function(payload) { plv8.elog(NOTICE, 'O usuario ' + payload + ' logou!');});

RETURN TodoListApp;$$;

Page 78: O Elefante Poliglota

é como se eu publicasse meuesquema todo_list na porta

8000

Page 79: O Elefante Poliglota
Page 80: O Elefante Poliglota

mas …

Page 81: O Elefante Poliglota

você pode esquecer tudo isto …

Page 82: O Elefante Poliglota

e dar uma olhada no pg_rest

Page 83: O Elefante Poliglota
Page 84: O Elefante Poliglota

no fim das contas você vaiperceber que ..

Page 85: O Elefante Poliglota

não há limites para o que vocêpode fazer com o Postgres …

Page 86: O Elefante Poliglota

e que não há limite para a suaimaginação …

Page 87: O Elefante Poliglota

mas tenha a certeza de que ocaminho seja divertido

Page 88: O Elefante Poliglota

compartilhem conhecimento

Page 89: O Elefante Poliglota
Page 90: O Elefante Poliglota

inspirem

Page 91: O Elefante Poliglota
Page 92: O Elefante Poliglota

e é isso, obrigado! :)Conferencia Brasileira de PostgreSQL

18 a 20 de Novembro

email: [email protected]: twitter:

http://pgbr.postgresql.org.br/

http://github.com/guedeshttp://twitter.com/guediz

Page 93: O Elefante Poliglota