Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
Criando um endpoint de streaming
Felipe Mamud
October 19, 2017
Programming
0
24
Criando um endpoint de streaming
Como criar um endpoint stream utilizando Spring Boot.
Felipe Mamud
October 19, 2017
Tweet
Share
More Decks by Felipe Mamud
See All by Felipe Mamud
ftmamud
0
31
ftmamud
0
2.1k
ftmamud
0
75
ftmamud
0
86
ftmamud
0
46
ftmamud
0
150
ftmamud
1
270
ftmamud
0
27
ftmamud
0
38
Other Decks in Programming
See All in Programming
koheisakata
0
110
ryokbt
2
290
maito1201
0
120
line_developers_tw2
0
4.4k
grapecity_dev
0
170
yotuba088
1
590
christianweyer
PRO
0
280
osyo
0
330
emmaglorypraise
0
130
martysuzuki
1
400
saten
1
180
ryosukes
0
1.4k
Featured
See All Featured
rocio
155
11k
jeffersonlam
329
15k
shpigford
369
42k
jonyablonski
19
1.2k
jcasabona
8
550
lauravandoore
10
1.5k
paulrobertlloyd
72
1.4k
marktimemedia
7
400
samlambert
237
10k
robhawkes
52
2.8k
bkeepers
321
53k
notwaldorf
15
1.8k
Transcript
Criando um endpoint de streaming DANIEL MEZZATTO @mezzatto FELIPE MAMUD
@mamud
Então vc quer criar um endpoint stream?
AGENDA Stream.of("Motivação", "Desafios", "Endpoint") .map(VivaReal::techTalk) .collect(Collectors.knowledge());
MOTIVAÇÃO • Time to first byte (TTFB) • Deep paging
DESAFIOS • Qual implementação utilizar? ◦ Java? outra linguagem? ◦
Server-Sent Events ◦ StreamingResponseBody* ◦ Custom • ES SearchScroll (com shards) • Sized stream
CONTROLLER @RequestMapping(value = "/{index}/stream", method = GET) public StreamingResponseBody stream(
FilterableApiRequest request, HttpServletResponse httpServletResponse) { httpServletResponse .setContentType("application/x-ndjson;charset=UTF-8"); return out -> searchService.stream(request, out); }
@Component public class ElasticSearchStream { public void stream(OutputStream stream) {
ResponseStream.iterate(stream, new SearchApiIterator<>(esClient, requestBuilder(), scroll -> scroll.setScroll(keepAlive) .actionGet(streamTimeout), count), searchHit -> toBytes(searchHit.getSourceRef())); } } ELASTICSEARCH STREAM
RESPONSE STREAM public static <T> void iterate(OutputStream stream, Iterator<T[]> iterator,
Function<T, byte[]> byteFn) { while (iterator.hasNext()) { for (T hit: iterator.next()) { stream.write(byteFn.apply(hit)); stream.write('\n'); } stream.flush(); } }
SEARCH ITERATOR public class SearchApiIterator<T> implements Iterator<T[]> { @Override public
boolean hasNext() { return hits() > 0 && count <= size; } @Override public T[] next() { T[] result = (T[]) response.getHits().getHits(); response = loop.apply(client.prepareSearchScroll(response.getScrollId())); this.count += hits(); return result; } }|
None