diff --git a/data/blog/an-introduction-to-rabbitmq.mdx b/data/blog/an-introduction-to-rabbitmq.mdx new file mode 100644 index 0000000..713468f --- /dev/null +++ b/data/blog/an-introduction-to-rabbitmq.mdx @@ -0,0 +1,92 @@ +--- +title: An introduction to RabbitMQ +date: '2023-05-16' +tags: ['#rabbitmq', '#messagebroker'] +draft: false +summary: A brief overview of RabbitMQ's main concepts +images: [] +layout: PostLayout +canonicalUrl: +--- + +## What is RabbitMQ? + +[RabbitMQ](https://www.rabbitmq.com/) is an open-source message-broker software written in Erlang. + +It's called Rabbit because it was originally developed by Rabbit Technologies Ltd. 🐇 + +- It is very reliable and used by a large number of companies +- Fast and powerful with in-memory processing +- It implements multiple communication protocols such as AMQP, MQTT, STOMP e HTTP +- It's a platform-agnostic solution + +## How does it work? + +Essentially, here are some core players in RabbitMQ. + +- **Producer** - application who sends the message +- **Consumer** - application that receives the message +- **Message** - information that is sent from a producer to a consumer +- **Exchange** - message routing agents +- **Queue** - a sequential data structure that is a medium through which messages are transferred and stored + +A **binding** is like a link you set up to bind a queue to an exchange. + +The **routing key** is a message attribute the exchange looks at when deciding how the message will be routed to queues depending on the exchange type. + +### Basic flow + +A producer sends a message to an exchange. +An exchange is responsible for routing the message to different queues with the help of header attributes, bindings, and routing keys. +The consumer can be subscribed to a queue and receive the message. + +
Producer -> Exchange -> Queue -> Consumer
+ +## Types of exchange + +- **Direct** - route messages to queues based on a routing key +- **Fanout** - route messages to all queues that are bound to it +- **Topic** - route messages to queues that match a wanted pattern +- **Header** - route messages based on header arguments + +
![Direct exchange](/static/images/posts/direct-exc-rabbitmq.png)
+ +## Queue + +The queue works in FIFO (_First In, First Out_) pattern. + +There are some important [queue properties](https://www.rabbitmq.com/queues.html#properties): + +- **Durable** - if the queue must be saved even after the broker restart (disk persistence or just in memory) +- **Autodelete** - remove the queue automatically when the consumer disconnects +- **Expiry** - defines the time that there are no messages or clients consuming and when this time is reached, the queue is deleted +- **Message TTL** - 'message time to live', if the message gets to it and it is not consumer, then it gets excluded +- **Overflow** - when the queue is so busy that is overflowing + - Drop-head - older messages are removed to receive new ones + - Reject publish - queue rejects messages + +## Reliability + +RabbitMQ has some [resources](https://www.rabbitmq.com/reliability.html) that can be configured to ensure that messages are always delivered, even encountering failures of various kinds. + +- **Consumer acknowledgment** - when the consumer confirms the message receive +- **Publish confirm** - exchange returns to the producer if it receives the message +- **Queues and durable messages** + +## RabbitMQ simulator + +There's a great simulator to understand how it works called [Try RabbitMQ](http://tryrabbitmq.com/). + +## RabbitMQ via Docker + +You can also run RabbitMQ on your own and see how these concepts work. + +To run it via Docker: + +```bash +docker run -d --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.11-management +``` + +RabbitMQ user and password is _guest_. + +You can also check more [downloading and installation options](https://www.rabbitmq.com/download.html). diff --git a/data/blog/conventional-commits.mdx b/data/blog/conventional-commits.mdx new file mode 100644 index 0000000..8bca975 --- /dev/null +++ b/data/blog/conventional-commits.mdx @@ -0,0 +1,98 @@ +--- +title: Conventional commits +date: '2023-02-10' +tags: ['#git', '#conventionalcommits'] +draft: false +summary: How your commit message can make a difference +images: [] +layout: PostLayout +canonicalUrl: +--- + +## Conventional commits, have you ever heard of it? + +As developers, we are writers. As writers, we intend to communicate through everything we write such as code, documentation and also commit messages. + +[Conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) are a standardized format for writing **commit messages**. + +By adopting conventional commits, teams can create commit messages that follow the same structure, and format, making it easier to review and understand changes made in the codebase. + +It clearly helps avoid terrible commit messages with no meaning and increases the team's communication through git commit messages. + +Conventional Commits are related to [Semantic Versioning](https://semver.org/) assisting in controlling major, minors, and patch versions. + +## How does it work? + +According to Conventional Commits, the commit message should be structured as: + +``` +[optional scope]: +[optional body] +[optional footer(s)] +``` + +The **type** is an indicator of what has changed. Some of the most famous types will be listed [below](#types-of-commits) in this post. + +The **scope** is optional and used to indicate which part of the project was changed. + +The **description** is a brief description of the change. Should be written in an imperative mood. + +The **body** is free-form and may consist of any number of newline-separated paragraphs. + +## Types of commits + +- **feat** - introduces a new feature to the codebase +- **fix** - a bug fix +- **docs** - changes to documentation +- **style** - changes that are related to white spaces, formatting, removing comments, missing semi-colons +- **refactor** - refactoring of code +- **test** - addition of tests or correcting existing ones +- **build** - changes related to the build of the application or external dependencies +- **ci** - changes made to the continuous integration configuration files and scripts + +A commit that has a footer **_BREAKING CHANGE:_**, or appends a **_!_** after the _type[scope]_ introduces a change that can break the app and it is usually associated with a new major version. + +## A few examples + +The following examples are on the Conventional Commits documentation. + +**Commit message with ! to draw attention to breaking change** + +``` +feat!: send an email to the customer when a product is shipped +``` + +**Commit message with scope** + +``` +feat(lang): add Polish language +``` + +**Commit message with multi-paragraph body and multiple footers** + +``` +fix: prevent racing of requests + +Introduce a request id and a reference to latest request. Dismiss +incoming responses other than from latest request. + +Remove timeouts which were used to mitigate the racing issue but are +obsolete now. + +Reviewed-by: Z +Refs: #123 +``` + +## VS Code extension + +The [Conventional Commits VS Code extension](https://marketplace.visualstudio.com/items?itemName=vivaxy.vscode-conventional-commits) is very helpful extension to write commits the Conventional Commits way. + +![ccVsCodeExt](https://github.com/vivaxy/vscode-conventional-commits/raw/HEAD/assets/docs/demo.gif) + +## Commitlint + +You can also set your project up with Conventional Commits using [Commitlint](https://commitlint.js.org/#/). + +Commitlint checks if your commit messages meet the Conventional Commits format. + +![commitlint](https://commitlint.js.org/assets/commitlint.svg) diff --git a/public/static/images/posts/direct-exc-rabbitmq.png b/public/static/images/posts/direct-exc-rabbitmq.png new file mode 100644 index 0000000..13dfb49 Binary files /dev/null and b/public/static/images/posts/direct-exc-rabbitmq.png differ