<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: rodrigopizzi</title>
    <description>The latest articles on DEV Community by rodrigopizzi (@rodrigopizzi).</description>
    <link>https://dev.to/rodrigopizzi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1036686%2F5086df2b-841a-46fe-955c-97d8c81dc158.png</url>
      <title>DEV Community: rodrigopizzi</title>
      <link>https://dev.to/rodrigopizzi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rodrigopizzi"/>
    <language>en</language>
    <item>
      <title>Token Bucket</title>
      <dc:creator>rodrigopizzi</dc:creator>
      <pubDate>Fri, 10 Mar 2023 17:02:53 +0000</pubDate>
      <link>https://dev.to/rodrigopizzi/token-bucket-no-pix-1igp</link>
      <guid>https://dev.to/rodrigopizzi/token-bucket-no-pix-1igp</guid>
      <description>&lt;h2&gt;
  
  
  O que é token bucket?
&lt;/h2&gt;

&lt;p&gt;Token bucket é um algoritmo para controlar a quantidade de transmissões de modo que não ultrapasse uma determinada capacidade. &lt;/p&gt;

&lt;p&gt;No contexto de aplicações esse algoritmo ajuda a limitar a carga que a aplicação vai receber, evitando qualquer tipo de abuso de requisições.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como ele funciona?
&lt;/h2&gt;

&lt;p&gt;A quantidade máxima de tokens que podemos usar é determina pelo seu bucket. Um bucket é como se fosse um balde cheio de fichas (tokens). Cada requisição pode consumir uma ou mais fichas, dependendo da regra de controle do fluxo. Todo bucket possui uma taxa de reposição de tokens, ou seja, a cada "x" tempo, ou quando algo acontece, o token é devolvido ao bucket permitindo assim novas requisições.&lt;/p&gt;

&lt;p&gt;Para entender melhor vamos usar o Pix do banco central como exemplo. Veja a tabela a seguir como o bacen descreveu suas regras de token bucket:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n_yseN8C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k4t5gacgufmj8vy8dvl4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n_yseN8C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k4t5gacgufmj8vy8dvl4.png" alt="Limitação de requisições PIX" width="838" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A regra para criar uma chave pix possui limitações. O bucket tem tamanho de 36k de tokens. Isso significa que é possivel fazer uso de 36k de requests para criar chaves pix. Se algum dia acontecer uma rajada de requisições o máximo possivel será de 36k e a partir dai o bucket ficará vazio, forçando a aguardar até que a taxa de reposição aconteça. Neste caso a cada minuto serão repostos 1200 tokens. Esse limite é compartilhado nas funcionalidades de criar e deletar chaves.&lt;/p&gt;

&lt;p&gt;Alem disso é possivel realizar combinações da taxa de reposição com regras de negocio de sua aplicação. Por exemplo o banco central consome mais de um token quando uma chave pix é lida e não é utilizada em seguida em algum pagamento. Isso evita abuso do consumo desse recurso pois se isso acontece o bucket fica vazio rapidamente e não é mais possivel utilizar esse recurso.&lt;/p&gt;

&lt;p&gt;Da pra imanigar muitas formas diferentes de evitar sobrecarga e abuso da API que esta sendo protegida por este método.&lt;/p&gt;

&lt;h2&gt;
  
  
  Legal, como implemento isso na minha aplicação?
&lt;/h2&gt;

&lt;p&gt;É possivel implementar o algoritmo token bucket do zero. Mas isso pode dar trabalho e desprender muito esforço. Uma boa opção é utilizar a biblioteca bucket4j.&lt;/p&gt;

&lt;p&gt;O bucket4j possui a implementação do token bucket e pode ajudar muito nesse sentido.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Token_bucket"&gt;https://en.wikipedia.org/wiki/Token_bucket&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bacen/pix-dict-api/releases/tag/1.8.0"&gt;https://github.com/bacen/pix-dict-api/releases/tag/1.8.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/bucket4j/bucket4j"&gt;https://github.com/bucket4j/bucket4j&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bucket4j.com/8.2.0/toc.html#quick-start-examples"&gt;https://bucket4j.com/8.2.0/toc.html#quick-start-examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>security</category>
      <category>kotlin</category>
      <category>java</category>
    </item>
    <item>
      <title>C4 Model + C4-PlantUML</title>
      <dc:creator>rodrigopizzi</dc:creator>
      <pubDate>Thu, 02 Mar 2023 16:59:40 +0000</pubDate>
      <link>https://dev.to/rodrigopizzi/c4-model-c4-plantuml-1i6f</link>
      <guid>https://dev.to/rodrigopizzi/c4-model-c4-plantuml-1i6f</guid>
      <description>&lt;h2&gt;
  
  
  C4 Model
&lt;/h2&gt;

&lt;p&gt;O C4 Model é uma forma de desenhar e documentar a arquitetura de um software. Ele foi criado pelo Engenheiro Simon Brown. O nome C4 deriva do modelo 4+1 que significa fazer uso de multiplas visões concorrentes, onde cada uma esta sob uma perspectiva diferente. Neste sentido temos 4 níveis: Context, Containers, Component and Code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhjo84cpxrj56j78gu6fv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhjo84cpxrj56j78gu6fv.png" alt="Exemplo dos 4 níveis do C4 Model"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Porque usar C4 Model?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ajuda a documentação da arquitetura de um software de forma clara, padronizada e eficiente&lt;/li&gt;
&lt;li&gt;Cada um dos níveis oferece visões diferentes e isso ajuda a publicos diferentes a entender o software.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  C4-PlantUML
&lt;/h2&gt;

&lt;p&gt;O C4-PlantUML é uma ferramenta que permite a criação de diagramas C4 Model usando uma linguagem de programação simples e intuitiva de código aberto e independente de plataforma. Segue um exemplo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

@startuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml
' uncomment the following line and comment the first to use locally
' !include C4_Context.puml

LAYOUT_WITH_LEGEND()

title System Context diagram for Internet Banking System

Person(customer, "Personal Banking Customer", "A customer of the bank, with personal bank accounts.")
System(banking_system, "Internet Banking System", "Allows customers to view information about their bank accounts, and make payments.")

System_Ext(mail_system, "E-mail system", "The internal Microsoft Exchange e-mail system.")
System_Ext(mainframe, "Mainframe Banking System", "Stores all of the core banking information about customers, accounts, transactions, etc.")

Rel(customer, banking_system, "Uses")
Rel_Back(customer, mail_system, "Sends e-mails to")
Rel_Neighbor(banking_system, mail_system, "Sends e-mails", "SMTP")
Rel(banking_system, mainframe, "Uses")
@enduml


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F639ucziblpy60hkjxk95.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F639ucziblpy60hkjxk95.png" alt="Diagrama gerado a partir do código anterior"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que usar o C4-PlantUml?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Os diagramas podem ser facilmente atualizados e mantidos por meio de seu código fonte, bem como versionados juntamente ao projeto&lt;/li&gt;
&lt;li&gt;Os diagramas são gerados automaticamente a partir do código e isso força a padronização e consistencia, facilitando a comunicação entre todos os envolvidos do projeto&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Na pratica
&lt;/h2&gt;

&lt;p&gt;Uma recomendação de organização para seu projeto seria adicionar na raiz do projeto o arquivo C4Context.puml. Este arquivo terá o codigo fonte do diagrama de contexto.&lt;/p&gt;

&lt;p&gt;Você pode utilizar um plugin para o IntelliJ para ajudar a criar os diagramas:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F78d2d9ww5vgkzr09pimk.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F78d2d9ww5vgkzr09pimk.gif" alt="Criando os diagramas com IntelliJ"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feito isso é so salvar a imagem final do diagrama em uma pasta em seu projeto e usando o readme.md documentar seu projeto fazendo uso do diagrama criado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O C4 Model pode ser bem util para criar um diagrama de arquitertura rico e eficiente que pode atender a diferentes publicos. Esse recurso combinado ao C4 PlantUML permite que os diagramas fiquem versionados junto ao código fonte do projeto, fazendo com que a documentação evolua da mesma maneira que o código fonte.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://c4model.com/" rel="noopener noreferrer"&gt;https://c4model.com/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/plantuml-stdlib/C4-PlantUML" rel="noopener noreferrer"&gt;https://github.com/plantuml-stdlib/C4-PlantUML&lt;/a&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>design</category>
      <category>microservices</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
