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
160
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Elasticsearch - Turbinando sua aplicação PHP
Utilizando Elasticsearch em suas aplicações PHP
Breno Oliveira
March 21, 2016
More Decks by Breno Oliveira
See All by Breno Oliveira
Spring e Eureka Service Discovery
brenooliveira
0
64
Como Fazer Minha Gem e o Rails Conversarem Bem
brenooliveira
0
53
Javascript Pitfalls
brenooliveira
0
97
Elasticsearch
brenooliveira
1
120
Falando sobre testes automatizados
brenooliveira
0
94
Other Decks in Programming
See All in Programming
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
900
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
4
1.4k
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
340
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
540
Lean は証明の正しさを確認するためだけのツールって思ってませんか?
inoueasei
1
110
任せる範囲はこう広がった / How the Scope of AI Delegation Has Expanded
nrslib
1
270
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
110
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
8
5.3k
共通化で考えるべきは、実装より公開する型だった
codeegg
0
270
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
0
300
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.3k
Featured
See All Featured
Faster Mobile Websites
deanohume
310
32k
ラッコキーワード サービス紹介資料
rakko
1
4M
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
57k
Bash Introduction
62gerente
615
220k
Code Reviewing Like a Champion
maltzj
528
40k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
How to build a perfect <img>
jonoalderson
1
5.8k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
Designing Powerful Visuals for Engaging Learning
tmiket
1
460
Product Roadmaps are Hard
iamctodd
55
12k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
660
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
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