Explorando protocolos
de serialização de alto
desempenho
Rafael Monteiro e Pereira
Software Engineer @ BM&F Bovespa
“Opiniões contidas aqui são
exclusivamente minhas e não
necessariamente refletem as
opiniões do meu empregador.”
99,9% de mensagens
processadas com tempo de
no máximo alguns
milissegundos
Problemas!
Rede!
BackPressure!
Performance!
Garbage Collector
Stop the World!
Freeze!
“Cara, não tá dando.
Precisa melhorar esse
treco”
Cara de operações
Testes
Profiling
Peer Review
não apontaram
melhorias evidentes
“Vamos fazer o fácil”
“Não temos prazo para isso!”
“Essa solução custa caro”
Chefe
“Nem sonhe em reescrever
80% da aplicação!”
Cara de QA
FFFFFFFF
Google, help me !
Serialização...
XML
JSON
Human Readable Binary
Native ( Java, c++ etc )
Google Protocol Buffers
Google FlatBuffers
Simple Binary Encoding
Muitos outros....
(Mais rápido)
Muito verboso
Human Readable
Schema
(XSD, DTD etc)
Typed
Lento….
XML JSON
Menos verboso…
Human Readable
Não tem Schema
Browser Friendly
Simples
Typed
Incluso na linguagem
Native
Human Readable
Browser Friendly
Schema
Interop
Languages: Java, C++,
Python
Code Generation
Interop
Typed
Schema
Backward Compatibility
Protocol Buffers
Human Readable
Browser Friendly
Languages: Java, C++, C#, Go,
Python
Code Generation
Interop
Typed
Schema
Backward Compatibility
Positional Access
Table Based
FlatBuffers
Human Readable
Browser Friendly
Languagues: C++, Java , C#
Code Generation
Interop
Typed
Schema
Backward Compatibility
Positional Access
Simple Binary Encoding
Human Readable
Browser Friendly
Complexo na utilização de
Strings
Focado em Mercado
Financeiro (FIX)
(Menção Honrosa)
Mais alguns dados...
GPB SBE FlatBuffers
Versionamento do
Schema
Sim Problemas Sim
Zero-copy Não Sim Sim
Leitura Random-access Não Não Sim
Schema language Proprietário XML Proprietário
Mensagens mutáveis Sim Não Sim
Available on:
https://github.com/rafamonteiro/SerializationProtocolsBenchMark
Hardware
Intel Core i7 4770K
16GB RAM DDR3 – 2400 mhz
SSD 256 GB
Ubuntu 15.04 x64
Algumas informações
sobre o benchmark...
Software
JDK 1.8 x64 – Update 51
JMH – Warmup e Bencharking
Google Protocol Buffers
FlatBuffers
Jackson(JSON)
Deserialization
Native Java
16,854 ns
JSON
578 ns
GPB
65 ns
FlatBuffers
9 ns
1 10 100 1,000 10,000 100,000
1 mensagem
± 902,67
± 7,91
± 0,13
± 0,05
Deserialization
Native Java
16,854 ns
JSON
578 ns
GPB
65 ns
FlatBuffers
9 ns
1 10 100 1,000 10,000 100,000
1 mensagem
± 902,67
± 7,91
± 0,13
± 0,05
Deserialization
1.000.000 mensagens
Native Java
15,177 ms
JSON
408 ms
GPB
67 ms
FlatBuffers
7 ms
1 10 100 1,000 10,000 100,000
± 32,27
± 13,42
± 1,04
± 12,49
Serialization
1 mensagem
Native Java
2,923 ns
JSON
425 ns
GPB
109 ns
FlatBuffers
315 ns
1 10 100 1,000 10,000
± 32,27
± 13,42
± 1,04
± 12,49
Serialization
1.000.000 mensagens
Native Java
2,728 ms
JSON
563 ms
GPB
110 ms
FlatBuffers
280 ms
1 10 100 1,000 10,000
± 32,27
± 13,42
± 1,04
± 12,49
Tamanho das Mensagens
1 Mensagem em bytes
Native Java
425.00
JSON
117.00
GPB
56.00
FlatBuffers
104.00
0 50 100 150 200 250 300 350 400 450
Alguma ideias...
MicroServices
ServiceBUS
ZeroMQ
Redis
Obrigado!!!!
Feedback ? Contato ?
Blog: rafamonteiro.io (soon)
E-mail: rafael@rafamonteiro.io
Github: github.com/rafamonteiro
Twitter: @RafaMonteiro_Io

Explorando protocolos de serialização de alto desempenho