{"id":39,"date":"2026-03-19T21:59:20","date_gmt":"2026-03-20T00:59:20","guid":{"rendered":"https:\/\/tiagoiwamoto.com.br\/?p=39"},"modified":"2026-03-22T21:56:12","modified_gmt":"2026-03-23T00:56:12","slug":"%f0%9f%9a%80-apache-iggy-na-pratica","status":"publish","type":"post","link":"https:\/\/tiagoiwamoto.com.br\/?p=39","title":{"rendered":"\ud83d\ude80 Apache Iggy na pr\u00e1tica"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Uma POC com Java e Go que surpreendeu<\/h2>\n\n\n\n<p>Nos \u00faltimos dias resolvi explorar uma tecnologia que ainda n\u00e3o est\u00e1 no radar de muita gente, mas que tem um potencial enorme: o Apache Iggy.<\/p>\n\n\n\n<p>A ideia foi simples: montar uma <strong>POC pr\u00e1tica<\/strong>, usando <strong>Java (Spring Boot)<\/strong> e <strong>Go<\/strong>, simulando um cen\u00e1rio de comunica\u00e7\u00e3o ass\u00edncrona e processamento de eventos em tempo real.<\/p>\n\n\n\n<p>O objetivo? Entender se o Iggy realmente entrega valor ou se \u00e9 s\u00f3 mais uma promessa no universo de streaming.<\/p>\n\n\n\n<p>Spoiler: me surpreendeu \u2014 e bastante.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde0 O que \u00e9 o Apache Iggy?<\/h2>\n\n\n\n<p>O Apache Iggy \u00e9 uma plataforma moderna de <strong>streaming de dados e mensageria<\/strong>, com foco em:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Alta performance<\/li>\n\n\n\n<li>Baixa lat\u00eancia<\/li>\n\n\n\n<li>Simplicidade operacional<\/li>\n<\/ul>\n\n\n\n<p>Ele surge como uma alternativa mais leve em compara\u00e7\u00e3o com solu\u00e7\u00f5es tradicionais, especialmente em cen\u00e1rios onde n\u00e3o faz sentido subir uma infraestrutura complexa.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2699\ufe0f Arquitetura da POC<\/h2>\n\n\n\n<p>Na POC, montei algo bem direto ao ponto:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Producer em Java (Spring Boot)<\/strong><\/li>\n\n\n\n<li><strong>Consumer em Go<\/strong><\/li>\n\n\n\n<li>Comunica\u00e7\u00e3o via streams do Iggy<\/li>\n\n\n\n<li>Simula\u00e7\u00e3o de eventos em tempo real<\/li>\n<\/ul>\n\n\n\n<p>Fluxo b\u00e1sico:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[Java Producer] \u2192 [Apache Iggy] \u2192 [Go Consumer]<\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">\u2615 Java Producer (Spring Boot simplificado)<\/h1>\n\n\n\n<p>Aqui vou fazer um producer bem direto usando client gen\u00e9rico (mockando o client do Iggy, pois libs ainda variam).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udce6 Depend\u00eancia (exemplo gen\u00e9rico)<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">&lt;!-- Source: https:\/\/mvnrepository.com\/artifact\/org.apache.iggy\/iggy --&gt;<br>&lt;dependency&gt;<br>    &lt;groupId&gt;org.apache.iggy&lt;\/groupId&gt;<br>    &lt;artifactId&gt;iggy&lt;\/artifactId&gt;<br>    &lt;version&gt;0.7.0&lt;\/version&gt;<br>    &lt;scope&gt;compile&lt;\/scope&gt;<br>&lt;\/dependency&gt;<\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>@Configuration\npublic class IggyConfig {\n\n\n    @Value( \"${iggy.host}\")\n    private String host;\n\n    @Bean\n    public IggyTcpClient iggyClient(){\n        return IggyTcpClient.builder()\n                .host(host)\n                .port(8090)\n                .build();\n    }\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>import lombok.RequiredArgsConstructor;\nimport org.apache.iggy.client.blocking.tcp.IggyTcpClient;\nimport org.apache.iggy.identifier.StreamId;\nimport org.apache.iggy.identifier.TopicId;\nimport org.apache.iggy.message.Message;\nimport org.apache.iggy.message.Partitioning;\nimport org.apache.iggy.topic.CompressionAlgorithm;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.math.BigInteger;\nimport java.util.List;\n\nimport static java.util.Optional.empty;\n\n@RestController\n@RequestMapping(path = \"\/iggy\")\n@RequiredArgsConstructor\npublic class IwaRest {\n\n    private final IggyTcpClient iggyTcpClient;\n\n    static final String STREAM_NAME = \"iggy-sample\";\n    static final StreamId STREAM_ID = StreamId.of(STREAM_NAME);\n    static final String TOPIC_NAME = \"iggy-topic\";\n    static final TopicId TOPIC_ID = TopicId.of(TOPIC_NAME);\n\n    @PostMapping\n    public String create(@RequestBody Object message){\n\n        if(iggyTcpClient.streams().getStream(STREAM_ID).isEmpty()){\n            iggyTcpClient.streams().createStream(STREAM_NAME);\n        }\n        if(iggyTcpClient.topics().getTopic(STREAM_ID, TOPIC_ID).isEmpty()){\n            iggyTcpClient.topics().createTopic(\n                    STREAM_ID,\n                    1L,\n                    CompressionAlgorithm.None,\n                    BigInteger.ZERO,\n                    BigInteger.ZERO,\n                    empty(),\n                    TOPIC_NAME);\n        }\n        \n        Partitioning partitioning = Partitioning.partitionId(0L);\n        ObjectMapper mapper = new ObjectMapper();\n        iggyTcpClient.messages().sendMessages(\n                STREAM_ID,\n                TOPIC_ID,\n                partitioning,\n                List.of(Message.of(mapper.writeValueAsString(message))));\n        return \"OK\";\n    }\n<\/code><\/pre>\n\n\n\n<p>Veja o c\u00f3digo fonte completo em meu github<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/tiagoiwamoto\/ti-spring4-projects\/tree\/master\/07-iggy-producer\">https:\/\/github.com\/tiagoiwamoto\/ti-spring4-projects\/tree\/master\/07-iggy-producer<\/a><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udc39 Go Consumer<\/h1>\n\n\n\n<p>Agora um consumer simples em Go lendo esse evento.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udcc4 <code>consumer.go<\/code><\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">package mainimport (<br>\t\"encoding\/json\"<br>\t\"fmt\"<br>)\/\/ Estrutura do payload SWAPI<br>type Character struct {<br>\tName      string `json:\"name\"`<br>\tHeight    string `json:\"height\"`<br>\tMass      string `json:\"mass\"`<br>\tBirthYear string `json:\"birth_year\"`<br>}\/\/ Mock de client Iggy<br>type IggyClient struct{}func Connect(url string) *IggyClient {<br>\tfmt.Println(\"Conectado ao Iggy em\", url)<br>\treturn &amp;IggyClient{}<br>}func (c *IggyClient) Consume(stream string, handler func([]byte)) {<br>\tfmt.Println(\"Consumindo stream:\", stream)\t\/\/ Simulando mensagem recebida<br>\tmockMessage := []byte(`{<br>\t\t\"name\": \"Luke Skywalker\",<br>\t\t\"height\": \"172\",<br>\t\t\"mass\": \"77\",<br>\t\t\"birth_year\": \"19BBY\"<br>\t}`)\thandler(mockMessage)<br>}func main() {\tclient := Connect(\"localhost:8090\")\tclient.Consume(\"swapi-stream\", func(msg []byte) {\t\tvar character Character\t\terr := json.Unmarshal(msg, &amp;character)<br>\t\tif err != nil {<br>\t\t\tfmt.Println(\"Erro ao processar mensagem:\", err)<br>\t\t\treturn<br>\t\t}\t\tfmt.Println(\"\ud83d\udce5 Evento recebido:\")<br>\t\tfmt.Printf(\"Nome: %s\\n\", character.Name)<br>\t\tfmt.Printf(\"Altura: %s cm\\n\", character.Height)<br>\t\tfmt.Printf(\"Peso: %s kg\\n\", character.Mass)<br>\t\tfmt.Printf(\"Nascimento: %s\\n\", character.BirthYear)<br>\t})<br>}<\/pre>\n\n\n\n<p>O foco foi medir:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Lat\u00eancia<\/li>\n\n\n\n<li>Throughput<\/li>\n\n\n\n<li>Facilidade de integra\u00e7\u00e3o<\/li>\n\n\n\n<li>Complexidade operacional<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcca Resultados da POC<\/h2>\n\n\n\n<p>Aqui foi onde a coisa ficou interessante.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u26a1 Lat\u00eancia<\/h3>\n\n\n\n<p>Extremamente baixa \u2014 comunica\u00e7\u00e3o praticamente em tempo real.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\udeb6 Consumo de recursos<\/h3>\n\n\n\n<p>Muito mais leve do que o esperado. Ideal para ambientes mais restritos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83e\udde9 Simplicidade<\/h3>\n\n\n\n<p>Setup r\u00e1pido e direto. Sem aquela complexidade t\u00edpica de clusters maiores.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udc68\u200d\ud83d\udcbb Experi\u00eancia de desenvolvimento<\/h3>\n\n\n\n<p>Integra\u00e7\u00e3o fluida, especialmente combinando Java e Go.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd25 O combo Java + Go + Iggy<\/h2>\n\n\n\n<p>Essa combina\u00e7\u00e3o funcionou melhor do que eu imaginava:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u2615 Java (Spring Boot)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Robustez<\/li>\n\n\n\n<li>Ecossistema maduro<\/li>\n\n\n\n<li>Facilidade para APIs e integra\u00e7\u00e3o<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udc39 Go<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Performance<\/li>\n\n\n\n<li>Baixo consumo<\/li>\n\n\n\n<li>Simplicidade no consumo de eventos<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u26a1 Iggy<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Infraestrutura leve<\/li>\n\n\n\n<li>Streaming eficiente<\/li>\n\n\n\n<li>Baixa complexidade<\/li>\n<\/ul>\n\n\n\n<p>\ud83d\udc49 Resultado: uma stack moderna, eficiente e sem excesso de peso.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfaf Cen\u00e1rios ideais para usar o Apache Iggy<\/h2>\n\n\n\n<p>Depois da POC, esses s\u00e3o os cen\u00e1rios onde vejo maior valor:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Event-Driven Architecture (EDA) leve<\/h3>\n\n\n\n<p>Quando voc\u00ea quer trabalhar com eventos, mas sem precisar de um \u201cmonstro\u201d de infraestrutura.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Processamento em tempo real<\/h3>\n\n\n\n<p>Aplica\u00e7\u00f5es que precisam reagir r\u00e1pido, como:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Notifica\u00e7\u00f5es<\/li>\n\n\n\n<li>Monitoramento<\/li>\n\n\n\n<li>Atualiza\u00e7\u00f5es em tempo real<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3. Microsservi\u00e7os<\/h3>\n\n\n\n<p>Comunica\u00e7\u00e3o ass\u00edncrona eficiente entre servi\u00e7os, com baixa lat\u00eancia.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">4. Edge computing<\/h3>\n\n\n\n<p>Ambientes com recursos limitados, onde solu\u00e7\u00f5es mais pesadas n\u00e3o fazem sentido.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">5. Substitui\u00e7\u00e3o de brokers tradicionais (em cen\u00e1rios espec\u00edficos)<\/h3>\n\n\n\n<p>Principalmente em sistemas menores ou novos, onde voc\u00ea quer come\u00e7ar mais simples.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2696\ufe0f Quando talvez N\u00c3O usar<\/h2>\n\n\n\n<p>Nem tudo s\u00e3o flores \u2014 e isso \u00e9 importante deixar claro.<\/p>\n\n\n\n<p>O Iggy ainda n\u00e3o substitui solu\u00e7\u00f5es maduras como Apache Kafka em todos os cen\u00e1rios.<\/p>\n\n\n\n<p>Evitaria usar quando:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Voc\u00ea depende de um ecossistema muito consolidado<\/li>\n\n\n\n<li>Precisa de integra\u00e7\u00f5es enterprise espec\u00edficas<\/li>\n\n\n\n<li>Tem requisitos avan\u00e7ados de governan\u00e7a e compliance<\/li>\n\n\n\n<li>O time n\u00e3o pode assumir risco de tecnologia emergente<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udded Compara\u00e7\u00e3o r\u00e1pida com Kafka<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Aspecto<\/th><th>Apache Iggy<\/th><th>Apache Kafka<\/th><\/tr><\/thead><tbody><tr><td>Complexidade<\/td><td>Baixa<\/td><td>Alta<\/td><\/tr><tr><td>Setup<\/td><td>Simples<\/td><td>Mais complexo<\/td><\/tr><tr><td>Performance<\/td><td>Muito alta<\/td><td>Alta<\/td><\/tr><tr><td>Ecossistema<\/td><td>Em crescimento<\/td><td>Muito maduro<\/td><\/tr><tr><td>Casos ideais<\/td><td>Leves e modernos<\/td><td>Grandes ambientes<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde9 Conclus\u00e3o<\/h2>\n\n\n\n<p>O Apache Iggy n\u00e3o veio para substituir tudo.<\/p>\n\n\n\n<p>Mas ele pode ser exatamente o que faltava para muitos cen\u00e1rios modernos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Menos complexidade<\/li>\n\n\n\n<li>Mais performance<\/li>\n\n\n\n<li>Mais foco no problema e menos na infraestrutura<\/li>\n<\/ul>\n\n\n\n<p>\ud83d\udc49 Para workloads enxutos e arquiteturas modernas, ele pode simplificar MUITO.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcac Vale a pena?<\/h2>\n\n\n\n<p>Se voc\u00ea trabalha com:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Microsservi\u00e7os<\/li>\n\n\n\n<li>Event-driven<\/li>\n\n\n\n<li>Streaming<\/li>\n\n\n\n<li>Sistemas distribu\u00eddos<\/li>\n<\/ul>\n\n\n\n<p>\ud83d\udc49 Sim, vale muito a pena testar.<\/p>\n\n\n\n<p>\u00c0s vezes a melhor solu\u00e7\u00e3o n\u00e3o \u00e9 a mais conhecida \u2014 \u00e9 a que resolve o problema com menos esfor\u00e7o.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma POC com Java e Go que surpreendeu Nos \u00faltimos dias resolvi explorar uma tecnologia que ainda n\u00e3o est\u00e1 no radar de muita gente, mas que tem um potencial enorme: o Apache Iggy. A ideia foi simples: montar uma POC pr\u00e1tica, usando Java (Spring Boot) e Go, simulando um cen\u00e1rio de comunica\u00e7\u00e3o ass\u00edncrona e processamento&#8230;<\/p>\n","protected":false},"author":1,"featured_media":40,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[2],"tags":[3,8,9,6,4,5,10,7],"class_list":["post-39","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev","tag-apache-iggy","tag-arquitetura-de-software","tag-eda","tag-golang","tag-java","tag-microservices","tag-open-source","tag-streaming"],"_links":{"self":[{"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/39","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=39"}],"version-history":[{"count":5,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/39\/revisions"}],"predecessor-version":[{"id":47,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/39\/revisions\/47"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/media\/40"}],"wp:attachment":[{"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=39"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=39"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=39"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}