Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

PHP Experience 2016 - [Workshop] Elastic Search: Turbinando sua aplicação PHP

584 views

Published on

Breno Oliveira, Líder Técnico Moip, ministrou o workshop "Elastic Search: Turbinando sua aplicação PHP", no PHP Experience 2016.

O iMasters PHP Experience 2016 aconteceu nos dias 21 e 22 de Março de 2015, no Hotel Tivoli em São Paulo-SP
http://phpexperience2016.imasters.com.br/

Published in: Education
  • Be the first to comment

PHP Experience 2016 - [Workshop] Elastic Search: Turbinando sua aplicação PHP

  1. 1. Breno Oliveira @brenoholiveira breno26@gmail.com B R E N O O L I V E I R A Tech Leader at Moip ElasticSearch Turbinando sua aplicação PHP
  2. 2. + 86k de contas vendendo
  3. 3. + 100K de pedidos por dia
  4. 4. VENDAS AUMENTAM VENDEDOR QUER SABER
  5. 5. Ordenação FullText Search PaginaçãoAgregação Filtros
  6. 6. REALTIME
  7. 7. E O SEU SERVER DEPOIS DE VÁRIOS F5 …
  8. 8. NOSSA VONTADE É DE …
  9. 9. SEU CLIENTA VAI…
  10. 10. PHP + MySQL PHP + postgresql PHP + nosql PHP + ????
  11. 11. CASO DE USO
  12. 12. +
  13. 13. 502 200 304
  14. 14. +
  15. 15. Aplicação MOIP Base de Dados Master
  16. 16. Single Term SELECT * FROM pedidos p INNER JOIN cliente ON p.cliente_id = c.id WHERE p.descricao LIKE "%superman%"
  17. 17. multi Term SELECT * FROM pedidos p INNER JOIN cliente ON p.cliente_id = c.id WHERE p.descricao LIKE "%superman%" OR p.descricao LIKE "%batman%"
  18. 18. ORDER ARRGH!!!! SELECT * FROM pedidos p INNER JOIN cliente ON p.cliente_id = c.id WHERE p.descricao LIKE "%superman%" OR p.descricao LIKE "%batman%" ORDER BY ??
  19. 19. PROBLEMAS • Difícil manter • Muitos JOINS • Lento
  20. 20. .Primeiro REFACTOR
  21. 21. MICRO SERVIÇO + BANCO denormalizado
  22. 22. APLICAÇÃO MOIP Base de Dados Master REPORTS API Base de Dados denormalizada
  23. 23. MELHORIAS • Micro serviço • Concorrência no banco de dados • No more JOINS • Full-Text Search • Melhorias de desempenho
  24. 24. PROBLEMAS •Periodos longos •Filtros •Lentidão
  25. 25. .SEgundo REFACTOR
  26. 26. MICRO SERVIÇO + Banco colunar
  27. 27. APLICAÇÃO MOIP Base de Dados Master REPORTS API
  28. 28. MELHORIAS • Consultas significantemente mais rápidas
  29. 29. PROBLEMAS •BULK INSERTs Too Slow
  30. 30. .terceiro REFACTOR
  31. 31. MICRO SERVIÇO + Elasticseach
  32. 32. APLICAÇÃO MOIP Base de Dados Master REPORTS API Elasticsearch
  33. 33. MELHORIAS • Bulk INSERT • Desempenho • Aggregations • Scalable • Redundancy
  34. 34. .Atualmente
  35. 35. Last Black Friday
  36. 36. .não é banco da dados
  37. 37. .nem nosql I T ' ’ N O T K E Y- VA L U E S T O R A G E
  38. 38. .Escalável
  39. 39. .Alta resiliencia
  40. 40. .restful api
  41. 41. .orientado a documentos
  42. 42. .full-text search
  43. 43. .free schema
  44. 44. .Eventualmente consistente
  45. 45. .apache lucene
  46. 46. .Conceitos básicos Elasticsearch
  47. 47. MySQL Elasticsearch Database Index Table Type Column Field Schema Mapping Partition Shard
  48. 48. curl -XPUT http://localhost:9200/tips/tip/1 -d '{"tip": "Using Elasticsearch in Production", "tags": ["protip","success"]} ' Endpoint Index Type Document ID Document { "_index": "tips", "_type": "tip", "_id": "1", "_version": 1, "created": true } Response
  49. 49. $ curl http://localhost:9200/tips/tip/1?pretty { "_index": "tips", "_type": "tip", "_id": "1", "_version": 1, "found": true, "_source": { "tip": "Using Elasticsearch in Production", "tags": [ "protip", "success" ] } }
  50. 50. VAGRANT
  51. 51. $ git clone git@github.com:brenooliveira/elastic-php-demo.git $ cd elastic-php-demo $ vagrant up —provision $ vagrant ssh vagrant@default:~/$
  52. 52. vagrant@default:$ curl http://localhost:9200 { "status" : 200, "name" : "Corruptor", "cluster_name" : "elasticsearch", "version" : { "number" : "1.5.2", "build_hash" : "62ff9868b4c8a0c45860bebb259e21980778ab1c", "build_timestamp" : "2015-04-27T09:21:06Z", "build_snapshot" : false, "lucene_version" : "4.10.4" }, "tagline" : "You Know, for Search" }
  53. 53. { "require": { "elasticsearch/elasticsearch": "~2.0@beta" } } composer.json $ curl -s http://getcomposer.org/installer | php $ php composer.phar install --no-dev
  54. 54. <?php require 'vendor/autoload.php'; $client = ElasticsearchClientBuilder::create() ->build(); $params = array(); $params['index'] = 'tips'; $params['type'] = 'tip'; $params['id'] = '1'; $result = $client->get($params) ?> <pre> <?= print_r($result); ?> </pre> exemplo1.php
  55. 55. Array ( [_index] => tips [_type] => tip [_id] => 1 [_version] => 1 [found] => 1 [_source] => Array ( [tip] => Using Elasticsearch in Production [tags] => Array ( [0] => protip [1] => success ) ) )
  56. 56. exemplo2.php <?php require 'vendor/autoload.php'; $client = ElasticsearchClientBuilder::create() ->build(); $params = [ 'index' => 'tips', 'type' => 'tip', 'id' => '2', 'body' => [ 'tip' => 'Using Marvel to get metrics from Elasticsearch', 'tags' => ['protip', 'metrics'] ] ]; // Documento indexado em tips/tip/2 $response = $client->index($params); ?> <pre> <?= print_r($response) ?> </pre>
  57. 57. exemplo3.php <?php require 'vendor/autoload.php'; $client = ElasticsearchClientBuilder::create() ->build(); for($i = 0; $i < 100; $i++) { $params['body'][] = [ 'index' => [ '_index' => 'jobs', '_type' => 'job', ] ]; $params['body'][] = [ 'title' => 'Job position '. $i, 'email' => 'email-'. $i . '@gmail.com' ]; } $responses = $client->bulk($params); ?>
  58. 58. exemplo4.php <?php require 'vendor/autoload.php'; $client = ElasticsearchClientBuilder::create()->build(); $json = '{ "query" : { "match" : { "tags" : "protip" } } }'; $params = [ 'index'=> 'tips', 'type' => 'tip', 'body' => $json ]; $responses = $client->search($params); ?> <pre> <?= print_r($responses) ?> </pre>
  59. 59. exemplo5.php <?php require 'vendor/autoload.php'; $client = ElasticsearchClientBuilder::create()->build(); $params = [ 'index' => 'tips', 'type' => 'tip', 'id' => '3', 'body' => [ 'tip' => 'Wrong insert', 'tags' => ['missing', 'error', 'no_logs'] ] ]; $response_insert = $client->index($params); $params = [ 'index' => 'tips', 'type' => 'tip', 'id' => '3' ]; $responde_delete = $client->delete($params); ?>
  60. 60. exemplo6.php <?php require 'vendor/autoload.php'; $client = ElasticsearchClientBuilder::create()->build(); $params = [ 'index' => 'tips', 'type' => 'tip', 'id' => '4', 'body' => [ 'tip' => 'Loren Ipsum', 'tags' => ['lorem'] ] ]; $response_insert = $client->index($params); $params = [ 'index' => 'tips', 'type' => 'tip', 'id' => '4', 'body' => [ 'doc' => [ 'text' => 'lipsum generator' ] ] ]; $response_update = $client->update($params); $params = [ 'index' => 'tips', 'type' => 'tip', 'id' => '4' ]; $response_search = $client->get($params); ?>
  61. 61. exemplo7.php <?php require 'vendor/autoload.php'; $client = ElasticsearchClientBuilder::create()->build(); $json = '{ "my-suggestion" : { "text" : "Elastiscearch", "term" : { "field" : "tip" } } }'; $params = [ 'index' => 'tips', 'body' => $json ]; $response = $client->suggest($params); ?>
  62. 62. exemplo8.php <?php require 'vendor/autoload.php'; $client = ElasticsearchClientBuilder::create()->build(); $json = '{ "query" : { "more_like_this" : { "like_text" : "In production", "min_term_freq" : 1, "min_doc_freq" : 1 } } }'; $params = [ 'index' => 'tips', 'type' => 'tip', 'body' => $json ]; $response = $client->search($params); ?>
  63. 63. .Vamos falar de arquitetura
  64. 64. .Como devo sincronizar mysql & Elasticsearch
  65. 65. E-commerce app Base de Dados Elasticsearch Cadastrar novo produto
  66. 66. E-commerce app Base de Dados Elasticsearch rabbitmq Publish Message php worker Consume Message & Sync Cadastrar novo produto
  67. 67. .Lessons learned
  68. 68. Utilize mais mappings
  69. 69. Em produção use alias

×