Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Elasticsearch - Turbinando sua aplicação PHP
Search
Breno Oliveira
March 21, 2016
Programming
1
140
Elasticsearch - Turbinando sua aplicação PHP
Utilizando Elasticsearch em suas aplicações PHP
Breno Oliveira
March 21, 2016
Tweet
Share
More Decks by Breno Oliveira
See All by Breno Oliveira
Spring e Eureka Service Discovery
brenooliveira
0
49
Como Fazer Minha Gem e o Rails Conversarem Bem
brenooliveira
0
36
Javascript Pitfalls
brenooliveira
0
74
Elasticsearch
brenooliveira
1
110
Falando sobre testes automatizados
brenooliveira
0
79
Other Decks in Programming
See All in Programming
Next.js App Router
quramy
11
1.7k
From Spring Boot 2 to Spring Boot 3 with Java 21 and Jakarta EE
ivargrimstad
0
500
初心者のためのRubyKaigi入門/RubyKaigi Introduction
a_matsuda
8
1.4k
Git Rebase
bkuhlmann
11
1.6k
Hanami and htmx
bkuhlmann
0
220
Node.js v22 で変わること
yosuke_furukawa
PRO
11
3.9k
R言語の環境構築と基礎 Tokyo.R 112
bob3bob3
0
280
単体テストを書かない技術 #phpcon_odawara
o0h
PRO
27
8.5k
Elm 0.19.0 Changes
bkuhlmann
0
510
try! Swift Tokyo 初参加報告LT
hinakko2
0
230
Ruby Function Composition
bkuhlmann
1
340
Go製Webアプリケーションのエラーとの向き合い方大全、あるいはやっぱりスタックトレース欲しいやん / Kyoto.go #50
utgwkk
6
1.8k
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
11
1k
For a Future-Friendly Web
brad_frost
172
9k
Designing with Data
zakiwarfel
96
4.8k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
275
13k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
19
6.9k
Art, The Web, and Tiny UX
lynnandtonic
290
19k
A Philosophy of Restraint
colly
197
16k
It's Worth the Effort
3n
180
27k
Statistics for Hackers
jakevdp
790
220k
Happy Clients
brianwarren
92
6.4k
GitHub's CSS Performance
jonrohan
1025
450k
Automating Front-end Workflow
addyosmani
1357
200k
Transcript
Breno Oliveira @brenoholiveira
[email protected]
B R E N O O
L I V E I R A Tech Leader at Moip ElasticSearch Turbinando sua aplicação PHP
None
+ 86k de contas vendendo
+ 100K de pedidos por dia
None
None
VENDAS AUMENTAM VENDEDOR QUER SABER
None
Ordenação FullText Search Paginação Agregação Filtros
REALTIME
E O SEU SERVER DEPOIS DE VÁRIOS F5 …
None
None
NOSSA VONTADE É DE …
SEU CLIENTA VAI…
PHP + MySQL PHP + postgresql PHP + nosql PHP
+ ????
CASO DE USO
+
502 200 304
+
Aplicação MOIP Base de Dados Master
Single Term SELECT * FROM pedidos p INNER JOIN cliente
ON p.cliente_id = c.id WHERE p.descricao LIKE "%superman%"
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%"
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 ??
PROBLEMAS • Difícil manter • Muitos JOINS • Lento
.Primeiro REFACTOR
MICRO SERVIÇO + BANCO denormalizado
APLICAÇÃO MOIP Base de Dados Master REPORTS API Base de
Dados denormalizada
MELHORIAS • Micro serviço • Concorrência no banco de dados
• No more JOINS • Full-Text Search • Melhorias de desempenho
PROBLEMAS • Periodos longos • Filtros • Lentidão
.SEgundo REFACTOR
MICRO SERVIÇO + Banco colunar
APLICAÇÃO MOIP Base de Dados Master REPORTS API
MELHORIAS • Consultas significantemente mais rápidas
PROBLEMAS • BULK INSERTs Too Slow
.terceiro REFACTOR
MICRO SERVIÇO + Elasticseach
APLICAÇÃO MOIP Base de Dados Master REPORTS API Elasticsearch
MELHORIAS • Bulk INSERT • Desempenho • Aggregations • Scalable
• Redundancy
.Atualmente
None
Last Black Friday
None
None
None
.não é banco da dados
.nem nosql I T ' ’ N O T K
E Y- VA L U E S T O R A G E
.Escalável
.Alta resiliencia
.restful api
.orientado a documentos
.full-text search
.free schema
.Eventualmente consistente
.apache lucene
None
.Conceitos básicos Elasticsearch
MySQL Elasticsearch Database Index Table Type Column Field Schema Mapping
Partition Shard
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
$ 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" ] } }
None
VAGRANT
$ git clone
[email protected]
:brenooliveira/elastic-php-demo.git $ cd elastic-php-demo $ vagrant up
—provision $ vagrant ssh vagrant@default:~/$
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" }
{ "require": { "elasticsearch/elasticsearch": "~2.0@beta" } } composer.json $ curl
-s http://getcomposer.org/installer | php $ php composer.phar install --no-dev
<?php require 'vendor/autoload.php'; $client = Elasticsearch\ClientBuilder::create() ->build(); $params = array();
$params['index'] = 'tips'; $params['type'] = 'tip'; $params['id'] = '1'; $result = $client->get($params) ?> <pre> <?= print_r($result); ?> </pre> exemplo1.php
Array ( [_index] => tips [_type] => tip [_id] =>
1 [_version] => 1 [found] => 1 [_source] => Array ( [tip] => Using Elasticsearch in Production [tags] => Array ( [0] => protip [1] => success ) ) )
exemplo2.php <?php require 'vendor/autoload.php'; $client = Elasticsearch\ClientBuilder::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>
exemplo3.php <?php require 'vendor/autoload.php'; $client = Elasticsearch\ClientBuilder::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); ?>
exemplo4.php <?php require 'vendor/autoload.php'; $client = Elasticsearch\ClientBuilder::create()->build(); $json = '{
"query" : { "match" : { "tags" : "protip" } } }'; $params = [ 'index'=> 'tips', 'type' => 'tip', 'body' => $json ]; $responses = $client->search($params); ?> <pre> <?= print_r($responses) ?> </pre>
exemplo5.php <?php require 'vendor/autoload.php'; $client = Elasticsearch\ClientBuilder::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); ?>
exemplo6.php <?php require 'vendor/autoload.php'; $client = Elasticsearch\ClientBuilder::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); ?>
exemplo7.php <?php require 'vendor/autoload.php'; $client = Elasticsearch\ClientBuilder::create()->build(); $json = '{
"my-suggestion" : { "text" : "Elastiscearch", "term" : { "field" : "tip" } } }'; $params = [ 'index' => 'tips', 'body' => $json ]; $response = $client->suggest($params); ?>
exemplo8.php <?php require 'vendor/autoload.php'; $client = Elasticsearch\ClientBuilder::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); ?>
.Vamos falar de arquitetura
.Como devo sincronizar mysql & Elasticsearch
E-commerce app Base de Dados Elasticsearch Cadastrar novo produto
E-commerce app Base de Dados Elasticsearch rabbitmq Publish Message php
worker Consume Message & Sync Cadastrar novo produto
.Lessons learned
Utilize mais mappings
Em produção use alias
None