<?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>Forem: Altair Lage</title>
    <description>The latest articles on Forem by Altair Lage (@altairlage).</description>
    <link>https://forem.com/altairlage</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%2F3462854%2F0e9c166e-909e-40b3-8881-cf96fa18e64e.png</url>
      <title>Forem: Altair Lage</title>
      <link>https://forem.com/altairlage</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/altairlage"/>
    <language>en</language>
    <item>
      <title>Essential Linux Commands Map</title>
      <dc:creator>Altair Lage</dc:creator>
      <pubDate>Wed, 15 Apr 2026 13:12:52 +0000</pubDate>
      <link>https://forem.com/altairlage/essential-linux-commands-map-2c72</link>
      <guid>https://forem.com/altairlage/essential-linux-commands-map-2c72</guid>
      <description>&lt;h1&gt;
  
  
  Essential Linux Commands Map
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fewyxowp0g2fow7mk62vz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fewyxowp0g2fow7mk62vz.png" alt=" " width="800" height="1021"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the evolution of operational systems visual environments, the majority of users don't ever need to use the command terminal for their daily activities. Most users do not execute any advanced system tasks, and when they do it, the configuration apps are more than enough. You probably know some Windows users that never opened the "black screen" for anything.&lt;br&gt;
The same happens with Linux. It evolved its visual environments, also known as Desktop environments (DEs), to a point that the terminal is not necessary for almost 100% of an average user needs. The most popular choices, GNOME, KDE, and XFCE, allow system configurations and troubleshooting from the UI. But when you need advanced troubleshooting and system administration, the terminal is always your best friend.&lt;/p&gt;

&lt;p&gt;You may feel intimidated the first time you open a Linux terminal. That black screen with thousands of commands, many options, and sometimes, many ways to do the same thing. Beginners often feel lost, and even experienced users sometimes fall back on the same small set of commands every day.&lt;/p&gt;

&lt;p&gt;That's why a visual command map like the main image of this article is useful. It is superficial, but focuses on the commands people use most often in real life. The main image organizes the commands into functional groups to make it easier to understand the kind of tasks they solve. Further in this article, all the groups and commands are explained briefly for reference.&lt;/p&gt;

&lt;p&gt;In practice, most terminal work is the same you perform on a UI. You move through folders, inspect files, edit content, check running processes, review system details, manage users, troubleshoot networks, and install software. Once you understand that terminal and a visual interfaces are only faces of the same coin, Linux terminal feels more practical and less overwhelming.&lt;/p&gt;

&lt;p&gt;A list of commands is not a good way to learn something. People remember things better when they make associations with other things, happenings or feelings. Grouping it by purpose works better because you create associations, for an example, "I have no internet connection" relates to networking, which can relate to IP misconfiguration, so maybe &lt;code&gt;ipconfig&lt;/code&gt; command may help to diagnose the issue. That is what makes the presented map helpful. It gives structure to the learning process.&lt;/p&gt;

&lt;p&gt;Instead of thinking, “I need to memorize all Linux commands”, you can think “I need these few commands for files, a few for processes, and a few for networking”.&lt;br&gt;
It reflects real life. Most users do not need hundreds of commands every day. They need a small set they can use with confidence for the day-by-day tasks, the same way most users don't need to know and perform multiple advanced tasks via the UI. Once that core is familiar, learning more advanced tools becomes much easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  File and Directory Management
&lt;/h2&gt;

&lt;p&gt;These commands allow you move/browse around the filesystem and manage files and folders.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ls&lt;/code&gt; - List files and directories in the current location.

&lt;ul&gt;
&lt;li&gt;Example: &lt;code&gt;ls -la&lt;/code&gt;: Lists all files (including hidden ones) in long format, showing permissions, owner, size, and modification date.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;pwd&lt;/code&gt; - Show the full path of the current working directory.

&lt;ul&gt;
&lt;li&gt;Example output: &lt;code&gt;# /home/myuser/projects/my-app&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Useful when you've navigated deep into a directory tree and need to confirm where you are.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;cd&lt;/code&gt; - Change, or moves, from one directory to another.

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cd /var/log&lt;/code&gt;                              # Move to an absolute path&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cd ..&lt;/code&gt;                                    # Move one level up&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cd ~&lt;/code&gt;                                     # Move to the current user home directory&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;mkdir&lt;/code&gt; - Create a new directory.

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mkdir my-folder&lt;/code&gt;                          # Create the "my-folder" folder in current directory&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mkdir -p parent/child/grandchild&lt;/code&gt;         # Create nested directories in one go

&lt;ul&gt;
&lt;li&gt;The -p flag creates intermediate directories as needed, so you don't have to create each level manually.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;rmdir&lt;/code&gt; - Remove an empty directory.

&lt;ul&gt;
&lt;li&gt;Example: &lt;code&gt;rmdir old-folder&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;This only works if the directory is completely empty. If it contains files, you'll need &lt;code&gt;rm -r&lt;/code&gt; instead.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;touch&lt;/code&gt; - Create an empty file or updates a file timestamp.

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;touch notes.txt&lt;/code&gt;                          # Create a new empty file&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;touch existing-file.log&lt;/code&gt;                  # Update the modification timestamp to now&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;cp&lt;/code&gt; - Copie files or directories.

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cp report.txt report-backup.txt&lt;/code&gt;          # Copy the &lt;code&gt;report.txt&lt;/code&gt; file and name it to &lt;code&gt;report-backup.txt&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cp -r src/ src-backup/&lt;/code&gt;                   # Copy the &lt;code&gt;src&lt;/code&gt; directory recursively&lt;/li&gt;
&lt;li&gt;The -r (recursive) flag is required when copying directories, otherwise cp will skip them.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;mv&lt;/code&gt; - Move or renames files and directories.

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mv old-name.txt new-name.txt&lt;/code&gt;             # Rename a file&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mv file.txt ~/Documents/&lt;/code&gt;                 # Move a file to another directory&lt;/li&gt;
&lt;li&gt;Unlike &lt;code&gt;cp&lt;/code&gt;, &lt;code&gt;mv&lt;/code&gt; works on directories without needing any extra flags.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;rm&lt;/code&gt; - Remove files or directories.

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rm unwanted-file.txt&lt;/code&gt;                     # Remove the file&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rm -r old-project/&lt;/code&gt;                       # Remove a directory and everything inside it&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rm -ri important-folder/&lt;/code&gt;                 # Remove recursively but ask for confirmation on each file&lt;/li&gt;
&lt;li&gt;Be careful with &lt;code&gt;rm -r&lt;/code&gt; there is no trash can in the terminal. Once removed, files are gone for good.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;These are often the first commands people learn, and for good reason. They are the foundation of daily terminal use. If you think about it, this is also the most frequent actions you perform in a visual interface, like Windows.&lt;/p&gt;

&lt;h2&gt;
  
  
  File Viewing and Editing
&lt;/h2&gt;

&lt;p&gt;Once you find a file, the next step is usually to read or edit it. These commands handle these actions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;cat&lt;/code&gt; - Print file content directly in the terminal.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cat server.log&lt;/code&gt;                          # Display the entire file in the terminal&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cat -n server.log&lt;/code&gt;                       # Display with line numbers&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cat file1.txt file2.txt &amp;gt; combined.txt&lt;/code&gt;  # Concatenate two files into a new one&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;less&lt;/code&gt; - Open a file for scrolling and reading page by page.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;less /var/log/syslog&lt;/code&gt;                    # Open a log file for browsing (use q to quit)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;less -N app.log&lt;/code&gt;                         # Open with line numbers shown&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dmesg | less&lt;/code&gt;                            # Pipe command output into less for easy scrolling&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;more&lt;/code&gt; - Display file content one screen at a time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;more readme.txt&lt;/code&gt;                         # View the file one screenful at a time&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;more -10 config.yaml&lt;/code&gt;                    # Display 10 lines at a time&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ls -la /etc | more&lt;/code&gt;                      # Pipe a long directory listing through more&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;nano&lt;/code&gt; - A simple terminal-based text editor.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nano notes.txt&lt;/code&gt;                          # Open (or create) a file for editing&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nano +15 script.sh&lt;/code&gt;                      # Open a file and jump directly to line 15&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nano -B /etc/hosts&lt;/code&gt;                      # Open a file and automatically create a backup before editing&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;vim&lt;/code&gt; - A powerful terminal-based text editor with advanced features.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vim deploy.sh&lt;/code&gt;                           # Open a file for editing (press i to enter insert mode, Esc then :wq to save and quit)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vim +42 main.py&lt;/code&gt;                         # Open a file and jump to line 42&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;vim -d file-v1.txt file-v2.txt&lt;/code&gt;          # Open two files side by side in diff mode&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;gedit&lt;/code&gt; - A graphical text editor often found on desktop Linux systems.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gedit todo.txt&lt;/code&gt;                          # Open a file in the graphical editor&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gedit +25 app.conf&lt;/code&gt;                      # Open a file and place the cursor on line 25&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gedit file1.txt file2.txt&lt;/code&gt;               # Open multiple files in separate tabs&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;This group is useful for everything from reading logs to editing config files.&lt;/p&gt;

&lt;h2&gt;
  
  
  Process Management
&lt;/h2&gt;

&lt;p&gt;Linux is always running processes in the background and foreground. These commands help you inspect and control them. It is similar to the Windows Task Manager, but in text mode.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ps&lt;/code&gt; - Show a snapshot of running processes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ps aux&lt;/code&gt;                         # List all running processes with detailed info&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ps -ef | grep nginx&lt;/code&gt;            # Find all processes related to nginx&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ps -u jdoe&lt;/code&gt;                     # Show all processes owned by user jdoe&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;top&lt;/code&gt; - Display live system activity and active processes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;top&lt;/code&gt;                            # Launch the interactive process viewer&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;top -u www-data&lt;/code&gt;                # Show only processes owned by the www-data user&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;top -p 1234,5678&lt;/code&gt;              # Monitor only specific PIDs&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;kill&lt;/code&gt; - Send a signal to stop or control a process by PID.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kill 1234&lt;/code&gt;                      # Gracefully terminate process with PID 1234 (sends SIGTERM)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kill -9 1234&lt;/code&gt;                   # Force-kill a stubborn process (sends SIGKILL)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kill -STOP 1234&lt;/code&gt;               # Pause a running process without ending it&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;killall&lt;/code&gt; - Stop processes by name.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;killall firefox&lt;/code&gt;                # Terminate all Firefox processes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;killall -9 node&lt;/code&gt;               # Force-kill all Node.js processes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;killall -u jdoe python&lt;/code&gt;        # Kill all Python processes owned by user jdoe&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;pstree&lt;/code&gt; - Display processes in a tree structure.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pstree&lt;/code&gt;                         # Show all processes as a tree from init/systemd&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pstree -p&lt;/code&gt;                      # Show the tree with PIDs next to each process&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pstree -u jdoe&lt;/code&gt;                # Show the process tree for a specific user&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;htop&lt;/code&gt; - An interactive process viewer with a cleaner interface than &lt;code&gt;top&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;htop&lt;/code&gt;                           # Launch the interactive viewer with color-coded output&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;htop -u www-data&lt;/code&gt;              # Filter to show only a specific user's processes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;htop -p 1234,5678&lt;/code&gt;            # Monitor only specific PIDs in the interactive viewer&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;When a system is slow or an app freezes, this is usually where you start troubleshooting.&lt;/p&gt;

&lt;h2&gt;
  
  
  System Information
&lt;/h2&gt;

&lt;p&gt;These commands help you learn more about the machine itself, including hardware, storage, and memory usage.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;uname&lt;/code&gt; - Show basic system information such as kernel and OS name and version.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;uname -a&lt;/code&gt;                       # Display all system info (kernel, hostname, architecture, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;uname -r&lt;/code&gt;                       # Show only the kernel release version&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;uname -m&lt;/code&gt;                       # Print the machine hardware architecture (e.g., x86_64)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;df&lt;/code&gt; - Report disk space usage by filesystem.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;df -h&lt;/code&gt;                          # Show disk usage in human-readable format (GB, MB)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;df -h /home&lt;/code&gt;                    # Check available space on the /home partition&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;df -T&lt;/code&gt;                          # Include the filesystem type in the output (ext4, xfs, etc.)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;du&lt;/code&gt; - Estimate disk usage for files and directories.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;du -sh /var/log&lt;/code&gt;                # Show total size of the /var/log directory in human-readable format&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;du -h --max-depth=1 /home&lt;/code&gt;     # Show sizes of immediate subdirectories under /home&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;du -ah /tmp | sort -rh | head -10&lt;/code&gt;  # Find the 10 largest files and folders in /tmp&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;free&lt;/code&gt; - Display memory and swap usage.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;free -h&lt;/code&gt;                        # Show RAM and swap usage in human-readable format&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;free -m&lt;/code&gt;                        # Display memory values in megabytes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;free -h -s 5&lt;/code&gt;                  # Refresh memory stats every 5 seconds&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;lscpu&lt;/code&gt; - Show CPU architecture details.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lscpu&lt;/code&gt;                          # Display full CPU info (cores, threads, model, cache, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lscpu | grep "Model name"&lt;/code&gt;     # Show only the CPU model name&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lscpu | grep "CPU(s)"&lt;/code&gt;         # Check the total number of CPUs/cores available&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;lshw&lt;/code&gt; - List detailed hardware information.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo lshw -short&lt;/code&gt;              # Show a compact summary of all hardware components&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo lshw -class network&lt;/code&gt;      # Display only network adapter details&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo lshw -class memory&lt;/code&gt;       # Show RAM module details (size, speed, slots)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;lsblk&lt;/code&gt; - Display block devices such as disks and partitions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lsblk&lt;/code&gt;                          # List all block devices in a tree view&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lsblk -f&lt;/code&gt;                       # Include filesystem type and UUIDs in the output&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lsblk -o NAME,SIZE,TYPE,MOUNTPOINT&lt;/code&gt;  # Show only specific columns for a cleaner view&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;This category is especially helpful for troubleshooting and performance checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  User and Group Management
&lt;/h2&gt;

&lt;p&gt;Linux is built around users, groups, and permissions. These commands support account administration.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;passwd&lt;/code&gt; - Changes a user password.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;passwd&lt;/code&gt;                         # Change the password for the currently logged-in user&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo passwd jdoe&lt;/code&gt;              # Reset the password for user jdoe (requires root)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;passwd -e jdoe&lt;/code&gt;                # Force user jdoe to change password on next login&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;useradd&lt;/code&gt; - Creates a new user account.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo useradd jdoe&lt;/code&gt;             # Create a new user with default settings&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo useradd -m -s /bin/bash jdoe&lt;/code&gt;  # Create a user with a home directory and bash shell&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo useradd -G developers,docker jdoe&lt;/code&gt;  # Create a user and add them to multiple groups&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;userdel&lt;/code&gt; - Deletes a user account.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo userdel jdoe&lt;/code&gt;             # Remove the user account but keep the home directory&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo userdel -r jdoe&lt;/code&gt;          # Remove the user and delete their home directory&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo userdel -f jdoe&lt;/code&gt;          # Force removal even if the user is currently logged in&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;usermod&lt;/code&gt; - Modifies an existing user account.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo usermod -aG docker jdoe&lt;/code&gt;  # Add user jdoe to the docker group without removing other groups&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo usermod -s /bin/zsh jdoe&lt;/code&gt; # Change the default shell for user jdoe&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo usermod -l jsmith jdoe&lt;/code&gt;   # Rename the user account from jdoe to jsmith&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;groupadd&lt;/code&gt; - Creates a new group.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo groupadd developers&lt;/code&gt;      # Create a new group called developers&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo groupadd -g 1500 devops&lt;/code&gt;  # Create a group with a specific GID&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo groupadd --system appusers&lt;/code&gt;  # Create a system group for service accounts&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;groupdel&lt;/code&gt; - Deletes a group.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo groupdel developers&lt;/code&gt;      # Remove the developers group&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo groupdel old-team&lt;/code&gt;        # Delete a group that is no longer needed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo groupdel temp-project&lt;/code&gt;    # Clean up a temporary project group&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;groups&lt;/code&gt; - Shows the groups a user belongs to.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;groups&lt;/code&gt;                         # Show the groups for the currently logged-in user&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;groups jdoe&lt;/code&gt;                   # List all groups that user jdoe belongs to&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;groups root&lt;/code&gt;                   # Check which groups the root user is a member of&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;id&lt;/code&gt; - Displays user ID, group ID, and related group information.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt;                             # Show UID, GID, and groups for the current user&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;id jdoe&lt;/code&gt;                       # Display the full identity info for user jdoe&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;id -gn jdoe&lt;/code&gt;                   # Print only the primary group name of user jdoe&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Specially if you manage shared systems or servers, you will use these commands very often.&lt;/p&gt;

&lt;h2&gt;
  
  
  Network Configuration and Monitoring
&lt;/h2&gt;

&lt;p&gt;Networking is a big part of Linux administration. These commands help you inspect connections and test communication.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ifconfig&lt;/code&gt; - Displays or configures network interfaces on older systems.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ifconfig&lt;/code&gt;                       # Show all active network interfaces and their IPs&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ifconfig eth0&lt;/code&gt;                  # Display details for a specific interface&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo ifconfig eth0 down&lt;/code&gt;       # Disable the eth0 network interface&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;ip&lt;/code&gt; - Modern command for viewing and managing network interfaces, routes, and addresses.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ip addr show&lt;/code&gt;                   # List all interfaces with their IP addresses&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ip route show&lt;/code&gt;                  # Display the routing table&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ip link set eth0 up&lt;/code&gt;           # Bring the eth0 interface up&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;ping&lt;/code&gt; - Test the connectivity to another host.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ping google.com&lt;/code&gt;                # Continuously ping Google to check internet connectivity&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ping -c 4 192.168.1.1&lt;/code&gt;        # Send exactly 4 ping packets to a host&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ping -i 2 server.local&lt;/code&gt;       # Ping every 2 seconds instead of the default 1 second&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;netstat&lt;/code&gt; - Show network connections, routing tables, and interface stats.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;netstat -tulnp&lt;/code&gt;                 # Show all listening TCP/UDP ports with process names&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;netstat -an | grep :80&lt;/code&gt;        # Check if anything is listening on port 80&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;netstat -r&lt;/code&gt;                     # Display the kernel routing table&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;ss&lt;/code&gt; - Display socket and network connection information, often faster than &lt;code&gt;netstat&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ss -tulnp&lt;/code&gt;                      # List all listening ports with associated processes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ss -s&lt;/code&gt;                          # Show a summary of socket statistics&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ss -t state established&lt;/code&gt;       # Display only established TCP connections&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;traceroute&lt;/code&gt; - Show the path packets take to reach a destination.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;traceroute google.com&lt;/code&gt;          # Trace the route to Google showing each hop&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;traceroute -n 8.8.8.8&lt;/code&gt;        # Trace without resolving hostnames (faster output)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;traceroute -m 15 example.com&lt;/code&gt;  # Set a maximum of 15 hops&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;ssh&lt;/code&gt; - Connect securely to a remote machine.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ssh jdoe@192.168.1.50&lt;/code&gt;        # Connect to a remote host as user jdoe&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ssh -p 2222 jdoe@server.com&lt;/code&gt;  # Connect using a non-default SSH port&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ssh -i ~/.ssh/mykey.pem ec2-user@10.0.0.5&lt;/code&gt;  # Connect using a specific private key&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;nc&lt;/code&gt; - Netcat, a flexible tool for testing ports, sending data, and debugging network services.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nc -zv server.com 443&lt;/code&gt;         # Test if port 443 is open on a remote host&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nc -l 8080&lt;/code&gt;                    # Listen for incoming connections on port 8080&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nc -zv 192.168.1.10 20-100&lt;/code&gt;   # Scan a range of ports on a host&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;This is the part of Linux that becomes essential the moment something stops connecting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Package Management
&lt;/h2&gt;

&lt;p&gt;Linux distributions use package managers to install, update, and remove software. The exact tool depends on the distro.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;apt-get&lt;/code&gt; - Package management tool used on Debian-based systems.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo apt-get update&lt;/code&gt;            # Refresh the list of available packages&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo apt-get install nginx&lt;/code&gt;    # Install the nginx web server&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo apt-get remove --purge nginx&lt;/code&gt;  # Remove nginx and its configuration files&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;apt&lt;/code&gt; - A more user-friendly package command for Debian-based systems.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade&lt;/code&gt;  # Update package list and upgrade all packages&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo apt install git curl wget&lt;/code&gt; # Install multiple packages at once&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;apt search image editor&lt;/code&gt;       # Search for packages related to image editing&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;yum&lt;/code&gt; - Older package manager for RPM-based distributions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo yum install httpd&lt;/code&gt;         # Install the Apache web server&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo yum update&lt;/code&gt;               # Update all installed packages&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;yum list installed&lt;/code&gt;            # Show all currently installed packages&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;dnf&lt;/code&gt; - Modern package manager used in newer RPM-based distributions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo dnf install nodejs&lt;/code&gt;        # Install Node.js&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo dnf upgrade --refresh&lt;/code&gt;    # Refresh metadata and upgrade all packages&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dnf search python3&lt;/code&gt;            # Search for packages matching python3&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;rpm&lt;/code&gt; - Low-level tool for managing RPM packages directly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo rpm -ivh package.rpm&lt;/code&gt;      # Install a local RPM package file&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rpm -qa | grep java&lt;/code&gt;           # List all installed packages containing "java"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rpm -qi nginx&lt;/code&gt;                 # Show detailed info about an installed package&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;dpkg&lt;/code&gt; - Low-level tool for managing Debian packages directly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo dpkg -i package.deb&lt;/code&gt;       # Install a local .deb package file&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dpkg -l | grep python&lt;/code&gt;         # List installed packages matching "python"&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dpkg -L nginx&lt;/code&gt;                 # Show all files installed by the nginx package&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;snap&lt;/code&gt; - Installs and manages snap packages across supported distributions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo snap install code --classic&lt;/code&gt;  # Install VS Code as a snap package&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;snap list&lt;/code&gt;                      # Show all installed snap packages&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo snap refresh&lt;/code&gt;             # Update all installed snaps to their latest versions&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;code&gt;zypper&lt;/code&gt; - Package manager used on openSUSE and SUSE systems.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Examples:&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo zypper install git&lt;/code&gt;        # Install git on an openSUSE system&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sudo zypper refresh&lt;/code&gt;           # Refresh all configured repositories&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;zypper search docker&lt;/code&gt;          # Search for packages related to docker&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Not every Linux system uses all of these, but knowing the distro family you use will help you to know which commands to use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start Learning
&lt;/h2&gt;

&lt;p&gt;Start learning the commands in small groups:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start with navigation: &lt;code&gt;pwd&lt;/code&gt;, &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;cd&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Then learn file handling: &lt;code&gt;touch&lt;/code&gt;, &lt;code&gt;cp&lt;/code&gt;, &lt;code&gt;mv&lt;/code&gt;, &lt;code&gt;rm&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Add file reading and editing: &lt;code&gt;cat&lt;/code&gt;, &lt;code&gt;less&lt;/code&gt;, &lt;code&gt;nano&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Move into process and system checks: &lt;code&gt;ps&lt;/code&gt;, &lt;code&gt;top&lt;/code&gt;, &lt;code&gt;df&lt;/code&gt;, &lt;code&gt;free&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Finish with network basics: &lt;code&gt;ip&lt;/code&gt;, &lt;code&gt;ping&lt;/code&gt;, &lt;code&gt;ssh&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Th-Th-That's all, folks!
&lt;/h2&gt;

&lt;p&gt;Linux becomes much easier once you stop seeing it as a wall of commands and start seeing it as a set of tools for clear tasks. This map is a good reminder that the terminal is not about complexity for the sake of complexity. It is about control, speed, and understanding what your system is doing.&lt;/p&gt;

&lt;p&gt;You do not need to master every command today. Learn the ones that solve the problems in front of you. Use them often. Repeat them in real situations. That is how confidence grows.&lt;/p&gt;

&lt;p&gt;And after a while, the terminal stops feeling technical and starts feeling natural.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>softwaredevelopment</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Apache Kafka tutorial – What is Apache Kafka?</title>
      <dc:creator>Altair Lage</dc:creator>
      <pubDate>Tue, 14 Apr 2026 22:18:13 +0000</pubDate>
      <link>https://forem.com/altairlage/apache-kafka-tutorial-what-is-apache-kafka-4edl</link>
      <guid>https://forem.com/altairlage/apache-kafka-tutorial-what-is-apache-kafka-4edl</guid>
      <description>&lt;p&gt;Apache Kafka is an open-source distributed event streaming platform used by thousands of companies to publish, store, and process streams of records in real time. It was originally developed by LinkedIn before moving into the open-source world in early 2011. It was built because LinkedIn needed a better way to handle massive amounts of data to track site events, like page views and user clicks, and to gather all their log data in one place.&lt;/p&gt;

&lt;p&gt;Kafka is designed for distributed high throughput systems. Kafka tends to work very well as a replacement for a more traditional message broker. In comparison to other messaging systems, Kafka has better throughput, built-in partitioning, replication and inherent fault-tolerance, which makes it a good fit for large-scale message processing applications.&lt;br&gt;
In this tutorial, we are going to dive into what Kafka actually is and walk through the most common definitions you'll run into when working with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is using Kafka?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Twitter&lt;/strong&gt; uses Kafka to power its mobile application performance management and analytics platform. In 2015, this system was already handling around five billion sessions per day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Netflix&lt;/strong&gt; relies on Kafka as the messaging backbone for its Keystone pipeline, a unified platform for publishing, collecting, and routing events across both batch and stream processing. As of 2016, Keystone included more than 4,000 brokers running entirely in the cloud, handling over 700 billion events every single day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tumblr&lt;/strong&gt; uses Kafka as a core part of its event processing pipeline. In 2012, it was already capturing up to 500 million page views per day through this system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Square&lt;/strong&gt; uses Kafka as its central data bus. It supports stream processing, website activity tracking, metrics collection, monitoring, log aggregation, real-time analytics, and complex event processing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pinterest&lt;/strong&gt; runs Kafka as part of its real-time advertising platform. The system includes over 100 clusters and more than 2,000 brokers deployed on AWS. It processes more than 800 billion events per day, with peaks reaching up to 15 million events per second.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uber&lt;/strong&gt; is one of the most well-known Kafka adopters. The company processes over a trillion events per day using Kafka, mainly for data ingestion, event stream processing, database changelogs, log aggregation, and general-purpose publish-subscribe messaging.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Kafka architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fnitnqcq9nxo73g5953q7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fnitnqcq9nxo73g5953q7.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kafka is a publish/subscribe system built around event data. It involves four main actors: producers, consumers, brokers, and ZooKeeper nodes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Broker nodes&lt;/strong&gt;: These handle most of the I/O work and are responsible for durable data storage within the cluster. A Kafka broker receives messages from producers and writes them to disk, organizing them by partition and indexing them with a unique &lt;strong&gt;offset&lt;/strong&gt;. Consumers can then fetch messages by topic, partition, and offset. Brokers also work together to form a Kafka cluster, sharing information either directly or indirectly through ZooKeeper.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ZooKeeper nodes&lt;/strong&gt;: Kafka relies on ZooKeeper to manage the overall state of the cluster. It keeps track of broker health, maintains metadata about topics, and helps coordinate cluster operations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Producers&lt;/strong&gt;: Producers are responsible for sending messages to Kafka brokers, typically organized by topic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consumers&lt;/strong&gt;: Consumers are client applications that read messages from Kafka topics.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the diagram above, a topic is divided into three partitions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Partition 1 contains two offsets: 0 and 1
&lt;/li&gt;
&lt;li&gt;Partition 2 contains four offsets: 0, 1, 2, and 3
&lt;/li&gt;
&lt;li&gt;Partition 3 contains a single offset: 0
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A &lt;strong&gt;replica&lt;/strong&gt; is simply a copy of a partition, including the same data, offsets, and partition ID.&lt;/p&gt;

&lt;p&gt;Now, consider a scenario where the &lt;strong&gt;replication factor&lt;/strong&gt; is set to 3. Kafka will create three identical copies of each partition and distribute them across the cluster to ensure availability and fault tolerance. In the example shown, the replication factor is 1, meaning each partition has only one copy.&lt;/p&gt;

&lt;p&gt;To balance load across the cluster, partitions are distributed among brokers, and each broker can store one or more partitions. At the same time, multiple producers and consumers can publish and read messages concurrently, making Kafka highly scalable and efficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kafka component concepts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Broker nodes
&lt;/h3&gt;

&lt;p&gt;A broker acts as the middle layer between producers and consumers, helping move data across the system. It stores messages in partitions and ensures that data is safely persisted for a configurable amount of time. This design also helps Kafka handle failure scenarios without losing data.&lt;/p&gt;

&lt;p&gt;In Kafka, a broker is a key unit of scalability. By increasing the number of brokers in a cluster, you can improve I/O throughput, availability, and overall durability. Brokers also coordinate with each other and communicate with ZooKeeper to maintain cluster state and consistency.&lt;/p&gt;

&lt;p&gt;In most setups, each server runs a single broker. While it is technically possible to run multiple brokers on the same server, this is generally not recommended in production environments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Topic
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;Kafka Topic&lt;/strong&gt; is where messages sent by producers are stored. Topics are split into &lt;strong&gt;partitions&lt;/strong&gt;, and each topic has at least one partition. Each partition contains messages in an immutable and ordered sequence. Once a message is written, it cannot be changed. A partition is internally implemented as a set of segment files of equal sizes. So we can imagine a topic as a logical aggregation of partitions. By splitting a topic into multiple partitions, Kafka can process data in parallel, which improves performance and scalability.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fa0ij2as3pxdggo8ourq8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fa0ij2as3pxdggo8ourq8.png" alt=" " width="800" height="891"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When a producer publish a record, the producer automatically select a partition based on the record’s key. A producer will digest the byte content of the key using a hash function (Kafka uses murmur2 for this purpose). &lt;/p&gt;

&lt;p&gt;The process works like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The key is hashed using murmur2.&lt;/li&gt;
&lt;li&gt;The highest-order bit is masked to ensure the result is a positive integer.&lt;/li&gt;
&lt;li&gt;The final partition number value is calculated using modulo with the number of partitions.
This process determines the target partition for the record.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a result, records with the same key will always be routed to the same partition, ensuring ordering for that key. However, if the number of partitions changes, the hash result will also change. This means Kafka may assign the same key to a different partition after the change.&lt;/p&gt;

&lt;p&gt;The topic structure, contents, and how producers interact with partitions are depicted below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F5nvr11dywkok9k8z1nw1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F5nvr11dywkok9k8z1nw1.png" alt=" " width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the nature of hashing: Records with different hashes may still end up in the same partition due to hash collisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Consumer groups and load balancing
&lt;/h2&gt;

&lt;p&gt;Kafka’s producer-topic-consumer topology adheres to a flexible and highly scalable model. A multipoint-to-multipoint model, which means multiple producers and multiple consumers can interact with the same topic at the same time.&lt;/p&gt;

&lt;p&gt;A consumer is a process (or thread) that attaches to a Kafka cluster using a client library. When multiple consumers subscribe to a topic and belong to the same &lt;strong&gt;consumer group&lt;/strong&gt;, Kafka distributes the partitions among the consumer in the group. Each consumer reads from a different subset of partitions in the topic.&lt;/p&gt;

&lt;p&gt;Let’s walk through an example.&lt;/p&gt;

&lt;p&gt;Suppose we have a topic called &lt;strong&gt;T1&lt;/strong&gt; with four partitions. If we create a single consumer &lt;strong&gt;C1&lt;/strong&gt; in group &lt;strong&gt;G1&lt;/strong&gt; and subscribe it to topic &lt;strong&gt;T1&lt;/strong&gt;, then &lt;strong&gt;C1&lt;/strong&gt; will receive messages from all four partitions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fqtu6flnt88it9eki6ygs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fqtu6flnt88it9eki6ygs.png" alt=" " width="800" height="579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But, if we add a second consumer &lt;strong&gt;C2&lt;/strong&gt; to the same group &lt;strong&gt;G1&lt;/strong&gt;, Kafka will rebalance the partitions. Each consumer will now read from two partitions. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;C1 reads from partitions 0 and 2
&lt;/li&gt;
&lt;li&gt;C2 reads from partitions 1 and 3
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fd3ell2mwq95suda6rrve.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fd3ell2mwq95suda6rrve.png" alt=" " width="800" height="579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we keep adding more consumers to the same group &lt;strong&gt;G1&lt;/strong&gt;, and the number of consumers exceeds the number of partitions, some consumers will remain idle. This happens because Kafka guarantees that &lt;strong&gt;each partition is assigned to only one consumer within a group&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fuqo9qr4zpqmmeglg4hva.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fuqo9qr4zpqmmeglg4hva.png" alt=" " width="800" height="669"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, if a new consumer group &lt;strong&gt;G2&lt;/strong&gt; is introduced, with a single consumer. This consumer will receive &lt;strong&gt;all&lt;/strong&gt; messages from topic &lt;strong&gt;T1&lt;/strong&gt;, completely independent of what group &lt;strong&gt;G1&lt;/strong&gt; is doing.&lt;/p&gt;

&lt;p&gt;If &lt;strong&gt;G2&lt;/strong&gt; has multiple consumers, Kafka will again split the partitions among them, just like it does for &lt;strong&gt;G1&lt;/strong&gt;. However, the key point is that &lt;strong&gt;each consumer group receives the full stream of messages&lt;/strong&gt;, regardless of other groups.&lt;/p&gt;

&lt;p&gt;This works because of how Kafka manages offsets:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Offsets are managed by consumers, but they are stored in a special Kafka topic called &lt;code&gt;__consumer_offsets&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Offsets are tracked per &lt;strong&gt;(consumer group, topic, partition)&lt;/strong&gt; combination.
&lt;/li&gt;
&lt;li&gt;This combination is used as the key when storing offsets, which allows Kafka to:

&lt;ul&gt;
&lt;li&gt;Keep offsets organized in the same partition of the &lt;code&gt;__consumer_offsets&lt;/code&gt; topic.&lt;/li&gt;
&lt;li&gt;Use log compaction to remove outdated offset records.&lt;/li&gt;
&lt;li&gt;Efficiently manage progress tracking for each consumer group.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By default, the &lt;code&gt;__consumer_offsets&lt;/code&gt; topic is configured with 50 partitions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F47jduc3hu02lw6xq8uvz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F47jduc3hu02lw6xq8uvz.png" alt=" " width="800" height="835"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Th-th-that's all, folks!
&lt;/h2&gt;

&lt;p&gt;Apache Kafka is much more than just a messaging system. It is a distributed event streaming platform designed to handle large-scale data with high throughput, reliability, and scalability.&lt;/p&gt;

&lt;p&gt;The key takeaway is simple: Kafka is built for &lt;strong&gt;movement, durability, and scalability of data&lt;/strong&gt;. Once you understand these core concepts, everything else, from stream processing to real-time analytics, becomes much easier to reason about.&lt;/p&gt;

&lt;p&gt;If you're starting with Kafka, these fundamentals are the base for everything you will build on top of it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>kafka</category>
      <category>eventdriven</category>
    </item>
    <item>
      <title>Essential AWS services every engineer should know</title>
      <dc:creator>Altair Lage</dc:creator>
      <pubDate>Mon, 13 Apr 2026 19:48:38 +0000</pubDate>
      <link>https://forem.com/altairlage/essential-aws-services-every-engineer-should-know-1p5j</link>
      <guid>https://forem.com/altairlage/essential-aws-services-every-engineer-should-know-1p5j</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.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%2Fwiuuy96haflhecmq6xh3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fwiuuy96haflhecmq6xh3.png" alt=" " width="800" height="913"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When we start learning AWS, the number of services feels overwhelming. But we don't need to learn everything at once. A strong foundation usually starts with a few key groups, like &lt;strong&gt;compute, storage, databases, networking, security, monitoring, etc.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This chart is a simple way to see how the AWS ecosystem is organized. It brings together core services in one place.&lt;/p&gt;

&lt;p&gt;My advice is to start with the basics. Then connect the dots as long as you need.&lt;/p&gt;

&lt;p&gt;A practical start could look like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create and manage your networking with &lt;strong&gt;VPC&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Run apps with &lt;strong&gt;EC2&lt;/strong&gt;, &lt;strong&gt;Lambda&lt;/strong&gt;, or &lt;strong&gt;ECS&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Store data in &lt;strong&gt;S3&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Store your servers data with &lt;strong&gt;EBS&lt;/strong&gt;, or &lt;strong&gt;EFS&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;RDS&lt;/strong&gt; and &lt;strong&gt;Aurora&lt;/strong&gt; for your relational databases.&lt;/li&gt;
&lt;li&gt;Refer &lt;strong&gt;DynamoDB&lt;/strong&gt; for your NoSQL DBs.&lt;/li&gt;
&lt;li&gt;Secure access with &lt;strong&gt;IAM&lt;/strong&gt;, &lt;strong&gt;KMS&lt;/strong&gt;, and &lt;strong&gt;Secrets Manager&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Monitor everything with &lt;strong&gt;CloudWatch&lt;/strong&gt;, and troubleshoot with &lt;strong&gt;CloudTrail&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Automate delivery with &lt;strong&gt;CodePipeline&lt;/strong&gt;, &lt;strong&gt;CodeBuild&lt;/strong&gt;, and &lt;strong&gt;CodeDeploy&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Make your apps to talk with each other with &lt;strong&gt;SQS&lt;/strong&gt; and &lt;strong&gt;SNS&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Manage your resources with Infrastructure as Code with &lt;strong&gt;CloudFormation&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AWS gets much easier when you stop seeing isolated services and start seeing how they work together.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>webdev</category>
      <category>softwaredevelopment</category>
      <category>devops</category>
    </item>
    <item>
      <title>DevOps Engineer Routine</title>
      <dc:creator>Altair Lage</dc:creator>
      <pubDate>Mon, 13 Apr 2026 14:45:05 +0000</pubDate>
      <link>https://forem.com/altairlage/devops-engineer-routine-54ef</link>
      <guid>https://forem.com/altairlage/devops-engineer-routine-54ef</guid>
      <description>&lt;p&gt;Every DevOps knows this feeling&lt;/p&gt;

&lt;p&gt;On one side, there’s:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Infrastructure melting down at 2 AM.&lt;/li&gt;
&lt;li&gt;CI/CD pipelines stuck in "pending" forever.&lt;/li&gt;
&lt;li&gt;Mysterious server crashes with zero warning.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the other side:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Is it safe to push to production today?".&lt;/li&gt;
&lt;li&gt;“Why did the app get so slow all of a sudden?”.&lt;/li&gt;
&lt;li&gt;“But everything was fine in staging…”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s the job, really. DevOps isn't about learning and using the latest fashion tools.&lt;br&gt;
It's about staying calm under fire, bringing order to chaos, and designing systems resilient enough to handle reality, not just theory.&lt;/p&gt;

&lt;p&gt;What really helps in practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Monitoring that raises the flag before users feel the impact.&lt;/li&gt;
&lt;li&gt;CI/CD pipelines clean and simple enough for anyone to follow and trust.&lt;/li&gt;
&lt;li&gt;Automation for repetitive work, so people spend time fixing problems instead of clicking through tasks.&lt;/li&gt;
&lt;li&gt;Clear ownership and documentation that stays useful over time (instead of relying on tribal knowledge).&lt;/li&gt;
&lt;li&gt;Blameless postmortems that turn outages and mistakes into concrete improvement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're a DevOps, SRE, Cloud, or Platform Engineer, you already know this feeling. We all spend time dealing with fires. But the real goal is not just becoming better at reacting. It’s designing systems where fewer fires happen at all.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F5v8kiywbd3hhru81sinh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F5v8kiywbd3hhru81sinh.png" alt=" " width="800" height="683"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>sre</category>
      <category>infrastructure</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>New tutorial, folks!</title>
      <dc:creator>Altair Lage</dc:creator>
      <pubDate>Mon, 30 Mar 2026 17:38:18 +0000</pubDate>
      <link>https://forem.com/altairlage/new-tutorial-folks-3ill</link>
      <guid>https://forem.com/altairlage/new-tutorial-folks-3ill</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/altairlage/rabbitmq-management-interface-24b1" class="crayons-story__hidden-navigation-link"&gt;RabbitMQ Management Interface&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/altairlage" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3462854%2F0e9c166e-909e-40b3-8881-cf96fa18e64e.png" alt="altairlage profile" class="crayons-avatar__image" width="590" height="522"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/altairlage" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Altair Lage
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Altair Lage
                
              
              &lt;div id="story-author-preview-content-3431788" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/altairlage" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3462854%2F0e9c166e-909e-40b3-8881-cf96fa18e64e.png" class="crayons-avatar__image" alt="" width="590" height="522"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Altair Lage&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/altairlage/rabbitmq-management-interface-24b1" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 30&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/altairlage/rabbitmq-management-interface-24b1" id="article-link-3431788"&gt;
          RabbitMQ Management Interface
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tutorial"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tutorial&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/altairlage/rabbitmq-management-interface-24b1#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            12 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>devops</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>RabbitMQ Management Interface</title>
      <dc:creator>Altair Lage</dc:creator>
      <pubDate>Mon, 30 Mar 2026 17:36:39 +0000</pubDate>
      <link>https://forem.com/altairlage/rabbitmq-management-interface-24b1</link>
      <guid>https://forem.com/altairlage/rabbitmq-management-interface-24b1</guid>
      <description>&lt;p&gt;In my last articles, &lt;a href="https://dev.to/altairlage/how-to-install-rabbitmq-3k6b"&gt;How to install RabbitMQ&lt;/a&gt; and &lt;a href="https://dev.to/altairlage/unraveling-rabbitmq-how-to-scale-systems-with-queues-3531"&gt;Unraveling RabbitMQ&lt;/a&gt; we installed and deep dived into RabbitMQ, one of the most popular and mature message brokers in the open-source ecosystem. Its capability to handle queues, routes, and message publish/subscribe functionality is essential to ensure asynchronous communication, resilience, and scalability in modern applications.&lt;/p&gt;

&lt;p&gt;In this article, I present you the RabbitMQ Management interface. This is a user-friendly web interface that allows operators to monitor and configure the RabbitMQ Server from a web browser. This is a practical guide on how to get the most out of this web interface, which transforms broker management into a transparent and controllable task.&lt;/p&gt;

&lt;p&gt;This article will guide you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access and navigate the management dashboard.&lt;/li&gt;
&lt;li&gt;Monitor crucial metrics, such as &lt;strong&gt;message rates&lt;/strong&gt;, &lt;strong&gt;node status&lt;/strong&gt;, and overall &lt;strong&gt;system health&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Manage and interact with essential entities like &lt;strong&gt;Connections&lt;/strong&gt;, &lt;strong&gt;Channels&lt;/strong&gt;, &lt;strong&gt;Exchanges&lt;/strong&gt;, and &lt;strong&gt;Queues&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Use the administrative tools to configure &lt;strong&gt;Virtual Hosts (VHosts)&lt;/strong&gt;, &lt;strong&gt;Users&lt;/strong&gt;, and &lt;strong&gt;Permissions&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;



&lt;h1&gt;
  
  
  The Management interface
&lt;/h1&gt;

&lt;p&gt;After starting RabbitMQ, you can monitor and manage it from the administration console. The web interface operates on port &lt;code&gt;15672&lt;/code&gt; and you can access it by the URL: &lt;code&gt;http://localhost:15672/&lt;/code&gt; . Use the defaultcredentials: &lt;strong&gt;username:&lt;/strong&gt; &lt;code&gt;guest&lt;/code&gt; and &lt;strong&gt;password:&lt;/strong&gt; &lt;code&gt;guest&lt;/code&gt; to login for the first time.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;It is strongly recommended that these default credentials be modified immediately in any non-development environment.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;From RabbitMQ Management it is possible to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manage exchanges, queues, bindings, users, virtual hosts, policies, runtime parameters and user permissions.&lt;/li&gt;
&lt;li&gt;Export and import schema (vhosts, users, permissions, queues, exchanges, bindings, parameters, policies).&lt;/li&gt;
&lt;li&gt;Monitor queue length, message rates, resource usage of queue, node GC activity, data rates of client connections, and more.&lt;/li&gt;
&lt;li&gt;Force close client connections, purge queues.&lt;/li&gt;
&lt;li&gt;Send and receive messages for debugging.&lt;/li&gt;
&lt;li&gt;Monitor node resource use: sockets and file descriptors, memory usage breakdown, available disk space, and bandwidth usage on inter-node communication links.&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  The overview page
&lt;/h2&gt;

&lt;p&gt;After logging in, the &lt;strong&gt;Overview&lt;/strong&gt; page is the default landing screen, presenting a real-time assessment of the broker's operational state and performance metrics. You will see the following stats:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fag6450fbks4znrnyik1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fag6450fbks4znrnyik1v.png" alt="RabbitMQ user interface" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Overview page displays 2 charts: The current &lt;strong&gt;Queued Messages&lt;/strong&gt; volume and the &lt;strong&gt;Messages Rate&lt;/strong&gt;.&lt;br&gt;
The time series displayed in these charts can be adjusted (e.g., &lt;code&gt;last minute&lt;/code&gt;, &lt;code&gt;last hour&lt;/code&gt;) for historical analysis. Information about all the different states of the messages can be found by pressing &lt;code&gt;?&lt;/code&gt; link.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fi48u86j19uozl8q1news.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fi48u86j19uozl8q1news.png" alt="RabbitMQ overview pt1" width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Queued messages&lt;/strong&gt;: This graph shows the total number of messages in all Queues. These statistics are essential to identify message backlogs and potential throughput limitations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ready&lt;/strong&gt;: Indicates the number of messages that are currently available for delivery and consumption by connected consumers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unacked&lt;/strong&gt;: The number of messages that server is waiting for confirmation. Represents messages that have been delivered to a consumer but the server has not yet received a positive acknowledgment (ACK). These messages are retained for potential redelivery, ensuring message reliability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total&lt;/strong&gt;: The total number of messages queued in all Queues, calculated as the sum of &lt;strong&gt;Ready&lt;/strong&gt; and &lt;strong&gt;Unacked&lt;/strong&gt; messages.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;Messages rate&lt;/strong&gt;: The chart shows the rate of processing messages, typically measured in messages per second. This is a primary indicator of system performance and workload.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Publish&lt;/strong&gt;: Displays the rate at which producers are submitting new messages to the server/broker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publisher confirm&lt;/strong&gt;: Indicates the rate at which the server is confirming receipt of messages back to the producers. Applicable when the publisher confirm mechanism is used.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deliver (manual ack) / Deliver (auto ack)&lt;/strong&gt;: Displays the delivery rate of messages from queues to consumers, segregated based on whether the consumer requires manual acknowledgment (&lt;code&gt;manual ack&lt;/code&gt;) or utilizes automatic acknowledgment (&lt;code&gt;auto ack&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get (manual ack) / Get (auto ack)&lt;/strong&gt;: Displays the rate at which consumers are actively fetching messages from the queue using the &lt;code&gt;basic.get&lt;/code&gt; method, also categorized by acknowledgment mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redelivered&lt;/strong&gt;: The rate at which the server/broker is resending messages to consumers, typically following connection interruptions or negative acknowledgments (NACKs).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disk read/write&lt;/strong&gt;: The frequency of disk I/O operations (reads and writes) executed by the broker, primarily related to managing persistent messages and durable queue data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Global Count&lt;/strong&gt;: Static panel that provides instantaneous totals for key operational entities. It summarizes the count of all active &lt;strong&gt;Connections&lt;/strong&gt;, &lt;strong&gt;Channels&lt;/strong&gt;, &lt;strong&gt;Exchanges&lt;/strong&gt;, &lt;strong&gt;Queues&lt;/strong&gt;, and &lt;strong&gt;Consumers&lt;/strong&gt; across &lt;strong&gt;ALL virtual hosts&lt;/strong&gt;, offering a rapid assessment of current resource utilization.&lt;/p&gt;



&lt;h2&gt;
  
  
  Nodes
&lt;/h2&gt;

&lt;p&gt;Provides critical system-level details for each &lt;strong&gt;Node&lt;/strong&gt; operating within your RabbitMQ cluster. A cluster is essentially a logical grouping of RabbitMQ server instances running on separate machines or processes. Monitoring these metrics is vital for capacity planning and troubleshooting performance issues across the cluster.&lt;/p&gt;

&lt;p&gt;Here you can observe key resource utilization statistics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memory&lt;/strong&gt;: Displays the amount of system memory currently consumed by the node.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Erlang Processes&lt;/strong&gt;: Shows the total number of underlying Erlang processes running on the node. RabbitMQ is built on Erlang, and managing this count is essential as there is a finite limit to the number of processes a node can handle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disk Space&lt;/strong&gt;: Indicates the remaining available disk space on the host machine. If disk space drops below a defined watermark, the broker may block producers to prevent data loss.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uptime&lt;/strong&gt;: Displays the duration since the RabbitMQ node was last started.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fyqcuams98u8qbg1yxkyc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fyqcuams98u8qbg1yxkyc.png" alt="RabbitMQ Overview pt3" width="800" height="76"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Churn statistics
&lt;/h2&gt;

&lt;p&gt;Displays the rate of new (created) or closed (closed) connections, channels, and queues.&lt;br&gt;
"Churn" refers to the velocity at which these resources are instantiated and destroyed in the broker. High churn rates can sometimes indicate issues with client connection management or rapid scaling events.&lt;/p&gt;

&lt;p&gt;This panel displays the rate (per second) of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Connections&lt;/strong&gt;: New client connections being opened or existing connections being closed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channels&lt;/strong&gt;: Channels being created or shut down within connections.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Queues&lt;/strong&gt;: Queues being created or deleted.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Frzba3uz5p9yytllb4ul1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Frzba3uz5p9yytllb4ul1.png" alt="RabbitMQ Overview pt3" width="800" height="667"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Ports and contexts
&lt;/h2&gt;

&lt;p&gt;This simple but important section serves as a reference for network configuration. Here you can find the network interfaces and &lt;strong&gt;listening ports&lt;/strong&gt; configured for various protocols that RabbitMQ uses to communicate with clients and other nodes.&lt;/p&gt;

&lt;p&gt;You can quickly verify the ports used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AMQP (standard client connections)&lt;/li&gt;
&lt;li&gt;HTTP (management interface)&lt;/li&gt;
&lt;li&gt;Inter-node communication (clustering)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ftqg7gez6ijfu0r73a6xi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ftqg7gez6ijfu0r73a6xi.png" alt="RabbitMQ Overview pt4" width="800" height="522"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Import export definitions
&lt;/h2&gt;

&lt;p&gt;It is possible to import and export definitions to configure all information of the RabbitMQ broker. This functionality is crucial for configuration management, backup, and restoration. It allows the complete definition of the RabbitMQ broker's state to be exported or imported as a single artifact.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fc996btcg0ezizgt8z30q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fc996btcg0ezizgt8z30q.png" alt="RabbitMQ Overview pt5" width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Exporting the definitions, we get a JSON file representing the broker (RabbitMQ). This can be used to restore Exchange, Queue, virtual host, policy, user, etc. This feature can be used as a backup. Every time you change the configuration, you can keep the old settings to restore when needed.&lt;/p&gt;

&lt;p&gt;When definitions are &lt;strong&gt;exported&lt;/strong&gt;,  we get a &lt;strong&gt;JSON file&lt;/strong&gt; that encapsulates the entire configuration of the broker. This file includes all defined &lt;strong&gt;Exchanges&lt;/strong&gt;, &lt;strong&gt;Queues&lt;/strong&gt;, &lt;strong&gt;Virtual Hosts&lt;/strong&gt;, &lt;strong&gt;Policies&lt;/strong&gt;, &lt;strong&gt;Users&lt;/strong&gt;, and &lt;strong&gt;Permissions&lt;/strong&gt;. This feature can serve as &lt;strong&gt;backup mechanism&lt;/strong&gt; and for replicating configurations across development, staging, and production environments. It ensures consistency and allows quick rollback to previous settings state in case of issues.&lt;/p&gt;



&lt;h2&gt;
  
  
  Connections
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;RabbitMQ Connection&lt;/strong&gt; is a TCP connection between the application and the RabbitMQ broker. This connection acts as the secure and stable pipe through which all messaging traffic flows. When the client disconnects for any reasons, or a system failure occurs, the underlying TCP connection will be terminated and closed by the broker.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Connections&lt;/strong&gt; page provides a list of active connection to the RabbitMQ server.&lt;/p&gt;

&lt;p&gt;Key details displayed for each connection include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Overview&lt;/strong&gt;: Displays essential metadata, such as the &lt;strong&gt;client IP address&lt;/strong&gt; (source), the &lt;strong&gt;username&lt;/strong&gt; used for authentication, and the current &lt;strong&gt;Connection Status&lt;/strong&gt; (e.g., running, blocked).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Channels&lt;/strong&gt;: Indicates the current number of &lt;strong&gt;Channels&lt;/strong&gt; that have been opened and are actively running within this specific connection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSL/TLS&lt;/strong&gt;: A flag indicating whether the connection is utilizing &lt;strong&gt;SSL/TLS encryption&lt;/strong&gt; for secure data transmission.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fnmem6gf314qhhfix1ugv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fnmem6gf314qhhfix1ugv.png" alt="RabbitMQ Overview pt6" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clicking on one of the connections, you will get an overview of that specific connection, and view channels in connection and data rate. You can see the Client properties and close the connection if you want &lt;strong&gt;(Force Close)&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;View Channels&lt;/strong&gt;: The list of all active channels currently multiplexed over this connection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Rate&lt;/strong&gt;: The current inbound and outbound message and byte traffic rates associated with the connection.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client Properties&lt;/strong&gt;: Metadata provided by the connecting application, such as the application name, version, and client library used.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Force Close&lt;/strong&gt;: Manually terminate the connection. This administrative action is useful for troubleshooting unresponsive clients or managing resource utilization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fnells5vfui6es9ntu9m0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fnells5vfui6es9ntu9m0.png" alt="RabbitMQ Overview pt7" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fuciiyc8m5w2otd8843h7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fuciiyc8m5w2otd8843h7.png" alt="RabbitMQ Overview pt8" width="800" height="1005"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Channels
&lt;/h2&gt;

&lt;p&gt;A RabbitMQ Channel is a virtual connection inside a connection. It reuses a connection, to avoid the need to reauthorize and open a new TCP stream. When messages are published or consumed, it is done over a channel. Many channels can be established within a single connection.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Channels&lt;/strong&gt; page displays information about all current Channels: Displays the username the user is associated with the channel, connection status, confirmation, Message exchange rate, etc..&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F1ci1hqy8fm94v04zmvl0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F1ci1hqy8fm94v04zmvl0.png" alt="RabbitMQ Overview pt9" width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you click on one of the Channels, you will get a detailed overview of that Channel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fv0c0b34dkjunpt1q4zep.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fv0c0b34dkjunpt1q4zep.png" alt="RabbitMQ Overview pt10" width="800" height="637"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Exchanges
&lt;/h2&gt;

&lt;p&gt;The RabbitMQ Exchange entity is in charge of applying routing rules for messages, making sure that messages are reaching their final destination. In other words, the exchange ensures that the received message ends up in the correct queues. Which queue the message ends up in depends on the rules defined by the exchange type. A queue needs to be bound to at least one exchange to be able to receive messages.&lt;/p&gt;

&lt;p&gt;Routing rules include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Direct (point-to-point)&lt;/strong&gt;: a message goes to the queue(s) with the binding key that exactly matches the routing key of the message.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Topic (publish-subscribe)&lt;/strong&gt;: route messages to queues based on wildcard matches between the routing key and the routing pattern, which is specified by the queue binding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;fanout (multicast)&lt;/strong&gt;: ignores routing key and broadcast a message to all queues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;header exchanges&lt;/strong&gt;: similar to topic exchanges, but route messages based on header values instead of routing keys.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All &lt;strong&gt;Exchanges&lt;/strong&gt; can be listed from the Exchange tab.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: displays the name of the Exhange created.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type&lt;/strong&gt;: is the type of Exchange like direct, topic, fanout and header.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature&lt;/strong&gt;: displays parameters for Exchange (eg: D is durable, and AD is auto-delete).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Message rate in/out&lt;/strong&gt;: Rate of processing incoming and outgoing Messages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this list there are several Exchange amq.* and Default Exchange (default exchange unnamed), which are created by default.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fasztmy1dakfnpug6o8bq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fasztmy1dakfnpug6o8bq.jpg" alt="RabbitMQ exchanges" width="789" height="853"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is possible to add a new Exchange in this page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fvoegxvvmvwhqo7u7t0lt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fvoegxvvmvwhqo7u7t0lt.png" alt="RabbitMQ exchanges 2" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By clicking on the Exchange name, a detailed page about the Exchange is displayed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ff304hpsfdp282n3b0cfr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ff304hpsfdp282n3b0cfr.png" alt="RabbitMQ exchanges 3" width="800" height="991"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can view and add biding for the Exchange.&lt;/p&gt;



&lt;h3&gt;
  
  
  Bindings
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Binding&lt;/strong&gt; is the fundamental relationship mechanism in RabbitMQ. it defines the routing logic between an &lt;strong&gt;Exchange&lt;/strong&gt; and a &lt;strong&gt;Queue&lt;/strong&gt; (or between two Exchanges). Without a binding, a queue cannot receive messages from any exchange.&lt;/p&gt;

&lt;p&gt;Essentially, a binding is a directive that tells an exchange how to send data to a queue or another exchange. The binding also contains routing keys and arguments that customize message passing:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; The Exchange that receives the message.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Destination:&lt;/strong&gt; The Queue (or another Exchange) where the message is sent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Routing Key:&lt;/strong&gt; An optional parameter supplied by the producer, which the exchange uses to match against the binding.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F0au8ijjvpvayyqaw2pzk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F0au8ijjvpvayyqaw2pzk.png" alt="Exchange to exchange binding" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the Management Interface, bindings are configured on the detail page of the Exchange or Queue, allowing the operator to define precisely which messages flow to which destinations based on the Exchange's type (&lt;code&gt;direct&lt;/code&gt;, &lt;code&gt;topic&lt;/code&gt;, etc.).&lt;/p&gt;

&lt;p&gt;You can also publish a message to Exchange in this page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fewz9flf77yumxbtfx26e.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fewz9flf77yumxbtfx26e.jpg" alt="Binding publish message to exchange" width="776" height="569"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Queues
&lt;/h2&gt;

&lt;p&gt;A RabbitMQ Queue is the central storage component, an ordered sequence of items, in this case, &lt;strong&gt;messages&lt;/strong&gt; waiting for consumers to process them. The queue exists within the broker context (RabbitMQ server or Cluster).&lt;br&gt;
Queues have different parameters and arguments depending on how they were created, which determine their behavior and resilience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: The unique identifier of the created queue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Features&lt;/strong&gt;: Displays the primary configuration attributes that define the queue's persistence and lifecycle:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Durable Queues&lt;/strong&gt;: Indicated by &lt;code&gt;D&lt;/code&gt;. If the RabbitMQ node is restarted, the queue and any persistent messages within it will be recovered. This is essential to guarantee data is not lost in case of failure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-delete Queues&lt;/strong&gt;: Indicated by &lt;code&gt;AD&lt;/code&gt;. The queue will be automatically deleted by the broker as soon as its last consumer disconnects or is canceled (e.g., when the TCP connection with the server is lost or the channel is closed). This is useful for temporary queues.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Message Ready&lt;/strong&gt;: Displays the number of messages currently available to be delivered to consumers.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Message Unacked&lt;/strong&gt;: Represents the number of messages that have already been delivered to consumers, but for which the server has not yet received an acknowledgment of processing (ACK). These messages remain in the queue and will be redelivered if the consumer fails.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Message Total&lt;/strong&gt;: The total number of messages currently queued. This is the sum of &lt;strong&gt;Ready&lt;/strong&gt; and &lt;strong&gt;Unacked&lt;/strong&gt; messages.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Message Rate in/out&lt;/strong&gt;: The real-time processing rates. &lt;strong&gt;&lt;code&gt;In&lt;/code&gt;&lt;/strong&gt; shows the speed at which messages are arriving at the queue (publish rate), while &lt;strong&gt;&lt;code&gt;Out&lt;/code&gt;&lt;/strong&gt; shows the speed at which messages are being processed/delivered to consumers (delivery rate).&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fxi6zsk25fh1wwlqbhvl6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fxi6zsk25fh1wwlqbhvl6.jpg" alt="RabbitMQ queue" width="800" height="735"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A new Queue can be added in this same page:&lt;br&gt;
&lt;a href="https://media2.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%2Fvnpmzhyzlaudjfgijx5o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fvnpmzhyzlaudjfgijx5o.png" alt="RabbitMQ queue pt2" width="800" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By clicking on the &lt;strong&gt;Queue name&lt;/strong&gt;, a Queue detail page will be displayed:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fk2fn6wdikbgedupqqso2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fk2fn6wdikbgedupqqso2.png" alt="RabbitMQ queue pt3" width="800" height="760"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;Consumer&lt;/strong&gt; is an application (or application instance) that consumes messages. The consumer sub page displays consumers/channels that are connected to the Queue. you can view and add constraints for Queue:&lt;br&gt;
&lt;a href="https://media2.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%2Fpmlce4i28nddzpayfq3k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fpmlce4i28nddzpayfq3k.png" alt="RabbitMQ queue pt4" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is also possible to publish a message to the Queue:&lt;br&gt;
&lt;a href="https://media2.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%2F0voacf4sdvoi49tu38fk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F0voacf4sdvoi49tu38fk.png" alt="RabbitMQ queue pt5" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A Queue can be deleted by clicking the &lt;code&gt;Delete Queue&lt;/code&gt; button. You can aslo delete all Messages in the Queue by clicking the &lt;code&gt;Purge Messages&lt;/code&gt; button:&lt;br&gt;
&lt;a href="https://media2.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%2Fll222p2v9zglegqn6ida.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fll222p2v9zglegqn6ida.png" alt="RabbitMQ queue pt6" width="800" height="1076"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Admin page
&lt;/h2&gt;

&lt;p&gt;From the Admin page, we can add m users, change user permissions, set up vhosts, policies, limit the number of connections or change the cluster name.&lt;br&gt;
&lt;a href="https://media2.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%2F80rsnopx1kuwu3wxzy5z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F80rsnopx1kuwu3wxzy5z.png" alt="Admin Page" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on the Virtual Hosts menu on the left to view a list or add new Virtual Hosts:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fjls116w52a0taptn26ih.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fjls116w52a0taptn26ih.png" alt="Virtual Hosts" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Policy can be added or updated in the Policies sub-menu on the left:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fsr091fd07n22o7pqs6rh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fsr091fd07n22o7pqs6rh.png" alt="Policies" width="800" height="1035"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Similarly click on the Limits sub-menu to limit the number of Connections, Queues of a Virtual Host.&lt;br&gt;
&lt;a href="https://media2.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%2Fv2xsoyl737u7z6ykf8vs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fv2xsoyl737u7z6ykf8vs.png" alt="Limits" width="716" height="652"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By default, RabbitMQ names the cluster rabbit@, and we can rename it in the cluster sub-menu.&lt;/p&gt;

&lt;p&gt;This article mainly introduces you to the features that we can use from RabbitMQ Management Interface.&lt;/p&gt;



&lt;h3&gt;
  
  
  Virtual Hosts (VHosts)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Virtual Hosts (VHosts)&lt;/strong&gt; are the primary administrative partitions within a single RabbitMQ broker. They provide a way to group and isolate user permissions, exchanges, queues, and bindings. From a multi-tenant or multi-application perspective, a VHost functions like a separate, logical broker instance, ensuring that resources and messaging data from one application environment (e.g., 'production' or 'development') cannot interfere with another.&lt;/p&gt;



&lt;h1&gt;
  
  
  Advanced Debugging Tools
&lt;/h1&gt;

&lt;p&gt;Beyond the standard Overview metrics, the Management Interface provides specialized tools for deep-level diagnostics, particularly useful when troubleshooting complex routing or delivery issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  Message Tracing (Tracer)
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Tracer&lt;/strong&gt; is a powerful debugging feature used to inspect the path messages take through the broker. When enabled, the Tracer logs every message event, including when a message is published, routed by an exchange, and delivered to a queue.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Usage&lt;/strong&gt;: Operators enable tracing on a specific virtual host to capture detailed logs of all message activity within that environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benefit&lt;/strong&gt;: This allows developers to definitively confirm if a message arrived at the correct queue, or if it was dropped due to an incorrect binding or routing key.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Alarms and Health Checks
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Alarms&lt;/strong&gt; sub-menu, found under the &lt;strong&gt;Admin&lt;/strong&gt; section, provides a centralized view of system-critical alerts. RabbitMQ nodes trigger alarms when they encounter severe resource constraints, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Disk Alarm&lt;/strong&gt;: Triggered if available disk space drops below the configured watermark, preventing the writing of persistent messages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Alarm&lt;/strong&gt;: Triggered if the node exceeds a pre-set memory utilization limit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Monitoring these alarms is crucial for preemptive capacity management and avoiding producer throttling, when the broker blocks incoming messages to prevent a more severe failure.&lt;/p&gt;



&lt;h1&gt;
  
  
  That's all foks!
&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;RabbitMQ Management Web Interface&lt;/strong&gt; is not just an optional tool. It is an important component for any operator or developer working with asynchronous systems. The interface provides complete and real-time visibility into the operational core of the broker, making management tasks that were once, complex command-line operations, an intuitive web console action.&lt;/p&gt;

&lt;p&gt;Mastering this interface allows you to manage the messaging infrastructure, ensuring high availability and message reliability. Always remember to prioritize security by managing user permissions and regularly updating credentials, transforming your RabbitMQ instance from a simple message relay into a resilient and scalable communication hub.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Learn how to develop like a pro for free</title>
      <dc:creator>Altair Lage</dc:creator>
      <pubDate>Fri, 27 Mar 2026 17:59:18 +0000</pubDate>
      <link>https://forem.com/altairlage/learn-how-to-develop-like-a-pro-for-free-543</link>
      <guid>https://forem.com/altairlage/learn-how-to-develop-like-a-pro-for-free-543</guid>
      <description>&lt;p&gt;There is no excuse nowadays to learn Software development. It is no longer a privilege, but accessible for everyone. The following cheat sheet is a straight source of 100% free tools and platforms to study the main market technologies and languages.&lt;/p&gt;

&lt;p&gt;HTML → &lt;a href="https://w3schools.com" rel="noopener noreferrer"&gt;https://w3schools.com&lt;/a&gt;&lt;br&gt;
CSS → &lt;a href="https://codecademy.com" rel="noopener noreferrer"&gt;https://codecademy.com&lt;/a&gt;&lt;br&gt;
JavaScript → &lt;a href="https://freecodecamp.com" rel="noopener noreferrer"&gt;https://freecodecamp.com&lt;/a&gt;&lt;br&gt;
React → &lt;a href="https://react.dev" rel="noopener noreferrer"&gt;https://react.dev&lt;/a&gt;&lt;br&gt;
Python → &lt;a href="https://learnpython.org" rel="noopener noreferrer"&gt;https://learnpython.org&lt;/a&gt;&lt;br&gt;
Java → &lt;a href="https://sololearn.com" rel="noopener noreferrer"&gt;https://sololearn.com&lt;/a&gt;&lt;br&gt;
PHP → &lt;a href="https://php.net" rel="noopener noreferrer"&gt;https://php.net&lt;/a&gt;&lt;br&gt;
Cybersecurity → &lt;a href="https://tryhackme.com" rel="noopener noreferrer"&gt;https://tryhackme.com&lt;/a&gt;&lt;br&gt;
C → &lt;a href="https://learn-c.org" rel="noopener noreferrer"&gt;https://learn-c.org&lt;/a&gt;&lt;br&gt;
C++ → &lt;a href="https://learncpp.com" rel="noopener noreferrer"&gt;https://learncpp.com&lt;/a&gt;&lt;br&gt;
AWS → &lt;a href="https://skillbuilder.aws" rel="noopener noreferrer"&gt;https://skillbuilder.aws&lt;/a&gt;&lt;br&gt;
IA / ML → &lt;a href="https://coursera.org" rel="noopener noreferrer"&gt;https://coursera.org&lt;/a&gt;&lt;br&gt;
Git → &lt;a href="https://learngitbranching.js.org" rel="noopener noreferrer"&gt;https://learngitbranching.js.org&lt;/a&gt;&lt;br&gt;
SQL → &lt;a href="https://sqlbolt.com" rel="noopener noreferrer"&gt;https://sqlbolt.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These websites are excellent free resources for learning everything from the basics to advanced content.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fiexi3x3k3wgynnh91v1i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fiexi3x3k3wgynnh91v1i.png" alt=" " width="800" height="977"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to install RabbitMQ</title>
      <dc:creator>Altair Lage</dc:creator>
      <pubDate>Thu, 19 Mar 2026 12:38:37 +0000</pubDate>
      <link>https://forem.com/altairlage/how-to-install-rabbitmq-3k6b</link>
      <guid>https://forem.com/altairlage/how-to-install-rabbitmq-3k6b</guid>
      <description>&lt;p&gt;This article is a sequence of my previous RabbitMQ article: &lt;a href="https://dev.to/altairlage/unraveling-rabbitmq-how-to-scale-systems-with-queues-3531"&gt;Unraveling RabbitMQ: How to Scale Systems with Queues&lt;/a&gt;. Check it out to deep dive into the concepts!&lt;/p&gt;

&lt;p&gt;RabbitMQ is an open-source message broker that acts as the intermediary between independent and heterogeneous applications, providing systems a common way to communicate. Commonly used in Microservices Architecture, it is a software where queues are defined, to which applications connect in order to transfer messages. The queue-manager software stores the messages until a receiving application connects and takes a message off the queue.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fjs84agqr5d62qpr6vlf7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fjs84agqr5d62qpr6vlf7.png" alt="RabbitMQ enqueue dequeue chart" width="800" height="624"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RabbitMQ uses an implementation of Advanced Message Queuing Protocol - AMQP, which supports advanced features such as clustering and complex message routing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F780yqa0h6ck151znwgtd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F780yqa0h6ck151znwgtd.png" alt="Advanced Message Queuing Protocol - AMQP chart" width="800" height="110"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  What is AMQP?
&lt;/h2&gt;

&lt;p&gt;AMQP (Advanced Message Queuing Protocol) is a powerful, open-standard application layer protocol for message-oriented middleware. It basically defines how a system can exchange messages. Its main purpose is to provide a standardized way for different systems to exchange messages asynchronously, regardless of the operating system, programming language, or message broker implementation being used.&lt;br&gt;
The protocol defines a set of rules and capabilities that systems must follow. By implementing this specification, AMQP ensures interoperability between different vendors' messaging brokers and client applications.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why should you use RabbitMQ?
&lt;/h2&gt;

&lt;p&gt;When an application is broken down into many small, independent services, or "microservices" as called in Mircroservices Architecture, they need a way to talk to each other. There are two main ways for them to communicate:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Synchronous Communication&lt;/strong&gt;&lt;br&gt;
This is like calling someone on the phone.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; One microservice calls another microservice directly, then stops and waits for an immediate response.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Example:&lt;/strong&gt; The Request-Response pattern (like using HTTP). A service asks, "What is the price?" and waits for the answer before doing anything else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Problem (Coupling):&lt;/strong&gt; This creates a strong dependency, or coupling, between the services. If the second service is slow, busy, or completely down, the first service also stops working or slows down. It ties the services together.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When to use it:&lt;/strong&gt; When you absolutely need an immediate answer to proceed, like checking a user's login credentials.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;strong&gt;2. Asynchronous Communication&lt;/strong&gt;&lt;br&gt;
This is like sending an email or a text message.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it works:&lt;/strong&gt; Instead of calling the service directly, the first service sends a message (a "request") to a central &lt;strong&gt;Message Queue&lt;/strong&gt; (like RabbitMQ). The sending service then immediately goes back to its own work, without waiting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Role of RabbitMQ:&lt;/strong&gt; RabbitMQ acts as this messenger. It reliably holds the message until the correct microservice is ready to pick it up, process it, and deliver the result back later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Benefit (Decoupling):&lt;/strong&gt; This allows services to be loosely coupled. If one service is busy, the messages just queue up, and the sending service doesn't even notice the delay, it keeps running smoothly. This improves resilience, scalability, and performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When to use it:&lt;/strong&gt; For tasks that can happen in the background or take time, such as processing a large payment, sending an email confirmation, or generating a report.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;In summary:&lt;/strong&gt; RabbitMQ enables Asynchronous communication, which is crucial for making microservices reliable, scalable, and independent of each other.&lt;/p&gt;


&lt;h1&gt;
  
  
  How does RabbitMQ work?
&lt;/h1&gt;

&lt;p&gt;To understand how RabbitMQ works, check the diagram below, which illustrates the journey of a message through an example application, a PDF generation system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fth4anfwfwlq2s9y6k6wk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fth4anfwfwlq2s9y6k6wk.png" alt="Example PDF generation system workflow chart" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The process happens in four main, simple steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Request (Start):&lt;/strong&gt; A user on a Website Application triggers a task that should run in the background, such as asking to "Create a PDF."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Producer Publishes:&lt;/strong&gt; The Website Application, acting as the PRODUCER, doesn't do the work immediately. Instead, it packages the request (including necessary data like name and email) into a message and Publishes (sends) it to RabbitMQ.&lt;/li&gt;
&lt;li&gt;The Routing Inside RabbitMQ:

&lt;ol&gt;
&lt;li&gt;A component called the &lt;strong&gt;Exchange&lt;/strong&gt; receives the message from the Producer.&lt;/li&gt;
&lt;li&gt;The Exchange's job is to act as a &lt;strong&gt;sorter&lt;/strong&gt;. It uses Routing rules to ensure the message is delivered to the correct Queue (in this diagram, the Message Queue for PDF requests).&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Queue&lt;/strong&gt; securely holds the message, acting as a buffer until a service is available to handle it.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Consumer Processes:&lt;/strong&gt;

&lt;ol&gt;
&lt;li&gt;A dedicated background service, called the CONSUMER (the PDF Creator Worker), constantly monitors the Queue.&lt;/li&gt;
&lt;li&gt;The Consumer retrieves (Consumes) the task message and begins the actual work: creating the PDF.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;h1&gt;
  
  
  How to install RabbitMQ using Docker
&lt;/h1&gt;

&lt;p&gt;Using &lt;strong&gt;Docker&lt;/strong&gt; is the easiest and fastest way to get RabbitMQ running on your local machine. This method uses a &lt;strong&gt;pre-built&lt;/strong&gt; image that includes both the RabbitMQ server and its Web Management interface, saving you the hassle of manual installation.&lt;/p&gt;

&lt;p&gt;To start RabbitMQ with the management plugin enabled, you need to run a specific &lt;code&gt;docker run&lt;/code&gt; command. This command sets up the container, maps the necessary ports, and specifies the RabbitMQ version you want to use.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# For RabbitMQ 3.13 specific version&lt;/span&gt;
docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; rabbitmq &lt;span class="nt"&gt;-p&lt;/span&gt; 5672:5672 &lt;span class="nt"&gt;-p&lt;/span&gt; 15672:15672 rabbitmq:3.13-management

&lt;span class="c"&gt;# For RabbitMQ 3.8, specific version&lt;/span&gt;
&lt;span class="c"&gt;# Support timeline: https://www.rabbitmq.com/versions.html&lt;/span&gt;
docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; rabbitmq &lt;span class="nt"&gt;-p&lt;/span&gt; 5672:5672 &lt;span class="nt"&gt;-p&lt;/span&gt; 15672:15672 rabbitmq:3.8-management
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docker run&lt;/code&gt;: The command to create and start a container.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-it&lt;/code&gt;: Runs the container in interactive mode and allocates a pseudo-TTY, allowing you to see logs and output.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--rm&lt;/code&gt;: Crucial: This automatically removes the container and its file system when it exits. This keeps your system clean.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--name rabbitmq&lt;/code&gt;: Assigns the easy-to-read name rabbitmq to your container.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-p 5672:5672&lt;/code&gt;: Maps the AMQP Port. This forwards the standard RabbitMQ port inside the container (5672) to the same port on your computer. This port is used by applications to send and receive messages.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-p 15672:15672&lt;/code&gt;: Maps the Management Port. This forwards the port for the Web Management interface (15672) to your computer, allowing you to access the dashboard in your browser.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rabbitmq:3.13-management&lt;/code&gt;: Specifies the Docker image to use. The &lt;code&gt;-management&lt;/code&gt; tag ensures the helpful web interface is included. (You can check the official Docker Hub for other versions like &lt;code&gt;rabbitmq:latest-management&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to see the server status while it's running, open a new terminal window and use this command: &lt;code&gt;docker logs -f rabbitmq&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;After the container starts (which usually takes only a few seconds), the RabbitMQ Web Management interface will be available.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;URL: Access the dashboard at: &lt;a href="http://localhost:15672" rel="noopener noreferrer"&gt;http://localhost:15672&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Default Login: Use the default credentials:

&lt;ul&gt;
&lt;li&gt;Username: guest&lt;/li&gt;
&lt;li&gt;Password: guest&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;On this screen, you can monitor the health of your broker, view the number of active Queues and Exchanges, manage Users, and inspect the flow and volume of messages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; For security reasons, the guest/guest user can only connect from localhost (your machine) by default. For production environments or when deploying to a server, you must create a new administrator user with a strong password.&lt;/p&gt;



&lt;h1&gt;
  
  
  How to install RabbitMQ on Ubuntu
&lt;/h1&gt;

&lt;p&gt;Installing RabbitMQ on Ubuntu requires two main steps: getting the necessary packages like Erlang (which RabbitMQ is built on) and then installing the RabbitMQ server itself. The official RabbitMQ team provides an easy-to-use package repository for this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; The script below is comprehensive but relies on specific versions and repository settings that can change over time. It is best practice to always check the official RabbitMQ documentation for the absolute latest installation instructions and key fingerprints before running this on a production server.&lt;/p&gt;

&lt;p&gt;The following script automates the entire process: installing dependencies, adding the necessary software repositories, importing the security keys, and finally installing Erlang and RabbitMQ Server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/sh&lt;/span&gt;

&lt;span class="c"&gt;# 1. Install necessary tools (curl, gnupg, etc.)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;curl gnupg apt-transport-https &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="c"&gt;# 2. Import GPG keys for security verification (RabbitMQ, Erlang, and PackageCloud)&lt;/span&gt;
curl &lt;span class="nt"&gt;-1sLf&lt;/span&gt; &lt;span class="s2"&gt;"https://keys.openpgp.org/vks/v1/by-fingerprint/0A9AF2115F4687BD29803A206B73A36E6026DFCA"&lt;/span&gt; | &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /usr/share/keyrings/com.rabbitmq.team.gpg &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null
curl &lt;span class="nt"&gt;-1sLf&lt;/span&gt; &lt;span class="s2"&gt;"https://keyserver.ubuntu.com/pks/lookup?op=get&amp;amp;search=0xf77f1eda57ebb1cc"&lt;/span&gt; | &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /usr/share/keyrings/net.launchpad.ppa.rabbitmq.erlang.gpg &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null
curl &lt;span class="nt"&gt;-1sLf&lt;/span&gt; &lt;span class="s2"&gt;"https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey"&lt;/span&gt; | &lt;span class="nb"&gt;sudo &lt;/span&gt;gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /usr/share/keyrings/io.packagecloud.rabbitmq.gpg &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null

&lt;span class="c"&gt;# 3. Add the RabbitMQ and Erlang package repositories to APT sources&lt;/span&gt;
&lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/rabbitmq.list &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
## Provides modern Erlang/OTP releases
deb [signed-by=/usr/share/keyrings/net.launchpad.ppa.rabbitmq.erlang.gpg] http://ppa.launchpad.net/rabbitmq/rabbitmq-erlang/ubuntu bionic main
deb-src [signed-by=/usr/share/keyrings/net.launchpad.ppa.rabbitmq.erlang.gpg] http://ppa.launchpad.net/rabbitmq/rabbitmq-erlang/ubuntu bionic main

## Provides RabbitMQ Server
deb [signed-by=/usr/share/keyrings/io.packagecloud.rabbitmq.gpg] https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ bionic main
deb-src [signed-by=/usr/share/keyrings/io.packagecloud.rabbitmq.gpg] https://packagecloud.io/rabbitmq/rabbitmq-server/ubuntu/ bionic main
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# 4. Update package lists&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="c"&gt;# 5. Install Erlang and its components (required by RabbitMQ)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; erlang-base &lt;span class="se"&gt;\&lt;/span&gt;
                         erlang-asn1 erlang-crypto erlang-eldap erlang-ftp erlang-inets &lt;span class="se"&gt;\&lt;/span&gt;
                         erlang-mnesia erlang-os-mon erlang-parsetools erlang-public-key &lt;span class="se"&gt;\&lt;/span&gt;
                         erlang-runtime-tools erlang-snmp erlang-ssl &lt;span class="se"&gt;\&lt;/span&gt;
                         erlang-syntax-tools erlang-tftp erlang-tools erlang-xmerl

&lt;span class="c"&gt;# 6. Install rabbitmq-server&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;rabbitmq-server &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;--fix-missing&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The steps 1, 2 and 3, install basic tools, import the required GPG security keys, and add the official repositories (one for Erlang and one for RabbitMQ) to your system's package list.&lt;/p&gt;

&lt;p&gt;The steps 4, 5, and 5 update the package list and install all the required Erlang components and the RabbitMQ server.&lt;/p&gt;



&lt;h1&gt;
  
  
  How to install RabbitMQ on RPM-based Linux (RHEL, CentOS Stream, Fedora, Amazon Linux)
&lt;/h1&gt;

&lt;p&gt;If you're using an &lt;strong&gt;RPM-based Linux distribution&lt;/strong&gt; like &lt;strong&gt;Red Hat Enterprise Linux (RHEL), CentOS Stream, Fedora, or Amazon Linux 2023&lt;/strong&gt;, installing RabbitMQ is best done using the official package repositories maintained by the RabbitMQ team.&lt;/p&gt;

&lt;p&gt;This method ensures you get the &lt;strong&gt;latest stable versions&lt;/strong&gt; of both &lt;strong&gt;Erlang&lt;/strong&gt; (which RabbitMQ is built on) and the RabbitMQ server itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install Dependencies
&lt;/h3&gt;

&lt;p&gt;RabbitMQ requires a few essential packages to manage repositories and fetch software.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# For RHEL/CentOS Stream/Fedora/Amazon Linux&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; curl gnupg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Install Erlang/OTP
&lt;/h3&gt;

&lt;p&gt;RabbitMQ is written in Erlang. You must install a compatible, modern version of Erlang/OTP &lt;em&gt;before&lt;/em&gt; installing the RabbitMQ server package. The official RabbitMQ team provides a dedicated repository for this.&lt;/p&gt;

&lt;p&gt;First, import the GPG key used to verify the authenticity of the Erlang packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Import the Erlang signing key&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;rpm &lt;span class="nt"&gt;--import&lt;/span&gt; &lt;span class="s1"&gt;'https://keyserver.ubuntu.com/pks/lookup?op=get&amp;amp;search=0xf77f1eda57ebb1cc'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, add the repository configuration file to your system. This file tells your package manager (YUM/DNF) where to find the correct Erlang packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add the Erlang repository file&lt;/span&gt;
&lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/yum.repos.d/rabbitmq-erlang.repo &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
[rabbitmq-erlang]
name=rabbitmq-erlang
baseurl=https://packagecloud.io/rabbitmq/erlang/el/8/&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="sh"&gt;basearch
repo_gpgcheck=1
gpgcheck=1
enabled=1
gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you can install the required Erlang package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Erlang/OTP&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; erlang
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Install RabbitMQ Server
&lt;/h3&gt;

&lt;p&gt;With Erlang successfully installed, you can now add and install the RabbitMQ server.&lt;/p&gt;

&lt;p&gt;Import the GPG key used to verify the RabbitMQ server packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Import the RabbitMQ signing key&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;rpm &lt;span class="nt"&gt;--import&lt;/span&gt; &lt;span class="s1"&gt;'https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the RabbitMQ server repository configuration file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add the RabbitMQ repository file&lt;/span&gt;
&lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/yum.repos.d/rabbitmq-server.repo &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
[rabbitmq-server]
name=rabbitmq-server
baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/8/&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="sh"&gt;basearch
repo_gpgcheck=1
gpgcheck=1
enabled=1
gpgkey=https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, install the RabbitMQ server package.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install RabbitMQ Server&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;yum &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; rabbitmq-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4: Manage the Service
&lt;/h3&gt;

&lt;p&gt;After installation, you need to start the RabbitMQ service and ensure it starts automatically after a reboot.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;systemctl&lt;/code&gt; to start the service and enable it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Start the RabbitMQ service&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start rabbitmq-server

&lt;span class="c"&gt;# Enable RabbitMQ to start automatically on boot&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;rabbitmq-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can check the service status to confirm it's running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check the status of the service&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status rabbitmq-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just like on Ubuntu, the useful &lt;strong&gt;Web Management Plugin&lt;/strong&gt; is not enabled by default. To get the graphical dashboard (which runs on port &lt;code&gt;15672&lt;/code&gt;), enable the plugin and restart the service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable the web management plugin&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;rabbitmq-plugins &lt;span class="nb"&gt;enable &lt;/span&gt;rabbitmq_management

&lt;span class="c"&gt;# Restart the service to apply the plugin changes&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart rabbitmq-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can now access the dashboard at &lt;strong&gt;&lt;a href="http://localhost:15672" rel="noopener noreferrer"&gt;http://localhost:15672&lt;/a&gt;&lt;/strong&gt; using the default credentials: &lt;code&gt;guest&lt;/code&gt;/&lt;code&gt;guest&lt;/code&gt;.&lt;/p&gt;



&lt;h1&gt;
  
  
  How to install RabbitMQ admin dashboard in Linux?
&lt;/h1&gt;

&lt;p&gt;By default, RabbitMQ is managed only via the command line. To get the friendly web interface (the Management Plugin), you need to enable it using a simple command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;rabbitmq-plugins &lt;span class="nb"&gt;enable &lt;/span&gt;rabbitmq_management
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the plugin is enabled, you can access the dashboard in your web browser.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; Go to &lt;strong&gt;&lt;a href="http://localhost:15672" rel="noopener noreferrer"&gt;http://localhost:15672&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default Login:&lt;/strong&gt; Use the default, out-of-the-box credentials:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Username:&lt;/strong&gt; &lt;code&gt;guest&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password:&lt;/strong&gt; &lt;code&gt;guest&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;The administration screen allows you to easily &lt;strong&gt;monitor&lt;/strong&gt; the volume of messages (Ready vs. Unacknowledged), check active &lt;strong&gt;Connections&lt;/strong&gt; and &lt;strong&gt;Queues&lt;/strong&gt;, and view server resources like &lt;strong&gt;Memory&lt;/strong&gt; and &lt;strong&gt;Disk space&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F86ejj0jel7hh91g32ylu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F86ejj0jel7hh91g32ylu.png" alt="RabbitMQ web administration screen" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h2&gt;
  
  
  Configuring RabbitMQ users
&lt;/h2&gt;

&lt;p&gt;To add a user in RabbitMQ you can use web management or command line with the below command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;rabbitmqctl add_user your_user your_password
    Adding user &lt;span class="s2"&gt;"your_user"&lt;/span&gt; ...
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;rabbitmqctl set_user_tags your_user administrator
    Setting tags &lt;span class="k"&gt;for &lt;/span&gt;user &lt;span class="s2"&gt;"your_user"&lt;/span&gt; to &lt;span class="o"&gt;[&lt;/span&gt;administrator] ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or using web management tool:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fmikx5svnfk047395dc8t.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fmikx5svnfk047395dc8t.jpg" alt="RabbitMQ web management tool UI" width="800" height="649"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To change the password for an existing user, you can use the below command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;rabbitmqctl change_password guest guest123@#
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h1&gt;
  
  
  Installing RabbitMQ on Windows (Using the Installer)
&lt;/h1&gt;

&lt;p&gt;The easiest and most common way to install RabbitMQ on a Windows system is by using the official &lt;strong&gt;Windows Installer (.exe)&lt;/strong&gt;. Remember that &lt;strong&gt;Erlang&lt;/strong&gt; must be installed first, as RabbitMQ is built using the Erlang language.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install Erlang/OTP (The Prerequisite)
&lt;/h3&gt;

&lt;p&gt;RabbitMQ relies entirely on the Erlang platform to run. You must install Erlang before installing RabbitMQ.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Download Erlang:&lt;/strong&gt; Go to the official Erlang website and download the latest 64-bit installer for Windows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run the Installer:&lt;/strong&gt; Execute the downloaded file. Follow the installation prompts, usually accepting the default options.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tip:&lt;/strong&gt; It is highly recommended to run the installer using an &lt;strong&gt;administrative account&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: Install RabbitMQ Server
&lt;/h3&gt;

&lt;p&gt;Once Erlang is successfully installed, you can install the RabbitMQ server.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Download RabbitMQ:&lt;/strong&gt; Visit the official RabbitMQ Downloads page and get the latest RabbitMQ Server Windows installer (.exe file).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run the Installer:&lt;/strong&gt; Double-click the downloaded file. The installer will install RabbitMQ as a &lt;strong&gt;Windows Service&lt;/strong&gt; and start it automatically using the default configuration.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 3: Enable the Web Management Dashboard
&lt;/h3&gt;

&lt;p&gt;By default, RabbitMQ is managed via the command line. To get the graphical web interface, you need to enable the management plugin.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open Command Prompt (Admin):&lt;/strong&gt; Search for &lt;code&gt;cmd&lt;/code&gt;, right-click, and select &lt;strong&gt;"Run as administrator"&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Run the Plugin Command:&lt;/strong&gt; Execute the following command to activate the plugin.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rabbitmq-plugins &lt;span class="nb"&gt;enable &lt;/span&gt;rabbitmq_management
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Restart the Service:&lt;/strong&gt; The service needs to be restarted for the plugin to take effect.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Stop the service&lt;/span&gt;
rabbitmq-service stop

&lt;span class="c"&gt;# Start the service&lt;/span&gt;
rabbitmq-service start
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 4: Access the Dashboard
&lt;/h3&gt;

&lt;p&gt;You can now access the management interface through your web browser.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;URL:&lt;/strong&gt; Go to &lt;strong&gt;&lt;a href="http://localhost:15672" rel="noopener noreferrer"&gt;http://localhost:15672&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default Login:&lt;/strong&gt; The default username is &lt;strong&gt;&lt;code&gt;guest&lt;/code&gt;&lt;/strong&gt; and the password is &lt;strong&gt;&lt;code&gt;guest&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This dashboard lets you monitor connections, queues, message rates, and server health.&lt;/p&gt;

&lt;p&gt;If you're interested in alternative methods, you can also install RabbitMQ on Windows using the &lt;a href="https://www.google.com/search?q=https://www.rabbitmq.com/docs/install-windows%23chocolatey" rel="noopener noreferrer"&gt;Chocolatey package manager&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This video shows a step-by-step guide on &lt;a href="https://www.youtube.com/watch?v=V9DWKbalbWQ" rel="noopener noreferrer"&gt;How to install #RabbitMQ on windows 10 step by step&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That's all, folks!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>eventdriven</category>
      <category>cloud</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>How to Create an SSH Key and configure key-based authenication on your linux server</title>
      <dc:creator>Altair Lage</dc:creator>
      <pubDate>Wed, 11 Mar 2026 19:51:14 +0000</pubDate>
      <link>https://forem.com/altairlage/how-to-create-an-ssh-key-and-configure-key-based-authenication-on-your-linux-server-4fc3</link>
      <guid>https://forem.com/altairlage/how-to-create-an-ssh-key-and-configure-key-based-authenication-on-your-linux-server-4fc3</guid>
      <description>&lt;h1&gt;
  
  
  Intro
&lt;/h1&gt;

&lt;p&gt;SSH is an encrypted protocol used to communicate with and administer servers. It is very often used to access and manage Linux servers remotely. If you manage Linux systems regularly, you will probably spend a lot of time working in a terminal connected through SSH.&lt;/p&gt;

&lt;p&gt;While there are a few different ways to log in to an SSH server, in this guide, I’ll focus on setting up SSH keys. SSH keys provide an extremely secure way to log in to your server. For this reason, this is the method I recommend for all users.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;SSH keys are a more secure way to authenticate than passwords. Password-based authentication can be vulnerable to brute-force attacks, but SSH keys rely on cryptographic key pairs that significantly improve the security of server access.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SSH authentication works with a public–private key pair. The private key stays on the client machine and must always remain secret. The &lt;strong&gt;public key&lt;/strong&gt; is placed on the server in the &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; file, which allows the server to recognize and authenticate the client.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SSH keys are generated with the &lt;code&gt;ssh-keygen&lt;/code&gt; utility. The OpenSSH tool &lt;code&gt;ssh-keygen&lt;/code&gt; creates a pair of keys that are usually stored in the &lt;code&gt;~/.ssh&lt;/code&gt; directory (for example, &lt;code&gt;id_rsa&lt;/code&gt; and &lt;code&gt;id_rsa.pub&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can add a passphrase to protect the private key. Encrypting the private key with a passphrase adds an extra layer of security. This means that even if someone gains access to the key file, they still cannot use it without the passphrase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The public key must be copied to the server for authentication to work. The most common way to do this is with the &lt;code&gt;ssh-copy-id&lt;/code&gt; command, which automatically installs the public key in the server’s &lt;code&gt;authorized_keys&lt;/code&gt; file. You can also copy the key by piping it through SSH or by adding it manually.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After the public key is installed, you can log in without using a password. The server verifies that the client has the matching private key, and if the verification succeeds, it allows access without asking for the account password.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once SSH keys are configured, password authentication should be disabled. By editing &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; and setting &lt;code&gt;PasswordAuthentication no&lt;/code&gt;, you reduce the risk of brute-force attacks against the server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hardware Security Modules (HSMs) can make SSH keys even more secure. HSMs store private keys inside tamper-resistant hardware, which prevents them from being stolen or exposed, even if the system itself is compromised.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  How Do SSH Keys Work?
&lt;/h1&gt;

&lt;p&gt;An SSH server can authenticate clients using several different methods. The most basic one is password authentication. It is simple and widely supported, but it is not the most secure option.&lt;/p&gt;

&lt;p&gt;Even though passwords are sent to the server through a secure channel, they are often not long or complex enough to resist some attacks. With the modern computing power and automated scripts, brute-force attacks against password-protected accounts are a reality. There are ways to add extra protection, but SSH keys offer a much more reliable and secure alternative.&lt;/p&gt;

&lt;p&gt;SSH key pairs are two cryptographically secure keys that allow a client to authenticate to an SSH server. Each pair is made up of a public key and a private key.&lt;/p&gt;

&lt;p&gt;The private key stays on the client machine and must always remain completely secret. If the private key is compromised, an attacker could log in to any server that has the corresponding public key configured, without needing additional authentication. For extra protection, the private key can also be encrypted on disk using a passphrase.&lt;/p&gt;

&lt;p&gt;The public key, on the other hand, can be shared freely without causing security issues. During authentication, SSH uses the key pair to prove that the client owns the private key without ever sending the private key over the network. In practice, the client signs a piece of data using the private key, and the server verifies that signature using the public key.&lt;/p&gt;

&lt;p&gt;To enable this authentication method, the public key must be uploaded to the remote server you want to access. The key is stored in a special file inside the user account you will use to log in, called &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When a client attempts to connect using SSH keys, the server checks whether the client can prove it owns the corresponding private key. If the client successfully proves ownership, the server grants access by starting a shell session or by executing the requested command.&lt;br&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  1. Creating SSH Keys
&lt;/h1&gt;

&lt;p&gt;The first step in setting up SSH key authentication for your server is to generate an SSH key pair on your local computer.&lt;/p&gt;

&lt;p&gt;To do this, we use a utility called &lt;code&gt;ssh-keygen&lt;/code&gt;, which is included in the standard OpenSSH suite of tools. By default, this command generates a 3072-bit RSA key pair.&lt;/p&gt;

&lt;p&gt;On your local machine, create the SSH key pair by running the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;OutputGenerating public/private rsa key pair.
Enter file &lt;span class="k"&gt;in &lt;/span&gt;which to save the key &lt;span class="o"&gt;(&lt;/span&gt;/home/username/.ssh/id_rsa&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The utility will then ask you to choose a location where the generated keys should be saved. By default, the keys are stored in the &lt;code&gt;~/.ssh&lt;/code&gt; directory inside your user’s home folder. The private key is named &lt;code&gt;id_rsa&lt;/code&gt;, and the matching public key is named &lt;code&gt;id_rsa.pub&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In most cases, it is best to keep the default location. This allows your SSH client to automatically find and use your SSH keys when it tries to authenticate. If you want to store the keys in a different location, you can type the new path now. Otherwise, simply press &lt;strong&gt;ENTER&lt;/strong&gt; to accept the default.&lt;/p&gt;

&lt;p&gt;If you have already generated an SSH key pair in the past, you may see a prompt like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Output/home/username/.ssh/id_rsa already exists.
Overwrite &lt;span class="o"&gt;(&lt;/span&gt;y/n&lt;span class="o"&gt;)&lt;/span&gt;?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you choose to overwrite the key on disk, you will &lt;strong&gt;not&lt;/strong&gt; be able to authenticate using the previous key anymore. Be very careful when selecting yes, as this is a destructive process that cannot be reversed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;OutputCreated directory &lt;span class="s1"&gt;'/home/username/.ssh'&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
Enter passphrase &lt;span class="o"&gt;(&lt;/span&gt;empty &lt;span class="k"&gt;for &lt;/span&gt;no passphrase&lt;span class="o"&gt;)&lt;/span&gt;:
Enter same passphrase again:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, the utility will ask you to enter a passphrase for the key. This is optional and is used to encrypt the private key file stored on your disk. You might wonder what the advantage of using an SSH key is if you still need to type a passphrase. In practice, SSH keys still provide several important security benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The private SSH key (the part that can be protected with a passphrase) is &lt;strong&gt;never sent over the network&lt;/strong&gt;. The passphrase is only used locally to decrypt the key on your machine. Because of this, attackers cannot attempt network-based brute-force attacks against the passphrase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The private key is stored in a &lt;strong&gt;restricted directory&lt;/strong&gt;. The SSH client will ignore private keys that are not located in secure directories. In addition, the key file itself must have restricted permissions (read and write only for the owner). This prevents other users on the same system from accessing or inspecting your key.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Any attacker trying to crack the private SSH key passphrase must already have &lt;strong&gt;local access to your system&lt;/strong&gt;. In other words, they would already need access to your user account or even the root account. If that happens, the passphrase can still slow them down and prevent immediate access to your other servers. This gives you time to generate a new SSH key pair and remove the compromised key.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Because the private key is never exposed to the network and is protected by strict file permissions, it should never be accessible to anyone except you (and the root user). The passphrase adds another layer of protection in case these safeguards are somehow bypassed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Adding a passphrase is optional. If you set one, you will need to enter it each time you use the key, unless you are using an SSH agent that stores the decrypted key in memory. In most cases, using a passphrase is recommended. However, if you prefer not to set one, you can simply press &lt;strong&gt;ENTER&lt;/strong&gt; to skip this step.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;OutputYour identification has been saved &lt;span class="k"&gt;in&lt;/span&gt; /home/username/.ssh/id_rsa.
Your public key has been saved &lt;span class="k"&gt;in&lt;/span&gt; /home/username/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:CAjsV9M/tt5skazroTc1ZRGCBz+kGtYUIPhRvvZJYBs username@hostname
The key&lt;span class="s1"&gt;'s randomart image is:
+---[RSA 3072]----+
|o   ..oo.++o ..  |
| o o +o.o.+...   |
|. . + oE.o.o  .  |
| . . oo.B+  .o   |
|  .   .=S.+ +    |
|      . o..*     |
|        .+= o    |
|        .=.+     |
|       .oo+      |
+----[SHA256]-----+
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You now have a public and private key that you can use to authenticate. The next step is to place the public key on your server so that you can use SSH key authentication to log in.&lt;br&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  2. Copying an SSH Public Key to Your Server
&lt;/h1&gt;

&lt;p&gt;There are several ways to upload your public key to a remote SSH server. The method you choose mainly depends on the tools available on your system and your current server configuration.&lt;/p&gt;

&lt;p&gt;All of the methods below achieve the same result. The first method is the simplest and most automated. The methods that follow require a bit more manual. You should only use them if you are unable to use the earlier ones.&lt;br&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Copying Your Public Key Using  &lt;code&gt;ssh-copy-id&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The easiest way to copy your public key to a server is by using a utility called &lt;code&gt;ssh-copy-id&lt;/code&gt;. Because it is simple and mostly automated, this is the recommended method when it is available.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;ssh-copy-id&lt;/code&gt; tool is included in the OpenSSH packages on many Linux distributions, so it may already be installed on your system. For this method to work, you must currently be able to access the server using password-based SSH authentication.&lt;/p&gt;

&lt;p&gt;To use this utility, you need to specify the remote host you want to connect to and the user account that has SSH password access. This is the account where your public SSH key will be copied.&lt;/p&gt;

&lt;p&gt;The syntax is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-copy-id username@remote_host
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may see a message like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;The authenticity of host &lt;span class="s1"&gt;'203.0.113.1 (203.0.113.1)'&lt;/span&gt; can&lt;span class="s1"&gt;'t be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This message means that your local computer does not yet recognize the remote host. It usually appears the first time you try to connect to a new server. Type &lt;code&gt;yes&lt;/code&gt; and press &lt;strong&gt;ENTER&lt;/strong&gt; to continue.&lt;/p&gt;

&lt;p&gt;Next, the utility will check your local account for the &lt;code&gt;id_rsa.pub&lt;/code&gt; key that we created earlier. Once it finds the key, it will ask you for the password of the remote user’s account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/usr/bin/ssh-copy-id: INFO: attempting to log &lt;span class="k"&gt;in &lt;/span&gt;with the new key&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;, to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; remain to be installed &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;you are prompted now it is to &lt;span class="nb"&gt;install &lt;/span&gt;the new keys
username@203.0.113.1&lt;span class="s1"&gt;'s password:
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Type the password (your typing will not appear on the screen for security reasons) and press &lt;strong&gt;ENTER&lt;/strong&gt;. The utility will connect to the remote host using the password you provided. It will then copy the contents of your &lt;code&gt;~/.ssh/id_rsa.pub&lt;/code&gt; key into a file called &lt;code&gt;authorized_keys&lt;/code&gt;, located in the &lt;code&gt;~/.ssh&lt;/code&gt; directory of the remote account.&lt;/p&gt;

&lt;p&gt;You should see output similar to the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Number of key&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; added: 1

Now try logging into the machine, with:   &lt;span class="s2"&gt;"ssh 'username@203.0.113.1'"&lt;/span&gt;
and check to make sure that only the key&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; you wanted were added.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, your &lt;code&gt;id_rsa.pub&lt;/code&gt; key has been successfully uploaded to the remote account. You can now move on to the next section.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copying Your Public Key Using SSH
&lt;/h2&gt;

&lt;p&gt;If &lt;code&gt;ssh-copy-id&lt;/code&gt; is not available, but you still have password-based SSH access to your server, you can upload your key using a standard SSH command.&lt;/p&gt;

&lt;p&gt;The idea is simple. We display the contents of the public SSH key on our local machine and pipe that output through an SSH connection to the remote server. On the remote side, we make sure the &lt;code&gt;~/.ssh&lt;/code&gt; directory exists for the user account, and then we write the received key into a file called &lt;code&gt;authorized_keys&lt;/code&gt; inside that directory.&lt;/p&gt;

&lt;p&gt;We use the &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt; redirect operator so the key is &lt;strong&gt;appended&lt;/strong&gt; to the file instead of replacing its contents. This allows you to add new keys without removing any keys that were previously added.&lt;/p&gt;

&lt;p&gt;The complete command looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_rsa.pub | ssh username@remote_host &lt;span class="s2"&gt;"mkdir -p ~/.ssh &amp;amp;&amp;amp; cat &amp;gt;&amp;gt; ~/.ssh/authorized_keys"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may see a message like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;The authenticity of host &lt;span class="s1"&gt;'203.0.113.1 (203.0.113.1)'&lt;/span&gt; can&lt;span class="s1"&gt;'t be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This message means that your local computer does not yet recognize the remote host. This usually happens the first time you connect to a new server. Type &lt;code&gt;yes&lt;/code&gt; and press &lt;strong&gt;ENTER&lt;/strong&gt; to continue.&lt;/p&gt;

&lt;p&gt;After that, you will be prompted to enter the password for the account you are trying to connect to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;username@203.0.113.1&lt;span class="s1"&gt;'s password:
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After you enter your password, the contents of your &lt;code&gt;id_rsa.pub&lt;/code&gt; key will be appended to the &lt;code&gt;authorized_keys&lt;/code&gt; file in the remote user’s account.&lt;br&gt;
If the process completes successfully, you can move on to the next section.&lt;br&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Copying Your Public Key Manually
&lt;/h2&gt;

&lt;p&gt;If password-based SSH access to your server is not available, you will need to perform the previous process manually.&lt;br&gt;
In this case, the contents of your &lt;code&gt;id_rsa.pub&lt;/code&gt; file must be added to the &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; file on the remote machine by another method.&lt;/p&gt;

&lt;p&gt;To display the contents of your &lt;code&gt;id_rsa.pub&lt;/code&gt; key on your local computer, run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_rsa.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will see the key’s content, which may look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ&lt;span class="o"&gt;==&lt;/span&gt; username@hostname
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Access your remote host using any method that is available to you. For example, you might use a web-based console provided by your infrastructure or hosting provider.&lt;/p&gt;

&lt;p&gt;Once you have access to your account on the remote server, make sure the &lt;code&gt;~/.ssh&lt;/code&gt; directory exists. The following command will create the directory if it does not exist, or do nothing if it is already present:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/.ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can create or update the &lt;code&gt;authorized_keys&lt;/code&gt; file inside this directory. Add the contents of your &lt;code&gt;id_rsa.pub&lt;/code&gt; file to the end of the &lt;code&gt;authorized_keys&lt;/code&gt; file. If the file does not exist yet, it will be created automatically. You can do this with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo &lt;/span&gt;public_key_string &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the command above, replace &lt;code&gt;public_key_string&lt;/code&gt; with the output from the &lt;code&gt;cat ~/.ssh/id_rsa.pub&lt;/code&gt; command that you ran on your local machine. The key should start with something like &lt;code&gt;ssh-rsa AAAA...&lt;/code&gt; or a similar prefix.&lt;/p&gt;

&lt;p&gt;If everything worked correctly, you can move on to test your new SSH key-based authentication.&lt;br&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Authenticating to Your Server Using SSH Keys
&lt;/h1&gt;

&lt;p&gt;If you completed one of the procedures above successfully, you should now be able to log in to the remote host without using the account password.&lt;/p&gt;

&lt;p&gt;The process is almost the same as before:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh username@remote_host
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If this is your first time connecting to this host (if you used the last method above), you may see something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;The authenticity of host &lt;span class="s1"&gt;'203.0.113.1 (203.0.113.1)'&lt;/span&gt; can&lt;span class="s1"&gt;'t be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This message means that your local computer does not yet recognize the remote host. Type &lt;code&gt;yes&lt;/code&gt; and press &lt;strong&gt;ENTER&lt;/strong&gt; to continue.&lt;/p&gt;

&lt;p&gt;If you did not set a passphrase for your private key, you will be logged in immediately. If you did set a passphrase when creating the key, you will be prompted to enter it now. After that, a new shell session will start for your account on the remote server.&lt;/p&gt;

&lt;p&gt;If everything works as expected, you can continue to the next step and learn how to further secure your server.&lt;br&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Connecting with a Specific SSH Key
&lt;/h2&gt;

&lt;p&gt;In most situations, the SSH client automatically looks for keys inside the &lt;code&gt;~/.ssh&lt;/code&gt; directory and tries them when connecting to a server. However, sometimes you may want to explicitly specify which key should be used. This is very common when you manage multiple servers or use different keys for different environments.&lt;/p&gt;

&lt;p&gt;In these cases, you can pass the private key file directly to the SSH command using the &lt;code&gt;-i&lt;/code&gt; option.&lt;/p&gt;

&lt;p&gt;Let’s walk through a complete example.&lt;/p&gt;

&lt;p&gt;First, generate a new SSH key pair using &lt;code&gt;ssh-keygen&lt;/code&gt;. In this example, we will create a key called &lt;code&gt;my_server_key&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa &lt;span class="nt"&gt;-b&lt;/span&gt;  3072  &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.ssh/my_server_key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will see prompts similar to the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Generating public/private rsa key pair.
Enter passphrase &lt;span class="o"&gt;(&lt;/span&gt;empty &lt;span class="k"&gt;for &lt;/span&gt;no passphrase&lt;span class="o"&gt;)&lt;/span&gt;:
Enter same passphrase again:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After the command finishes, two files will be created:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;~/.ssh/my_server_key&lt;/code&gt; → your &lt;strong&gt;private key&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;~/.ssh/my_server_key.pub&lt;/code&gt; → your &lt;strong&gt;public key&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The private key must remain on your local machine and should never be shared.&lt;/p&gt;

&lt;p&gt;Next, copy the public key to the server so that the server can recognize your client during authentication. For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-copy-id &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/my_server_key.pub user@your_server_ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the key has been installed in the server’s &lt;code&gt;authorized_keys&lt;/code&gt; file, you can connect using the private key by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh  &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/my_server_key user@your_server_ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this command, SSH will use the specified private key when attempting authentication. If the server finds the matching public key in the &lt;code&gt;authorized_keys&lt;/code&gt; file, the login will succeed without asking for the account password.&lt;/p&gt;

&lt;p&gt;If your private key is protected with a passphrase, SSH will prompt you to enter it locally in order to unlock the key before the connection is established.&lt;/p&gt;

&lt;p&gt;Using the &lt;code&gt;-i&lt;/code&gt; option is especially useful when you maintain several keys for different servers, environments, or clients. It gives you full control over which key is used for each connection.&lt;br&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  4. Disabling Password Authentication on Your Server
&lt;/h1&gt;

&lt;p&gt;If you were able to log in to your account using SSH without entering a password, then SSH key-based authentication has been successfully configured for your account. However, password authentication is still enabled, which means the server can still be targeted by brute-force attacks.&lt;/p&gt;

&lt;p&gt;Before continuing with the steps in this section, make sure that one of the following conditions is true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSH key-based authentication is configured for the &lt;strong&gt;root account&lt;/strong&gt; on the server, or preferably&lt;/li&gt;
&lt;li&gt;SSH key-based authentication is configured for a &lt;strong&gt;user account with sudo privileges&lt;/strong&gt; (this is the recommended approach).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next step will disable password-based logins, so it is critical to ensure that you will still have administrative access to the server.&lt;/p&gt;

&lt;p&gt;Once you have confirmed this, log in to your remote server using SSH keys, either as &lt;strong&gt;root&lt;/strong&gt; or as a user with &lt;strong&gt;sudo privileges&lt;/strong&gt;. Then open the SSH daemon configuration file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inside the file, look for a directive called &lt;code&gt;PasswordAuthentication&lt;/code&gt;. In some cases, this line may be commented out. If it is, remove the &lt;code&gt;#&lt;/code&gt; at the beginning of the line and set the value to &lt;code&gt;no&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This change disables the ability to log in through SSH using account passwords:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;PasswordAuthentication no
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the file and close it when you are done. To apply the changes you just made, you need to restart the SSH service.&lt;/p&gt;

&lt;p&gt;On most Linux distributions, you can do this with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Success!&lt;/strong&gt;&lt;br&gt;
After completing this step, you’ve successfully transitioned your SSH daemon to only respond to SSH keys.&lt;br&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  Th-th-th-that's all, folks!
&lt;/h1&gt;

&lt;p&gt;At this point, SSH key-based authentication should be properly set up on your server. This means you can now log in without typing your account password each time you connect.&lt;/p&gt;

&lt;p&gt;From here, you have several directions you can explore next. If you want to deepen your understanding of SSH and learn more about how to work with it, check out the following tutorials:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/enterprise-cloud@latest/authentication/connecting-to-github-with-ssh/about-ssh" rel="noopener noreferrer"&gt;About SSH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt; &lt;a href="https://docs.github.com/pt/enterprise-cloud@latest/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent" rel="noopener noreferrer"&gt;Generating a new SSH key and adding it to the ssh-agent&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.digitalocean.com/community/tutorials/how-to-use-ssh-to-connect-to-a-remote-server" rel="noopener noreferrer"&gt;How To Use SSH to Connect to a Remote Server&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>devops</category>
      <category>linux</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>Unraveling RabbitMQ: How to Scale Systems with Queues</title>
      <dc:creator>Altair Lage</dc:creator>
      <pubDate>Thu, 29 Jan 2026 19:42:45 +0000</pubDate>
      <link>https://forem.com/altairlage/unraveling-rabbitmq-how-to-scale-systems-with-queues-3531</link>
      <guid>https://forem.com/altairlage/unraveling-rabbitmq-how-to-scale-systems-with-queues-3531</guid>
      <description>&lt;p&gt;Why do decoupled and scalable systems need a message broker?&lt;/p&gt;

&lt;p&gt;This question guides this entire article, where we explore RabbitMQ, one of the most popular and mature message brokers in the open-source ecosystem. We will explore the fundamental concepts, the benefits that RabbitMQ offers, and in practice, show, through examples and code, how to send and consume messages.&lt;/p&gt;



&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Monolithic systems require all modules to “talk” directly to each other, creating strong dependencies and fragility. However, as applications grow and become increasingly distributed, the need to decouple components and services increases. This is why systems based on microservices architecture are growing.&lt;/p&gt;

&lt;p&gt;In this type of architecture, a message broker acts as an intermediary between systems or microservices (producers and consumers): it receives messages from those who publish events and messages, and guarantees their delivery to those who consume and process them, in an asynchronous manner, allowing different parts of an application or separate systems to exchange information efficiently, even when they are not available at the same time.&lt;/p&gt;

&lt;p&gt;In addition, it helps solve scalability and reliability problems and allows the integration of services developed in different languages.&lt;/p&gt;

&lt;p&gt;The RabbitMQ architecture is simple: &lt;strong&gt;producers&lt;/strong&gt; send messages to components called &lt;strong&gt;exchanges&lt;/strong&gt;, which act as &lt;strong&gt;routers&lt;/strong&gt;. The exchanges are configured with specific &lt;strong&gt;rules&lt;/strong&gt; that determine which &lt;strong&gt;queues&lt;/strong&gt; the messages should be sent to. Each &lt;strong&gt;queue&lt;/strong&gt;, in turn, is consumed by one or more &lt;strong&gt;consumers&lt;/strong&gt;, who read and process the messages according to their business logic.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ffs3l9a38iqn5ak26bbt4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ffs3l9a38iqn5ak26bbt4.png" alt=" " width="700" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RabbitMQ implements the AMQP (Advanced Message Queuing Protocol) protocol, is written in Erlang and adopts a multithreaded architecture, which allows high concurrency.&lt;/p&gt;

&lt;p&gt;The management interface makes the tool attractive for simple maintenance and monitoring of queues, messages and connections.&lt;/p&gt;



&lt;h2&gt;
  
  
  Usage Examples
&lt;/h2&gt;

&lt;p&gt;One of the main practical applications of RabbitMQ is in e-commerce order processing. It is also widely used in system integration in various sectors, such as logistics, transport, and billing. It allows heterogeneous systems to share data reliably and in an organized manner, even in highly complex scenarios.&lt;/p&gt;

&lt;p&gt;Imagine an online shopping scenario. When an order is placed, a &lt;strong&gt;message&lt;/strong&gt; is sent to a distribution &lt;strong&gt;queue&lt;/strong&gt;, where the service responsible for stock &lt;strong&gt;consumes&lt;/strong&gt; it and confirms the product's availability. Another &lt;strong&gt;message&lt;/strong&gt; can be sent to the transport queue, where the logistics system organizes delivery. Simultaneously, a &lt;strong&gt;message&lt;/strong&gt; is processed in the billing &lt;strong&gt;queue&lt;/strong&gt;, generating the invoice. This efficient and asynchronous organization avoids delays and promotes greater flexibility in communication between systems. The separation into queues ensures that each service works independently and scalably.&lt;/p&gt;



&lt;h2&gt;
  
  
  Asynchronous Nature
&lt;/h2&gt;

&lt;p&gt;RabbitMQ uses an &lt;strong&gt;asynchronous&lt;/strong&gt; pattern, allowing messages to be processed independently of the consumer's execution time. This means that &lt;strong&gt;producers&lt;/strong&gt; can publish messages without having to wait for &lt;strong&gt;consumers&lt;/strong&gt; to process them immediately. This approach decouples systems, ensuring that the data flow continues to flow even when consumers are temporarily unavailable or dealing with high workloads.&lt;/p&gt;

&lt;p&gt;This operating model is ideal for distributed systems, allowing scalability, flexibility, and resilience in message processing. With the ability to organize and prioritize message traffic, RabbitMQ becomes an assertive solution for implementing asynchronous architectures in various types of applications.&lt;/p&gt;



&lt;h1&gt;
  
  
  Benefits of RabbitMQ
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Decoupling between components and systems:&lt;/strong&gt; the producer does not directly know the consumer. This facilitates the maintenance and evolution of the system, as new consumers can be added without changing who produces the messages.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resilience and fault tolerance:&lt;/strong&gt; messages can be stored persistently. If a consumer fails, the messages remain in the queue until it or another consumer processes them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Horizontal scalability:&lt;/strong&gt; it is possible to add new workers to process messages as demand increases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integration of heterogeneous systems:&lt;/strong&gt; RabbitMQ supports several languages (Python, Java, Ruby, Go, etc.), making it ideal for microservices architectures.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reliability and performance:&lt;/strong&gt; delivery confirmation, acknowledgment control, durable queues, and high throughput contribute to making systems robust.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexibility:&lt;/strong&gt; different types of exchanges (direct, topic, fanout, headers) allow for varied routing patterns.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Monitoring and management:&lt;/strong&gt; the web administration interface provides graphs and statistics of messages, connections, channels, exchanges, and queues, facilitating operations.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;h1&gt;
  
  
  Fundamental Concepts
&lt;/h1&gt;

&lt;p&gt;This section covers the fundamental concepts of RabbitMQ and messaging in general.&lt;/p&gt;



&lt;h2&gt;
  
  
  Message
&lt;/h2&gt;

&lt;p&gt;RabbitMQ is a message-queueing software, meaning a message is the information to be &lt;strong&gt;queued&lt;/strong&gt; and sent to the consumer service. A message can include &lt;strong&gt;any type of information&lt;/strong&gt;. For example, it can contain information about a process or task that must be started in another application (which may even be on another server), a JSON with some system entity data, or it can just be a simple text message.&lt;/p&gt;



&lt;h2&gt;
  
  
  Producer
&lt;/h2&gt;

&lt;p&gt;In the RabbitMQ context, a Producer is the system or application responsible for creating and sending messages to the &lt;strong&gt;broker&lt;/strong&gt; in an &lt;strong&gt;exchange&lt;/strong&gt;. It acts as the starting point in the messaging flow, generating information that needs to be processed or shared by other systems or services.&lt;/p&gt;

&lt;p&gt;Producers do not interact directly with the &lt;strong&gt;queues&lt;/strong&gt; where messages are stored. Instead, they send messages to the &lt;strong&gt;exchanges&lt;/strong&gt;, which have the function of &lt;strong&gt;routing them&lt;/strong&gt; to the appropriate &lt;strong&gt;queues&lt;/strong&gt; based on the configured &lt;strong&gt;routing rules&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In an e-commerce application, for example, the system responsible for registering new orders acts as a &lt;strong&gt;producer&lt;/strong&gt;, sending messages to an exchange. These messages may contain order information, such as the ID, purchased items, and customer data. The &lt;strong&gt;exchange&lt;/strong&gt; then &lt;strong&gt;routes&lt;/strong&gt; these messages to specific &lt;strong&gt;queues&lt;/strong&gt;, where they will be &lt;strong&gt;consumed&lt;/strong&gt; by services, such as stock control, billing, and logistics, for example.&lt;/p&gt;

&lt;p&gt;The producer's role is fundamental, as it initiates the communication process, ensuring that messages are delivered to RabbitMQ for later processing by consumers. This structure allows producers to focus only on creating and sending messages, while RabbitMQ manages the entire messaging flow.&lt;/p&gt;



&lt;h2&gt;
  
  
  Consumer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Consumers&lt;/strong&gt; are the systems or applications responsible for consuming messages from queues. They act as the recipients of messages sent by &lt;strong&gt;producers&lt;/strong&gt; and stored by the broker, processing the data according to the necessary business logic.&lt;/p&gt;

&lt;p&gt;Consumers connect to specific queues and read the available messages asynchronously, or on demand, depending on the configuration. This flexibility allows the consumer to process messages at their own pace, ensuring that the system works efficiently even in high-load scenarios.&lt;/p&gt;

&lt;p&gt;For example, in an e-commerce application, a consumer can be responsible for reading messages from an order queue and, based on this information, performing tasks such as updating inventory, generating an invoice, or triggering the shipping system.&lt;/p&gt;

&lt;p&gt;Consumers transform the messages stored in the queues into concrete actions, allowing RabbitMQ to integrate various systems and ensure fluid communication between them.&lt;/p&gt;

&lt;p&gt;It is possible to have multiple consumers competing for messages from the same queue.&lt;/p&gt;



&lt;h2&gt;
  
  
  Queue
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Queue&lt;/strong&gt; is the location where messages are temporarily stored until they are consumed. It works as a &lt;strong&gt;buffer&lt;/strong&gt; that ensures that the data sent by producers remains available to consumers, even if they are not ready to process it immediately.&lt;/p&gt;

&lt;p&gt;Queues are organized &lt;strong&gt;sequentially&lt;/strong&gt;, ensuring that messages are delivered &lt;strong&gt;in the order they were received&lt;/strong&gt;. In addition, they can be configured with different properties, such as &lt;em&gt;durability (Time-To-Live - TTL)&lt;/em&gt;, to ensure that messages remain stored even in the event of a system restart, and auto-delete when there are no consumers.&lt;/p&gt;

&lt;p&gt;Using e-commerce as an example again, messages related to new orders can be stored in a specific queue until they are consumed by stock control or payment processing services. This structure allows each consumer to process messages at their own pace, without directly depending on the producers' execution time.&lt;/p&gt;



&lt;h2&gt;
  
  
  Exchange
&lt;/h2&gt;

&lt;p&gt;It is the entity responsible for &lt;strong&gt;routing&lt;/strong&gt; messages to one or more queues. The type of exchange determines how the message will be routed.&lt;/p&gt;

&lt;p&gt;The direction of messages by an Exchange is essential to organize the message flow in distributed systems, allowing different types of data or events to be directed to the appropriate services.&lt;/p&gt;

&lt;p&gt;For example, in a logistics application, an exchange can receive messages from a producer that reports package shipping events and status updates. Based on the configured rules, the exchange can route them to different queues: one queue for the transport service and another for the tracking system.&lt;/p&gt;

&lt;p&gt;There are several types of exchanges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Direct exchange:&lt;/strong&gt; Routing based on an exact routing key. Useful for delivering a message to a specific queue.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Topic exchange:&lt;/strong&gt; Uses &lt;strong&gt;wildcards&lt;/strong&gt; in the routing key to match patterns. The character &lt;code&gt;*&lt;/code&gt; represents one word and &lt;code&gt;#&lt;/code&gt; represents zero or more words.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fanout exchange:&lt;/strong&gt; Ignores the routing key and sends the message to all queues bound to the exchange. Excellent for disseminating real-time events.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Headers exchange:&lt;/strong&gt; Routing based on attributes defined in the message headers, not on the routing key.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  Routing keys and bindings
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;routing key&lt;/strong&gt; is a string that the producer sends along with the message. The &lt;strong&gt;exchange&lt;/strong&gt; uses this key to decide which queue to deliver the message to. A &lt;strong&gt;binding&lt;/strong&gt; connects a queue to an &lt;strong&gt;exchange&lt;/strong&gt; and defines the routing rule, for example: the &lt;code&gt;logs.error&lt;/code&gt; queue can be associated with a &lt;code&gt;log.error&lt;/code&gt; &lt;strong&gt;routing key&lt;/strong&gt;. In a &lt;strong&gt;topic exchange&lt;/strong&gt;, you can use &lt;code&gt;log.*&lt;/code&gt; to receive all logs of a certain type and &lt;code&gt;log.#&lt;/code&gt; to receive all logs.&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Binding:&lt;/strong&gt; Bindings are rules that exchanges use (among other things) to route messages to queues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Routing key:&lt;/strong&gt; A key that the exchange uses to decide how to route the message to the queues. Think of the routing key as an address for the message.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  Users
&lt;/h2&gt;

&lt;p&gt;It is possible to connect to RabbitMQ with a specific username and password. Users can have associated permissions such as read, write, and configuration privileges within the instance (read, write, and configure). Users can also be given permissions for specific &lt;strong&gt;virtual hosts&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For production environments, delete the default user (guest)!&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The default user can only connect from localhost, as it has known credentials. Instead of enabling remote connections, consider creating a separate user with administrative permissions and a strong password. It is recommended to use a separate user per application. For example, if you have a mobile application, a web application, and a data aggregation system, create 3 separate users. This facilitates several things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Correlate client connections with applications.&lt;/li&gt;
&lt;li&gt;Use fine-grained permissions.&lt;/li&gt;
&lt;li&gt;Credential renewal - roll-over (for example, periodically or in case of a security breach).&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  Vhost
&lt;/h2&gt;

&lt;p&gt;RabbitMQ is a multi-tenant system: connections, exchanges, queues, bindings, user permissions, policies and other elements belong to &lt;strong&gt;virtual hosts (vhosts)&lt;/strong&gt;, logical groups of entities.&lt;/p&gt;

&lt;p&gt;Virtual hosts provide logical grouping and separation of resources. Users can have different permissions for different &lt;strong&gt;vhosts&lt;/strong&gt;, and queues and exchanges can be created to exist only in one vhost.&lt;/p&gt;

&lt;p&gt;A virtual host has a name. When a client connects to RabbitMQ, it specifies a vhost name to connect to. If authentication is successful and the provided username has permissions for the vhost, the connection will be established.&lt;/p&gt;



&lt;h2&gt;
  
  
  Communication Patterns
&lt;/h2&gt;

&lt;p&gt;In addition to the simple &lt;strong&gt;work queue&lt;/strong&gt; pattern, where several instances process tasks concurrently, there are also other patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pub/Sub (publish/subscribe)&lt;/strong&gt;: with the &lt;strong&gt;fanout exchange&lt;/strong&gt;, the same message is delivered to all consumers, useful for notification and broadcast events.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Work queues&lt;/strong&gt;: when several instances consume from the same queue, improving task distribution.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;RPC (request/reply)&lt;/strong&gt;: a client sends a message requesting a result and waits for the response in the queue indicated in the &lt;code&gt;reply_to&lt;/code&gt; header. The correlation is done by a &lt;code&gt;correlation_id&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;h1&gt;
  
  
  Installation and Configuration
&lt;/h1&gt;

&lt;p&gt;The simplest way to run RabbitMQ locally is by using Docker. Follow these steps to provision a local RabbitMQ container (run in a terminal with Docker installed):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="c"&gt;# 1. Download the official image with the management plugin&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt; docker pull rabbitmq:3.13-management

&lt;span class="c"&gt;# 2. Start the container with the default ports (5672 for AMQP and 15672 for the web interface)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt; docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; rabbitmq &lt;span class="nt"&gt;-p&lt;/span&gt; 5672:5672 &lt;span class="nt"&gt;-p&lt;/span&gt; 15672:15672 rabbitmq:3.13-management

&lt;span class="c"&gt;# 3. Check the logs (optional)&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt; docker logs &lt;span class="nt"&gt;-f&lt;/span&gt; rabbitmq

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

&lt;/div&gt;



&lt;p&gt;After a few seconds, the interface will be available at &lt;strong&gt;&lt;em&gt;&lt;a href="http://localhost:15672" rel="noopener noreferrer"&gt;http://localhost:15672&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The default login is guest/guest. On the administration screen, you can monitor the volume of messages, connections, and server resources.&lt;/p&gt;

&lt;p&gt;You can also create new users and configure permissions.&lt;/p&gt;



&lt;h2&gt;
  
  
  Optional: creating users and queues via script
&lt;/h2&gt;

&lt;p&gt;If you want to automate the creation of queues and users, or avoid using the graphical interface, you can use commands via the HTTP API, as in the examples below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="c"&gt;# Create a user&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt; curl  &lt;span class="nt"&gt;-u&lt;/span&gt;  guest:guest  &lt;span class="nt"&gt;-XPUT&lt;/span&gt;  &lt;span class="nt"&gt;-H&lt;/span&gt;  &lt;span class="s2"&gt;"content-type:application/json"&lt;/span&gt;  &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"password":"admin123","tags":"administrator"}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
http://localhost:15672/api/users/myadmin

&lt;span class="c"&gt;# Create a queue&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt; curl  &lt;span class="nt"&gt;-u&lt;/span&gt;  myadmin:admin123  &lt;span class="nt"&gt;-XPUT&lt;/span&gt;  &lt;span class="nt"&gt;-H&lt;/span&gt;  &lt;span class="s2"&gt;"content-type:application/json"&lt;/span&gt;  &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"durable":true}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
http://localhost:15672/api/queues/%2F/myqueue

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

&lt;/div&gt;





&lt;h1&gt;
  
  
  Exploring the Management Interface
&lt;/h1&gt;

&lt;p&gt;The RabbitMQ web interface provides graphs of message rates, queue message statistics (ready, unacknowledged), active connections, open channels, and information about each cluster node, such as memory usage, disks, and processes. The queued messages and message rate graphs are examples of these graphical statistics.&lt;/p&gt;

&lt;p&gt;After starting RabbitMQ, we can monitor and manage RabbitMQ from the web interface at port 15672. You can access this page via the following URL: &lt;em&gt;&lt;a href="http://localhost:15672/" rel="noopener noreferrer"&gt;http://localhost:15672/&lt;/a&gt;&lt;/em&gt; with the default username and password as &lt;code&gt;guest/guest&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fg3fbqklqmubptxlpn8k1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fg3fbqklqmubptxlpn8k1.png" alt=" " width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tabs such as Connections, Channels, Exchanges, Queues and Streams and Admin allow you to manage each resource. The Queues tab, for example, shows all queues, allowing you to configure TTL, view pending messages, and even send messages manually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;The Overview page displays two graphs: one for Queued Messages and one for the message rate. You can change the period displayed on the graph by pressing the "Last Minute" tab above the graph. Information about all the different message states can be found by pressing the &lt;code&gt;?&lt;/code&gt; tab/button.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fr2q6h7j9o8lvh7rrmk4s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fr2q6h7j9o8lvh7rrmk4s.png" alt=" " width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h1&gt;
  
  
  Creating a Producer and a Consumer in Python
&lt;/h1&gt;

&lt;p&gt;In this part of the article, we will create two Python programs: a producer that sends messages, and a consumer that receives the messages and prints them to the screen. They are implemented using the &lt;code&gt;pika&lt;/code&gt; library for Python. First, make sure you install the library with &lt;code&gt;pip install pika&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For more details and examples in Python, start by accessing the examples in &lt;a href="https://www.google.com/search?q=http://https://www.rabbitmq.com/tutorials/tutorial-one-python" rel="noopener noreferrer"&gt;tutorial-one-python&lt;/a&gt; and the &lt;a href="https://www.google.com/search?q=http://https://github.com/rabbitmq/rabbitmq-tutorials/tree/main/python" rel="noopener noreferrer"&gt;rabbitmq-tutorials&lt;/a&gt; repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Producer
&lt;/h2&gt;

&lt;p&gt;In a directory, create a file for the producer RabbitMqProduce.py.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pika&lt;/span&gt;

&lt;span class="c1"&gt;# Connection settings
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;  &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pika&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BlockingConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pika&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ConnectionParameters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;localhost&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Queue declaration and message sending
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;  &lt;span class="nf"&gt;publish_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Ensures that the queue exists. "durable=True" persists the queue to disk
&lt;/span&gt;    &lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;queue_declare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;durable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Publishes the message to the default exchange (""), using the routing_key equal to the queue name
&lt;/span&gt;    &lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basic_publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;routing_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pika&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BasicProperties&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delivery_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 2 = persistent
&lt;/span&gt;    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[x] Sent: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;  &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;publish_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Hello, RabbitMQ!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Consumer
&lt;/h2&gt;

&lt;p&gt;In the same directory, create a file for the consumer RabbitMqReceive.py.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pika&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;  &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pika&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BlockingConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pika&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ConnectionParameters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;localhost&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Callback called when a message arrives
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;  &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[x] Received: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Simulates processing
&lt;/span&gt;    &lt;span class="c1"&gt;# When finished, sends ack (acknowledgment of processing)
&lt;/span&gt;    &lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basic_ack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delivery_tag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delivery_tag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Consumption loop
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt;  &lt;span class="nf"&gt;start_consumer&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Declares the same queue with durable=True to ensure it exists and is persistent
&lt;/span&gt;    &lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;queue_declare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;durable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Qos with prefetch=1 distributes only one message at a time to each worker
&lt;/span&gt;    &lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basic_qos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefetch_count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basic_consume&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;on_message_callback&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; [*] Waiting for messages. To exit press CTRL+C&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start_consuming&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;  &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;start_consumer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

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

&lt;/div&gt;





&lt;h3&gt;
  
  
  Topic example with topic exchange
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;topic&lt;/strong&gt; pattern allows flexible routing based on patterns. Imagine we have several queues interested in different log levels. We can create a &lt;strong&gt;topic&lt;/strong&gt; type exchange called &lt;strong&gt;logs&lt;/strong&gt; and associate queues with specific &lt;em&gt;bindings&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pika&lt;/span&gt;

&lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pika&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;BlockingConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pika&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ConnectionParameters&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;localhost&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Declares a topic type exchange
&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exchange_declare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;logs&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exchange_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;topic&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;durable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Declares queue for error logs and associates it with the exchange with binding key "log.error"
&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;queue_declare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;queue_bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;logs&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;routing_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;log.error&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Declares queue for logs of all levels (with wildcard)
&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;queue_declare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;queue_bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;logs&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;queue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;all&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;routing_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;log.#&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Publishes messages
&lt;/span&gt;&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basic_publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;logs&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;routing_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;log.error&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;A critical error occurred!&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basic_publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;logs&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;routing_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;log.info&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Important information...&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Messages sent.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;In the consumer, just associate the desired queue and process. The &lt;strong&gt;error&lt;/strong&gt; queue will only receive messages with &lt;code&gt;log.error&lt;/code&gt;, while the &lt;em&gt;all&lt;/em&gt; queue will receive all (&lt;code&gt;log.#&lt;/code&gt;). Note that the &lt;code&gt;#&lt;/code&gt; character captures zero or more words in the routing key.&lt;/p&gt;



&lt;h1&gt;
  
  
  Creating a Producer and a Consumer in Java
&lt;/h1&gt;

&lt;p&gt;If your preferred language is Java, this is an example of how to create the same programs: a producer that sends messages, and a consumer that receives the messages and prints them to the screen. They are implemented using the &lt;a href="https://www.google.com/search?q=http://https://mvnrepository.com/artifact/com.rabbitmq/amqp-client" rel="noopener noreferrer"&gt;amqp-client&lt;/a&gt; library.&lt;/p&gt;

&lt;p&gt;First, make sure to install the library in your project. If you use Maven, add to your &lt;code&gt;pom.xml&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.rabbitmq&lt;span class="nt"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;amqp-client&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;5.26.0&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For more details and examples in Java, start by accessing &lt;a href="https://www.google.com/search?q=http://https://www.rabbitmq.com/tutorials/tutorial-one-java" rel="noopener noreferrer"&gt;tutorial-one-java&lt;/a&gt; and the &lt;a href="https://www.google.com/search?q=http://https://github.com/rabbitmq/rabbitmq-tutorials/tree/main/java" rel="noopener noreferrer"&gt;rabbitmq-tutorials/java&lt;/a&gt; repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Producer
&lt;/h2&gt;

&lt;p&gt;In your project, create a producer class RabbitMqProduce.java.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.altabuild.rabbitmq&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.rabbitmq.client.ConnectionFactory&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.rabbitmq.client.Connection&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.rabbitmq.client.Channel&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.nio.charset.StandardCharsets&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RabbitMqProduce&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="no"&gt;QUEUE_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;ConnectionFactory&lt;/span&gt; &lt;span class="n"&gt;factory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ConnectionFactory&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;factory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setHost&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"localhost"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Connection&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;factory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newConnection&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
             &lt;span class="nc"&gt;Channel&lt;/span&gt; &lt;span class="n"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createChannel&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;queueDeclare&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;QUEUE_NAME&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Hello World!"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;basicPublish&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;QUEUE_NAME&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;StandardCharsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;UTF_8&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" [x] Sent '"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"'"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Consumer
&lt;/h2&gt;

&lt;p&gt;In your project, create a producer class RabbitMqReceive.java.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.altabuild.rabbitmq&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.rabbitmq.client.Channel&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.rabbitmq.client.Connection&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.rabbitmq.client.ConnectionFactory&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.rabbitmq.client.DeliverCallback&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.nio.charset.StandardCharsets&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RabbitMqReceive&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="no"&gt;QUEUE_NAME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;ConnectionFactory&lt;/span&gt; &lt;span class="n"&gt;factory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ConnectionFactory&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;factory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setHost&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"localhost"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;Connection&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;factory&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newConnection&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="nc"&gt;Channel&lt;/span&gt; &lt;span class="n"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createChannel&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;queueDeclare&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;QUEUE_NAME&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" [*] Waiting for messages. To exit press CTRL+C"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="nc"&gt;DeliverCallback&lt;/span&gt; &lt;span class="n"&gt;deliverCallback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;consumerTag&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delivery&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delivery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBody&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="nc"&gt;StandardCharsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;UTF_8&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;" [x] Received '"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"'"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;};&lt;/span&gt;
        &lt;span class="n"&gt;channel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;basicConsume&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;QUEUE_NAME&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;deliverCallback&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;consumerTag&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;});&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

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

&lt;/div&gt;





&lt;h1&gt;
  
  
  Test Results
&lt;/h1&gt;

&lt;p&gt;In both examples, Java or Python, the behavior of the applications and the result are the same.&lt;/p&gt;

&lt;p&gt;First, run the consumer application to start the listening loop. This application keeps running and consuming any message that is posted to the &lt;code&gt;hello&lt;/code&gt; queue.&lt;/p&gt;

&lt;p&gt;Then, run the producer application. The producer application will create a message with the content &lt;code&gt;[x] Sent: Hello, RabbitMQ!&lt;/code&gt;.&lt;br&gt;
Each message sent will be printed to the consumer's console as soon as it is consumed.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;delivery_mode=2&lt;/code&gt; parameter marks the message as persistent, ensuring that it is saved to disk and not just in memory.&lt;/p&gt;

&lt;p&gt;It is possible to monitor the &lt;code&gt;hello&lt;/code&gt; queue metrics through the RabbitMQ console to monitor performance.&lt;/p&gt;

&lt;p&gt;For example, when a message is produced in the queue, it is possible to monitor the number of messages ready for processing:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F8t9b7f08dtbxhhy6m2yu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F8t9b7f08dtbxhhy6m2yu.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When consuming messages from a queue, it is possible to monitor the dequeuing of messages in &lt;em&gt;Queued messages&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fmk0g75bt1yo3a3q2o3m3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fmk0g75bt1yo3a3q2o3m3.png" alt=" " width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F61ak6nm5zjk7v6cef85c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F61ak6nm5zjk7v6cef85c.png" alt=" " width="800" height="109"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;h1&gt;
  
  
  That's all, folks!
&lt;/h1&gt;

&lt;p&gt;If you've made it this far, you've learned how a message broker is essential for anyone developing distributed systems and microservices, and the concepts involved in this important piece of messaging. RabbitMQ provides robustness, monitoring, and flexibility for complex architectures.&lt;br&gt;
Run RabbitMQ locally, and run the example codes yourself to see its use in practice.&lt;/p&gt;

&lt;p&gt;Want to learn even more? I leave you with the following challenges as next steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run the producer made in Python, and the consumer made in Java (or vice versa) to see in practice how completely different systems can be integrated through queues.&lt;/li&gt;
&lt;li&gt;Explore the management interface, and check the configurations and models explained at &lt;a href="https://www.rabbitmq.com/tutorials" rel="noopener noreferrer"&gt;https://www.rabbitmq.com/tutorials&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Implement other patterns such as work queues and RPC.&lt;/li&gt;
&lt;li&gt;Test scalability by adding multiple consumers and understanding the behavior when multiple applications consume.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mastering these concepts will be a differentiator to ensure that your applications are prepared for high volumes of messages and efficiently integrated.&lt;/p&gt;

&lt;p&gt;Did you like the introduction? Then try integrating RabbitMQ into a real project to have more experience! The code and step-by-step presented here are just the beginning to explore the full potential of this powerful tool.&lt;/p&gt;

</description>
      <category>eventdriven</category>
      <category>devops</category>
      <category>development</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Terraform Cheatsheet</title>
      <dc:creator>Altair Lage</dc:creator>
      <pubDate>Thu, 29 Jan 2026 15:22:05 +0000</pubDate>
      <link>https://forem.com/altairlage/terraform-cheatsheet-31o2</link>
      <guid>https://forem.com/altairlage/terraform-cheatsheet-31o2</guid>
      <description>&lt;p&gt;Have you ever worked with Terraform?&lt;/p&gt;

&lt;p&gt;For those working in DevOps and Cloud Computing, Terraform can be a very important tool for Infrastructure as Code (IaC).&lt;br&gt;
That’s why I created this cheat sheet with the essential Terraform commands every professional should know by heart.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ffwvpymqw3s0q64rl1hdb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ffwvpymqw3s0q64rl1hdb.png" alt=" " width="800" height="687"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Basic workflow (most important commands):
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Check and Apply (Create/Change resources):
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;terraform init&lt;/strong&gt;: Initializes your working directory and configures the backend for new and existing projects.&lt;br&gt;
&lt;strong&gt;terraform plan&lt;/strong&gt;: Generates the execution plan, showing which resources will be created or changed in the infrastructure.&lt;br&gt;
&lt;strong&gt;terraform apply&lt;/strong&gt;: Applies the planned changes to build your infrastructure and deploy the resources.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check and Manage:
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;terraform validate&lt;/strong&gt;: Checks the code for errors to ensure your configuration is syntactically correct.&lt;br&gt;
&lt;strong&gt;terraform show &amp;amp; terraform state&lt;/strong&gt;: Display the current Terraform state in a readable format and allow you to inspect, list, and manipulate resources directly in the state file. Essential for understanding the current state of your infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Destroy your deployment&lt;/strong&gt;:&lt;br&gt;
terraform destroy: Removes all resources managed by Terraform. Be careful with this command! 😄&lt;/p&gt;

&lt;h2&gt;
  
  
  Command explanations:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;terraform init&lt;/strong&gt; – Initializes the project by downloading providers and configuring the backend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terraform plan&lt;/strong&gt; – Shows what will be created, changed, or destroyed before applying.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terraform apply&lt;/strong&gt; – Applies the changes defined in the Terraform code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terraform show&lt;/strong&gt; – Displays the current state or plan in a readable format.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terraform destroy&lt;/strong&gt; – Removes all resources managed by Terraform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terraform validate&lt;/strong&gt; – Validates the syntax and structure of Terraform files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terraform output&lt;/strong&gt; – Shows the output values defined in the state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terraform state&lt;/strong&gt; – Allows you to inspect and manipulate the state file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terraform fmt&lt;/strong&gt; – Formats Terraform files according to the official style.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terraform graph&lt;/strong&gt; – Generates a graph of dependencies between resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terraform import&lt;/strong&gt; – Imports existing resources into the Terraform state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terraform refresh&lt;/strong&gt; – Updates the state with what exists in the real environment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terraform taint&lt;/strong&gt; – Marks a resource to be recreated on the next apply.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;terraform untaint&lt;/strong&gt; – Removes the recreation mark from a resource.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That’s all, folks!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I hope this cheat sheet helps you remember the commands and better understand the IaC lifecycle with Terraform.&lt;/p&gt;

&lt;h1&gt;
  
  
  Terraform #DevOps #IaC #InfrastructureAsCode #CloudComputing #AWS #Azure #TechTips #CheatSheet #DeveloperLife #TechCommunity #Automation #SRE
&lt;/h1&gt;

</description>
      <category>devops</category>
      <category>terraform</category>
      <category>infrastructureascode</category>
      <category>cloud</category>
    </item>
    <item>
      <title>This is a full guide guys! This will help you to make your Java and Python applications ready for production, to run in Kubernetes or other orchestrators. Hope you like it!</title>
      <dc:creator>Altair Lage</dc:creator>
      <pubDate>Thu, 20 Nov 2025 15:26:48 +0000</pubDate>
      <link>https://forem.com/altairlage/this-is-a-full-guide-guys-this-will-help-you-to-make-your-java-and-python-applications-ready-for-44ef</link>
      <guid>https://forem.com/altairlage/this-is-a-full-guide-guys-this-will-help-you-to-make-your-java-and-python-applications-ready-for-44ef</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/altairlage" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3462854%2F0e9c166e-909e-40b3-8881-cf96fa18e64e.png" alt="altairlage"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/altairlage/dockerizing-java-and-python-applications-4n7l" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Dockerizing Java and Python Applications&lt;/h2&gt;
      &lt;h3&gt;Altair Lage ・ Nov 20 '25&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#python&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#docker&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#java&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#cloud&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>docker</category>
      <category>java</category>
      <category>python</category>
      <category>cloudnative</category>
    </item>
  </channel>
</rss>
