O Elefante Poliglota

522 visualizações

Publicada em

Conhecimento compartilhado no PGDay PR 2015 em Curitiba, UTFPR. Falamos sobre como usar a extensibilidade do PostgreSQL para torná-lo um servidor WEB. Passeamos sobre temas como Javascript, Websockets, plv8, background workers e outras coisas.

Publicada em: Tecnologia
0 comentários
1 gostou
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
522
No SlideShare
0
A partir de incorporações
0
Número de incorporações
15
Ações
Compartilhamentos
0
Downloads
2
Comentários
0
Gostaram
1
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

O Elefante Poliglota

  1. 1. O Elefante Poliglota Dickson S. Guedes @guediz PGDay PR 2015 - Curitiba, PR
  2. 2. poliglota adjetivo 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.
  3. 3. ATENÇÃO: esta palestra é uma viagem!
  4. 4. vamos começar com uma hipótese
  5. 5. seria possível transformar um servidor Postgres em um servidor WEB?
  6. 6. ahn?! que esse careca ta falando?
  7. 7. vamos começar a viagem…
  8. 8. no mundo "dos computadô"
  9. 9. o dado nu e crú
  10. 10. [ entrada ] -> [ processamento ] -> [ saida ]
  11. 11. continuo processo de transformação de dados
  12. 12. no mundo "das Internet"
  13. 13. Browser
  14. 14. Apache, Rails, Django, JBoss, Cowboy, Phoenix, Node.js
  15. 15. Javascript
  16. 16. JSON
  17. 17. Javascript Object Notation { "nome":"Joao", "endereco":{ "cep":"88000-00", "rua":"DasSaudades", "nro":453, "bairro":"Centro" }, "dependentes":[ {"nome":"Maria","parentesco":"esposa"}, {"nome":"Mario","parentesco":"filho"}, {"nome":"Marina","parentesco":"filha"} ] }
  18. 18. ecoando varpessoa={ "nome":"Joao", "endereco":{ "cep":"88000-00", "rua":"DasSaudades", "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"
  19. 19. Voltando ao Javascript
  20. 20. callback varaudita=function(objeto){ console.log(objeto.nome+"foiinserido!"); } varpessoa=newPessoa(); pessoa.on('after-save',audita); pessoa={"nome":"Joao",...} pessoa.save(); =>Joaofoiinserido!
  21. 21. alguem lembra?
  22. 22. Websockets
  23. 23. pub/sub
  24. 24. o movimento de Javascriptização
  25. 25. Node.js
  26. 26. respirem …
  27. 27. no mundo do Postgres
  28. 28. a extensibilidade que liberta
  29. 29. Postgres não é apenas um SGDB
  30. 30. é uma plataforma de desenvolvimento de aplicações
  31. 31. o catalogo #dtpg_catalog. Listofrelations 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
  32. 32. operadores (pg_operator) + - / * o seu mais novo operador pode estar aqui …
  33. 33. tipos (pg_type) integer numeric text … json jsonb o seu tipo pode estar aqui também
  34. 34. linguagens (pg_language) plpgsql plperl plpython plv8 - javascript a sua linguagem pode estar aqui também
  35. 35. respirem …
  36. 36. plv8
  37. 37. plv8 - Javascript no Postgres
  38. 38. vamos usar o mesmo exemplo do Javascript DOLANGUAGEplv8 $$ varpessoa={ "nome":"Joao", "endereco":{ "cep":"88000-00", "rua":"DasSaudades", "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"]); $$;
  39. 39. FDW - foreign data wrappers (pg_foreign_data_wrapper) file_fdw postgres_fdw mysql_fdw mongo_fdw multicorn que tal o seu aqui também?
  40. 40. FDW - um exemplo nativo CREATEEXTENSIONpostgres_fdw; CREATESERVERservidor_de_consultas FOREIGNDATAWRAPPERpostgres_fdw OPTIONS(host'192.168.1.1',dbname'banco',port'5432'); CREATEUSERMAPPINGFORCURRENT_USER SERVERservidor_de_consultas OPTIONS(user'usuario_consulta',password'consulta'); CREATEFOREIGNTABLEpessoas(cpfnumeric,nomevarchar) SERVERservidor_de_consultas OPTIONS(schema_name'recursos_humanos',table_name'tb_funcionarios'); EXPLAIN(ANALYZE,VERBOSE,BUFFERS) SELECT*FROMpessoas WHEREcpf=1234567891; QUERYPLAN --------------------------------------------------------------------------------------------- --------------------------------------------------------- ForeignScanonpublic.pessoas (cost=100.00..118.06rows=3width=104)(actualtime=46.039.. 46.040rows=1loops=1) Output:cpf,nome RemoteSQL:SELECTcpf,nomeFROMrecursos_humanos.tb_funcionariosWHERE((cpf=123456789 1::numeric)) Planningtime:0.061ms Executiontime:105.232ms (5registros)
  41. 41. FDW - um exemplo multicorn http://multicorn.org/implementing-an-fdw/
  42. 42. BGW - background workers
  43. 43. BGW - uma visão geral executa junto com o postgres morre junto com o postgres mas também pode ser dinamico é um daemon o poder esta nas mãos de seu criador você tem que escreve-lo em C
  44. 44. BGW - um exemplo postmaster | `--autovacuum | `--checkpointer | `--bgwriter | `--matador_de_conexoes_ociosas | `--analisador_da_saude_do_banco . . .
  45. 45. background worker como uma porta de entrada
  46. 46. BGW é em C, ou seja …
  47. 47. Mas você pode inicia-lo utilizando uma função do banco -- SELECTnet_http_server(8000);
  48. 48. e um novo BGW inicia postmaster | `--autovacuum | `--checkpointer | `--bgwriter | `--matador_de_conexoes_ociosas | `--analisador_da_saude_do_banco | `--net_http_server . . .
  49. 49. LISTEN/NOTIFY
  50. 50. LISTEN SESSAOA SESSAOB psql-dbanco |psql-dbanco | >LISTENusuario_logou; |>...
  51. 51. LISTEN SESSAOA SESSAOB psql-dbanco |psql-dbanco | >LISTENusuario_logou; |>... >LISTENusuario_logou; |>... |>INSERTINTOlogin(current_timestamp,'JOSE' ); ...ocaracoxilouporunsminutos... |
  52. 52. LISTEN SESSAOA SESSAOB psql-dbanco |psql-dbanco | >LISTENusuario_logou; |>... >LISTENusuario_logou; |>... |>INSERTINTOlogin(current_timestamp,'JOSE' ); ...ocaracoxilouporunsminutos... | |>NOTIFYusuario_logou,'JOSE'; |
  53. 53. LISTEN SESSAOA SESSAOB psql-dbanco |psql-dbanco | >LISTENusuario_logou; |>... >LISTENusuario_logou; |>... |>INSERTINTOlogin(current_timestamp,'JOSE' ); ...ocaracoxilouporunsminutos... | |>NOTIFYusuario_logou,'JOSE'; >LISTENusuario_logou; | |
  54. 54. LISTEN SESSAOA SESSAOB psql-dbanco |psql-dbanco | >LISTENusuario_logou; |>... >LISTENusuario_logou; |>... |>INSERTINTOlogin(current_timestamp,'JOSE' ); ...ocaracoxilouporunsminutos... | |>NOTIFYusuario_logou,'JOSE'; >LISTENusuario_logou; | | Notificaçãoassíncrona"usuario_logou"com | mensagem"JOSE"recebidadoprocessodo | servidorcomPID25439. |
  55. 55. a contrib tcn test=#createtabletcndata test-# ( test(# aintnotnull, test(# bdatenotnull, test(# ctext, test(# primarykey(a,b) test(# ); CREATETABLE test=#createtriggertcndata_tcn_trigger test-# afterinsertorupdateordeleteontcndata test-# foreachrowexecuteproceduretriggered_change_notification(); CREATETRIGGER
  56. 56. vendo o resultado da tcn test=#listentcn; LISTEN test=#insertintotcndatavalues(1,date'2012-12-22','one'), test-# (1,date'2012-12-23','another'), test-# (2,date'2012-12-23','two'); INSERT03 Asynchronousnotification"tcn"withpayload""tcndata",I,"a"='1',"b"='2012-12-22'"received fromserverprocesswithPID22770. Asynchronousnotification"tcn"withpayload""tcndata",I,"a"='1',"b"='2012-12-23'"received fromserverprocesswithPID22770. Asynchronousnotification"tcn"withpayload""tcndata",I,"a"='2',"b"='2012-12-23'"received fromserverprocesswithPID22770. test=#updatetcndatasetc='uno'wherea=1; UPDATE2 Asynchronousnotification"tcn"withpayload""tcndata",U,"a"='1',"b"='2012-12-22'"received fromserverprocesswithPID22770. Asynchronousnotification"tcn"withpayload""tcndata",U,"a"='1',"b"='2012-12-23'"received fromserverprocesswithPID22770. test=#deletefromtcndatawherea=1andb=date'2012-12-22'; DELETE1 Asynchronousnotification"tcn"withpayload""tcndata",D,"a"='1',"b"='2012-12-22'"received fromserverprocesswithPID22770.
  57. 57. respirem …
  58. 58. finalizando …
  59. 59. (quase)
  60. 60. hipoteticamente pensando …
  61. 61. como poderia ser um servidor web no Postgres?
  62. 62. iniciando a aplicação CREATESCHEMAtodo_list; CREATETABLEtodo_list.itens(conteudojsonb); CREATEINDEXix_itens_idONtodo_list.itensUSINGGIN((conteudo->'id')); SELECTpg_web_app_start('todo_list',8000);
  63. 63. guedes@betelgeuse ~$ curl-XPUThttp://ip.servidor:8000/item/-d'{"id":1,"descricao":"compartilharconhecime nto"}' {"response":"created"} curl-XGEThttp://ip.servidor:8000/item/1 {"id":1,"descricao":"compartilharconhecimento"} curl-XDELETEhttp://ip.servidor:8000/item/1 {"response":"deleted"} curl-XGEThttp://ip.servidor:8000/item/1
  64. 64. qual é a magica do pg_web_app_start('todo_list',8000)?
  65. 65. todo_list.app() CREATEFUNCTIONtodo_list.app()RETURNSjsonbLANGUAGEplv8AS$$ varTodoListApp=PgWebApp(); TodoListApp.get('/',function(req,res){ res.send('<html>....</html>'); }); TodoListApp.get('/item/:id',function(req,res){ plv8.execute('SELECT*FROMtodo_list.itensWHEREid=$1',[req.params.id]); }); TodoListApp.put('/item',function(req,res){ plv8.execute('INSERTINTOtodo_list.itensVALUES($1)',[req.body]); }); TodoListApp.post('/item',function(req,res){ plv8.execute('UPDATEtodo_list.itensSETconteudo=$1WHEREid=$2',[req.body,req.para ms.id]); }); TodoListApp.delete('/item',function(req,res){ plv8.execute('DELETEFROMtodo_list.itensWHEREid=$1',[req.params.id]); }); TodoListApp.on('usuario_logado',function(payload){ plv8.elog(NOTICE,'Ousuario'+payload+'logou!'); }); RETURNTodoListApp; $$;
  66. 66. é como se eu publicasse meu esquema todo_listna porta 8000
  67. 67. mas …
  68. 68. você pode esquecer tudo isto …
  69. 69. e dar uma olhada no pg_rest
  70. 70. no fim das contas você vai perceber que ..
  71. 71. não há limites para o que você pode fazer com o Postgres …
  72. 72. e que não há limite para a sua imaginação …
  73. 73. mas tenha a certeza de que o caminho seja divertido
  74. 74. compartilhem conhecimento
  75. 75. inspirem
  76. 76. e é isso, obrigado! :) Conferencia Brasileira de PostgreSQL 18 a 20 de Novembro email: guedes@guedesoft.net github: twitter: http://pgbr.postgresql.org.br/ http://github.com/guedes http://twitter.com/guediz

×