<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: meet</title>
    <description>The latest articles on DEV Community by meet (@meet08).</description>
    <link>https://dev.to/meet08</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%2F499703%2F8aaae4f1-293d-4dd8-ba58-74b391a945f8.jpg</url>
      <title>DEV Community: meet</title>
      <link>https://dev.to/meet08</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/meet08"/>
    <language>en</language>
    <item>
      <title>Decision Matrix To Navigate Technology Choices</title>
      <dc:creator>meet</dc:creator>
      <pubDate>Wed, 27 Aug 2025 09:48:11 +0000</pubDate>
      <link>https://dev.to/meet08/decision-matrix-to-navigate-technology-choices-4ojn</link>
      <guid>https://dev.to/meet08/decision-matrix-to-navigate-technology-choices-4ojn</guid>
      <description>&lt;p&gt;Decision matrix that can be used for various types of engineering decisions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Factor&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Questions to Ask&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Examples&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Business Requirements&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Aligns with product goals, timelines, and scope.&lt;/td&gt;
&lt;td&gt;- Does this choice solve the business problem effectively? &lt;br&gt; - Is this feature going to add measurable value to users or the product? &lt;br&gt; - What are the KPIs for success?&lt;/td&gt;
&lt;td&gt;- New feature with clear business impact &lt;br&gt; - Critical bug fix required for customer satisfaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Technical Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How complex is the solution, both in terms of development and maintenance?&lt;/td&gt;
&lt;td&gt;- How difficult is it to implement? &lt;br&gt; - Are there any unknowns or potential risks in this design/solution? &lt;br&gt; - Will it require a lot of time or effort to maintain?&lt;/td&gt;
&lt;td&gt;- Implementing a new caching layer &lt;br&gt; - Integrating with a third-party service or API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How well does the solution perform in terms of &lt;strong&gt;latency&lt;/strong&gt;, &lt;strong&gt;throughput&lt;/strong&gt;, &lt;strong&gt;load handling&lt;/strong&gt;, and &lt;strong&gt;scalability&lt;/strong&gt;?&lt;/td&gt;
&lt;td&gt;- Does this solution meet our current and projected load needs? &lt;br&gt; - Can we handle future growth in traffic/data? &lt;br&gt; - Does it align with SLAs for performance (e.g., latency requirements)?&lt;/td&gt;
&lt;td&gt;- Handling thousands of concurrent users &lt;br&gt; - Real-time data processing with low latency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ability to handle increased load over time. Does the system scale horizontally and vertically? Does it have limits for future growth?&lt;/td&gt;
&lt;td&gt;- How does the system handle an increase in users/data? &lt;br&gt; - Will it scale effortlessly or require significant changes as we grow? &lt;br&gt; - Can we partition data or handle increased traffic easily?&lt;/td&gt;
&lt;td&gt;- Migrating to a microservices architecture &lt;br&gt; - Transitioning from monolith to cloud-native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maintainability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How easy is it to maintain, debug, and monitor the system after deployment? Does the system require heavy monitoring or does it provide clear diagnostics?&lt;/td&gt;
&lt;td&gt;- How easy is it to test and debug this feature/system? &lt;br&gt; - Can developers quickly understand and work with the system? &lt;br&gt; - What is the learning curve for new engineers?&lt;/td&gt;
&lt;td&gt;- Choosing a simple, well-documented framework &lt;br&gt; - Legacy code that needs modernization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reliability &amp;amp; Fault Tolerance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ensures the system has resilience and can recover from failure.&lt;/td&gt;
&lt;td&gt;- Does this solution provide high availability and fault tolerance? &lt;br&gt; - Are there failover mechanisms in place? &lt;br&gt; - What is the disaster recovery plan? &lt;br&gt; - Does it meet the availability SLA?&lt;/td&gt;
&lt;td&gt;- Using a distributed database with replication &lt;br&gt; - Redundant services to ensure uptime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;How secure is the solution? Does it follow best practices for authentication, authorization, data protection, and access control?&lt;/td&gt;
&lt;td&gt;- Does the solution meet security compliance requirements? &lt;br&gt; - Are there any known vulnerabilities or risks? &lt;br&gt; - How does the system handle encryption and access control?&lt;/td&gt;
&lt;td&gt;- Using OAuth 2.0 for user authentication &lt;br&gt; - Encrypting sensitive data at rest and in transit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Development Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Time required to implement the solution. Does the solution fit within the desired release timelines?&lt;/td&gt;
&lt;td&gt;- How quickly can this solution be developed and delivered? &lt;br&gt; - Does it meet the deadline or sprint goals? &lt;br&gt; - Is there enough time for testing and QA before release?&lt;/td&gt;
&lt;td&gt;- Using existing libraries or frameworks for rapid prototyping &lt;br&gt; - Fast MVP development using microservices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Team Expertise&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Does the team have sufficient expertise with the technology? What is the learning curve?&lt;/td&gt;
&lt;td&gt;- Do we have developers who are experienced with this technology? &lt;br&gt; - Will the team need additional training or ramp-up time? &lt;br&gt; - Is this technology well-supported in the community?&lt;/td&gt;
&lt;td&gt;- Using Node.js when the team is familiar with JavaScript &lt;br&gt; - Selecting a database technology your team has experience with&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost &amp;amp; Resources&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Financial costs, infrastructure costs, and resources (personnel, tools) required to implement the solution.&lt;/td&gt;
&lt;td&gt;- Does this solution fit within the budget? &lt;br&gt; - Are there hidden costs (e.g., cloud infrastructure costs, training)? &lt;br&gt; - What are the ongoing operational costs?&lt;/td&gt;
&lt;td&gt;- Choosing between managed or self-hosted services &lt;br&gt; - Cloud provider costs for storage and bandwidth&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flexibility &amp;amp; Extensibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Can the solution easily adapt to future changes in the business or technical environment?&lt;/td&gt;
&lt;td&gt;- How adaptable is this technology to future needs or changes? &lt;br&gt; - Does the architecture allow for easy integration with other services or tools? &lt;br&gt; - Can we extend it if necessary?&lt;/td&gt;
&lt;td&gt;- Using RESTful APIs for easy future integration &lt;br&gt; - Designing a system with plugin architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vendor Lock-In&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Does the solution create a dependency on a specific vendor, or can it be easily migrated?&lt;/td&gt;
&lt;td&gt;- Is the technology tied to a specific cloud vendor or service? &lt;br&gt; - How hard is it to switch to another provider if necessary? &lt;br&gt; - What are the exit strategies if the vendor changes terms or pricing?&lt;/td&gt;
&lt;td&gt;- Choosing an open-source database versus a proprietary one &lt;br&gt; - Using a cloud-native service with high dependency on a single vendor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User Experience (UX)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Does the solution meet the UX requirements in terms of speed, usability, and functionality?&lt;/td&gt;
&lt;td&gt;- How will this impact the end-user experience? &lt;br&gt; - Does this solution support intuitive, fast, and responsive interactions? &lt;br&gt; - Will it provide a consistent experience across devices and platforms?&lt;/td&gt;
&lt;td&gt;- Building a mobile-first web app &lt;br&gt; - Designing an interactive, real-time dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compliance &amp;amp; Regulations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Does the solution meet industry-specific regulations and compliance standards?&lt;/td&gt;
&lt;td&gt;- Does this solution comply with legal or industry-specific regulations (e.g., GDPR, HIPAA)? &lt;br&gt; - Does it have auditing, logging, and data retention mechanisms in place?&lt;/td&gt;
&lt;td&gt;- Implementing secure data storage for healthcare data &lt;br&gt; - Ensuring GDPR compliance for user data&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  How to Use the Matrix:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Identify Key Criteria&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Start by defining the most important factors based on your specific decision. For instance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you're building a system where &lt;strong&gt;performance&lt;/strong&gt; is paramount (e.g., real-time processing), &lt;strong&gt;performance&lt;/strong&gt; and &lt;strong&gt;scalability&lt;/strong&gt; will be high priority.&lt;/li&gt;
&lt;li&gt;For a system that needs &lt;strong&gt;rapid development&lt;/strong&gt; and &lt;strong&gt;MVP delivery&lt;/strong&gt;, focus on &lt;strong&gt;development speed&lt;/strong&gt; and &lt;strong&gt;team expertise&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Evaluate Options&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Rate each option or technology against each factor. For instance, you could assign weights to each factor based on its importance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1 (low)&lt;/strong&gt; to &lt;strong&gt;5 (high)&lt;/strong&gt; for each factor for each option.
&lt;strong&gt;Example&lt;/strong&gt;: If &lt;strong&gt;performance&lt;/strong&gt; is the highest priority, give it a weight of &lt;strong&gt;5&lt;/strong&gt;.
Multiply the rating by the factor's weight to get a score for each option.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Consider Trade-offs&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
There’s rarely a "perfect" solution. The goal is to find the option that delivers the most value relative to your constraints. For instance:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A system with &lt;strong&gt;high performance&lt;/strong&gt; but &lt;strong&gt;low scalability&lt;/strong&gt; might work for a small-scale project but become problematic as it grows.&lt;/li&gt;
&lt;li&gt;A solution with &lt;strong&gt;low development speed&lt;/strong&gt; but &lt;strong&gt;high maintainability&lt;/strong&gt; might be ideal for long-term projects but slower for quick launches.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cross-Disciplinary Considerations&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Include feedback from cross-functional teams like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DevOps&lt;/strong&gt;: For deployment and scaling concerns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;QA&lt;/strong&gt;: For testing considerations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: For compliance and best practices.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Make an Informed Decision&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Summarize the options with scores and the factors that matter most, then make the final decision based on the data and your team’s needs.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Example: Choosing a Messaging System (Kafka vs. RabbitMQ)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Factor&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Kafka&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;RabbitMQ&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5 (Handles high-throughput, low-latency)&lt;/td&gt;
&lt;td&gt;3 (Moderate performance for transactional workloads)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5 (Highly scalable for large datasets)&lt;/td&gt;
&lt;td&gt;3 (Clustering is possible, but not as scalable as Kafka)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maintainability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3 (More complex to manage at scale)&lt;/td&gt;
&lt;td&gt;5 (Easier to maintain for smaller systems)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reliability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5 (Built for high availability and fault tolerance)&lt;/td&gt;
&lt;td&gt;4 (Good fault tolerance, but less resilient than Kafka)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost &amp;amp; Resources&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4 (Requires significant resources at scale)&lt;/td&gt;
&lt;td&gt;5 (Lower cost for smaller applications)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flexibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4 (Great for event-driven architecture, but may not be ideal for all scenarios)&lt;/td&gt;
&lt;td&gt;5 (Great for flexible message&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Final Decision&lt;/em&gt;&lt;/strong&gt;:&lt;br&gt;
If the system requires high throughput and scalability, Kafka might be the best choice.&lt;br&gt;
If the application has lower traffic and requires easier setup, RabbitMQ might be more suitable.&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>architecture</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Composite Indexes in MySQL</title>
      <dc:creator>meet</dc:creator>
      <pubDate>Tue, 26 Aug 2025 08:45:48 +0000</pubDate>
      <link>https://dev.to/meet08/composite-indexes-in-mysql-80n</link>
      <guid>https://dev.to/meet08/composite-indexes-in-mysql-80n</guid>
      <description>&lt;p&gt;When creating &lt;strong&gt;composite indexes&lt;/strong&gt; for queries in &lt;strong&gt;MySQL&lt;/strong&gt;, the &lt;strong&gt;correct order of columns&lt;/strong&gt; is crucial for performance optimization. We often focus on columns with &lt;strong&gt;higher cardinality&lt;/strong&gt; and place them first in the index, assuming it will boost performance.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Example: Tasks Table&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Consider a &lt;code&gt;tasks&lt;/code&gt; table that stores details of tasks assigned to users, with a &lt;strong&gt;large volume of data&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;creation_date&lt;/span&gt; &lt;span class="k"&gt;BETWEEN&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;A typical approach might be to create an index like this:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;(creation_date, user_id)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;But &lt;strong&gt;cardinality&lt;/strong&gt; is not the only factor to consider when creating composite indexes. A wrongly ordered index can lead to significant performance issues, such as slower queries and even full table scans.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Cardinality Isn’t the Only Consideration
&lt;/h3&gt;

&lt;p&gt;Although &lt;code&gt;creation_date&lt;/code&gt; might have high cardinality, the &lt;strong&gt;query structure&lt;/strong&gt; (equality vs. range vs. sorting) plays a significant role in determining the optimal index order.&lt;/p&gt;

&lt;p&gt;Since &lt;code&gt;user_id&lt;/code&gt; is used in an equality condition, it should come first in the index as it is highly selective. The &lt;strong&gt;range condition&lt;/strong&gt; on &lt;code&gt;creation_date&lt;/code&gt; (e.g., &lt;code&gt;BETWEEN ? AND ?&lt;/code&gt;) should follow because range conditions are less efficient than equality checks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Correct Index:
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;(user_id, creation_date)&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Learnings:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Start with &lt;strong&gt;equality filters&lt;/strong&gt;, followed by &lt;strong&gt;range filters&lt;/strong&gt;, and end with columns used for &lt;strong&gt;sorting&lt;/strong&gt;.

&lt;ul&gt;
&lt;li&gt;Without sorting inclusion, MySQL may have to perform an extra sort on the result set.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Always &lt;strong&gt;test with the specific queries&lt;/strong&gt; using production data and &lt;strong&gt;EXPLAIN plan&lt;/strong&gt; to find the optimal index for your workload.&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>mysql</category>
      <category>database</category>
      <category>performance</category>
    </item>
    <item>
      <title>Embedded-server : undertow basics</title>
      <dc:creator>meet</dc:creator>
      <pubDate>Tue, 19 Aug 2025 11:31:15 +0000</pubDate>
      <link>https://dev.to/meet08/embedded-server-undertow-basics-26ln</link>
      <guid>https://dev.to/meet08/embedded-server-undertow-basics-26ln</guid>
      <description>&lt;p&gt;In modern Java web application development, choosing the right embedded server and understanding its concurrency model can significantly impact your app's scalability and performance. This post explores what embedded servers are, compares key concurrency models, and offers an inside look at how Undertow — a high-performance embedded server — works under the hood.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Are Embedded Servers?
&lt;/h2&gt;

&lt;p&gt;Embedded servers are web servers integrated directly into an application instead of operating as standalone services. This allows developers to build &lt;strong&gt;self-contained applications&lt;/strong&gt; that are easier to develop, deploy, and test.&lt;/p&gt;

&lt;p&gt;Some popular embedded servers in the Java ecosystem include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tomcat:&lt;/strong&gt; The classic servlet container, known for robustness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jetty:&lt;/strong&gt; Flexible and modular, supports both synchronous and asynchronous servlets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Undertow:&lt;/strong&gt; Lightweight, designed for reactive and asynchronous workloads.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Netty:&lt;/strong&gt; A low-level asynchronous event-driven network framework, powering custom protocols and reactive HTTP servers.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Concurrency Models: Thread-per-Request vs. Event Loop
&lt;/h2&gt;

&lt;p&gt;How a server manages multiple simultaneous requests drastically affects performance and scalability. Two main concurrency models prevail:&lt;/p&gt;

&lt;h3&gt;
  
  
  Thread-per-Request Model
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Assigns &lt;strong&gt;one thread per incoming request&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Threads handle the full request lifecycle, including any blocking calls (like database queries)&lt;/li&gt;
&lt;li&gt;Concurrency directly limited by thread pool size&lt;/li&gt;
&lt;li&gt;Can lead to thread exhaustion if many requests block simultaneously&lt;/li&gt;
&lt;li&gt;Found in traditional servers like Tomcat and Jetty&lt;/li&gt;
&lt;li&gt;Easier programming model but less scalable under heavy load&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Event Loop Model
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Uses a &lt;strong&gt;small, fixed number of event loop threads&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Each event loop handles many connections via &lt;strong&gt;non-blocking, asynchronous I/O&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Blocking or long-running tasks are offloaded to &lt;strong&gt;worker thread pools&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enables handling thousands of concurrent connections efficiently&lt;/li&gt;
&lt;li&gt;Common in servers like Undertow and Netty&lt;/li&gt;
&lt;li&gt;Requires writing asynchronous or reactive code but yields superior scalability&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How Undertow Works Internally
&lt;/h2&gt;

&lt;p&gt;Undertow is designed for ultra-low latency and high throughput, making it well-suited for modern reactive applications.&lt;/p&gt;

&lt;p&gt;Undertow’s threading model distinguishes two main types of threads that work together to deliver high performance and scalability:&lt;/p&gt;

&lt;h3&gt;
  
  
  IO Threads (Event Loop Threads)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;These are the &lt;strong&gt;event loop threads&lt;/strong&gt; in Undertow.&lt;/li&gt;
&lt;li&gt;The number of IO threads is typically set &lt;strong&gt;equal to the number of CPU cores&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Each IO thread runs an event loop responsible for handling &lt;strong&gt;all non-blocking network I/O operations&lt;/strong&gt; on multiple socket connections.&lt;/li&gt;
&lt;li&gt;Every incoming request on a connection is initially handled by the IO thread bound to that connection.&lt;/li&gt;
&lt;li&gt;IO threads &lt;strong&gt;never perform blocking operations directly&lt;/strong&gt; to avoid stalling the event loop.&lt;/li&gt;
&lt;li&gt;Their job is to efficiently multiplex many concurrent connections with minimal threads.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Worker Threads (Core Threads)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Worker threads come from a &lt;strong&gt;dedicated worker thread pool&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;These threads handle &lt;strong&gt;blocking or long-running tasks&lt;/strong&gt;, such as database queries, file operations, or heavy computations.&lt;/li&gt;
&lt;li&gt;When a blocking task arises, Undertow dispatches the work from the IO thread to a worker thread.&lt;/li&gt;
&lt;li&gt;Once completed, the worker thread posts a callback back to the same IO thread to resume request processing.&lt;/li&gt;
&lt;li&gt;The worker thread pool size is usually larger than the number of IO threads, for example, 8 times the IO thread count.&lt;/li&gt;
&lt;/ul&gt;




&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Thread Type&lt;/th&gt;
&lt;th&gt;Function&lt;/th&gt;
&lt;th&gt;Thread Count (Typical)&lt;/th&gt;
&lt;th&gt;Is it Event Loop?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IO Threads&lt;/td&gt;
&lt;td&gt;Run non-blocking event loops, manage connections&lt;/td&gt;
&lt;td&gt;Equal to CPU cores&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Yes, these are the event loop threads&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Worker Threads&lt;/td&gt;
&lt;td&gt;Handle blocking/long-running operations&lt;/td&gt;
&lt;td&gt;Multiple times IO thread count&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;Here’s what happens under the hood:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IO Threads Are Event Loops:&lt;/strong&gt; Undertow runs a group of IO (input/output) threads, each executing an event loop handling multiple socket connections asynchronously.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connection Thread Affinity:&lt;/strong&gt; Each network connection is permanently assigned to a single IO thread, ensuring all logic and IO for that connection stay on one thread, avoiding concurrency hazards.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Worker Threads for Blocking Work:&lt;/strong&gt; When the processing requires blocking operations (database calls, file IO), Undertow dispatches work to a worker thread pool to keep IO threads free for non-blocking tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Callback Mechanism:&lt;/strong&gt; After completing blocking operations, the worker thread posts a callback to the original IO thread to continue request processing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thread Count Balance:&lt;/strong&gt; Typically, Undertow configures IO threads equal to CPU cores, with a larger pool of worker threads to handle blocking workloads efficiently.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This hybrid approach preserves responsiveness and throughput by separating lightweight asynchronous IO from heavyweight blocking operations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Comparing the Models: At a Glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Thread-per-Request&lt;/th&gt;
&lt;th&gt;Event Loop (Undertow)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Threads per request&lt;/td&gt;
&lt;td&gt;One&lt;/td&gt;
&lt;td&gt;Few event loop threads serve many&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Handling blocking calls&lt;/td&gt;
&lt;td&gt;Threads blocked&lt;/td&gt;
&lt;td&gt;Blocking offloaded to worker threads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability&lt;/td&gt;
&lt;td&gt;Limited by thread pool size&lt;/td&gt;
&lt;td&gt;High concurrency with fewer threads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Programming complexity&lt;/td&gt;
&lt;td&gt;Simpler synchronous code&lt;/td&gt;
&lt;td&gt;Requires async/reactive programming&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How Undertow Supports Both Blocking and Non-blocking Paradigms
&lt;/h2&gt;

&lt;p&gt;Undertow is built to handle web requests in two different ways, giving you flexibility depending on your application's needs: &lt;strong&gt;non-blocking (asynchronous)&lt;/strong&gt; and &lt;strong&gt;blocking (synchronous)&lt;/strong&gt; processing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Non-blocking Mode — The Efficient Event Loop
&lt;/h3&gt;

&lt;p&gt;By default, Undertow uses &lt;strong&gt;IO threads known as event loops&lt;/strong&gt; to manage incoming requests. These event loop threads work asynchronously using non-blocking IO, which means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One thread can manage many connections at once&lt;/strong&gt; without waiting or getting stuck.&lt;/li&gt;
&lt;li&gt;When your request processing involves operations that take time (like database calls), Undertow offloads this work to a special pool of &lt;strong&gt;worker threads&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Once that work finishes, a &lt;strong&gt;callback&lt;/strong&gt; is sent back to the original event loop thread to pick up where it left off and send the response.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This method is very efficient for handling large numbers of concurrent connections because the event loop threads are never blocked waiting for slow operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Blocking Mode — Support for Traditional Synchronous Code
&lt;/h3&gt;

&lt;p&gt;Some applications, especially traditional Spring Boot projects using Spring MVC, work in a blocking way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your controller methods and other request handlers run &lt;strong&gt;synchronously&lt;/strong&gt;, meaning they wait (block) until operations finish.&lt;/li&gt;
&lt;li&gt;Undertow supports this by letting you switch into &lt;strong&gt;blocking mode&lt;/strong&gt; using a call to &lt;code&gt;HttpServerExchange.startBlocking()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;When blocking mode is used, &lt;strong&gt;the request handling is moved off the event loop threads and onto worker threads&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;This way, even though your code blocks while waiting for operations, it does not freeze the important event loop threads that keep the server responsive.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What Happens in a Non-Reactive Spring Boot App?
&lt;/h3&gt;

&lt;p&gt;If you use Undertow as the embedded server in a typical &lt;strong&gt;non-reactive Spring Boot application&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Incoming requests land on Undertow’s &lt;strong&gt;non-blocking IO event loop threads&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Since Spring MVC uses blocking, synchronous request handlers, Undertow &lt;strong&gt;automatically dispatches these requests away from the event loop threads to its worker thread pool&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This dispatch ensures that blocking processing happens on worker threads, &lt;strong&gt;keeping the event loop threads free to handle other incoming connections efficiently&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The whole “switch to blocking mode” and running on worker threads is managed internally by Undertow as part of its integration with Spring Boot.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This lets you write traditional blocking code without worrying about blocking event loop threads yourself.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach strikes a balance between traditional blocking programming and efficient server resource usage.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why Is This Important?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;non-blocking event loop model&lt;/strong&gt; is great for scalability and handling thousands of concurrent connections efficiently.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;blocking mode&lt;/strong&gt; keeps compatibility with existing synchronous code and frameworks.&lt;/li&gt;
&lt;li&gt;Undertow’s hybrid model allows you to build on top of proven blocking paradigms &lt;strong&gt;without sacrificing event loop performance&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You get &lt;strong&gt;the best of both worlds&lt;/strong&gt;: wide compatibility and high scalability.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If your application has mostly synchronous, blocking code (like typical Spring MVC controllers), Undertow will safely handle blocking calls on worker threads so the event loop threads remain free. If you want even better scalability with highly concurrent workloads, consider using reactive programming models where you can take full advantage of the event loop’s non-blocking nature.&lt;/p&gt;

</description>
      <category>java</category>
      <category>programming</category>
      <category>webserver</category>
    </item>
    <item>
      <title>RabbitMQ Basic Overview</title>
      <dc:creator>meet</dc:creator>
      <pubDate>Sun, 01 Aug 2021 07:59:08 +0000</pubDate>
      <link>https://dev.to/meet08/rabbitmq-basic-overview-5dn1</link>
      <guid>https://dev.to/meet08/rabbitmq-basic-overview-5dn1</guid>
      <description>&lt;p&gt;RabbitMQ is a messaging broker and supports AMQP 0-9-1 (Advanced Message Queuing Protocol) protocol.&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%2Fi9nag1z1lstnvf795s9o.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%2Fi9nag1z1lstnvf795s9o.png" alt="RabbitMQ Broker" width="800" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RabbitMQ allows for communication by providing support for applications that publish a message to it (i.e broker) and it delivers the messages to consumer applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  RabbitMQ main components/concepts:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Exchange
&lt;/h3&gt;

&lt;p&gt;Exchanges are entities where messages are sent. &lt;br&gt;
It take a message and route it into zero or more queues based on routing algorithm.&lt;br&gt;
Routing algorithm depends on exchange type and rules called bindings.&lt;br&gt;
Queues are bound to exchanges by using the routing key.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exchange Type
&lt;/h3&gt;

&lt;p&gt;AMQP 0-9-1 brokers provide four exchange types:&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%2Fxkya8igdzw7omavcxvec.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%2Fxkya8igdzw7omavcxvec.png" alt="Exchange Type Listing" width="628" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Default Exchange
&lt;/h4&gt;

&lt;p&gt;The default exchange is a direct exchange with no name (empty string) predeclared by the broker. &lt;br&gt;
It has one special property that makes it very useful for simple applications: every queue that is created is automatically bound to it with a routing key which is the same as the queue name.&lt;/p&gt;

&lt;h4&gt;
  
  
  Direct Exchange
&lt;/h4&gt;

&lt;p&gt;A direct exchange delivers messages to queues based on the message routing key. &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%2Fapw6j4jw1k4pilos7m7o.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%2Fapw6j4jw1k4pilos7m7o.png" alt="Direct Exchange" width="800" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Direct exchanges can be used to distribute tasks between multiple workers as seen in above diagram.&lt;/p&gt;

&lt;p&gt;Publisher 1 publishes messages with 'emails.marketing' routing key to direct exchange. &lt;br&gt;
Queue 2 is bounded to  direct exchange with 'emails.marketing' routing key, so exchange forwards the such messages to Queue 2.&lt;br&gt;
Consumer 3 is listening to Queue 2 and will hence receive such messaged.&lt;/p&gt;

&lt;p&gt;Direct exchanges can be used to distribute messages between multiple workers [i.e consumers] as seen in above diagram.&lt;br&gt;
These messages are load balanced between consumers in a round robin manner and not between queues.&lt;/p&gt;

&lt;p&gt;Publisher 2 publishes messages with 'emails.sales' routing key to direct exchange. &lt;br&gt;
Queue 1 and Queue 3 are bounded to  direct exchange with 'emails.sales' routing key, so exchange makes 2 copies of received messages and forwards one each to to Queue 1 and Queue 2.&lt;br&gt;
Consumer 1 and Consumer 2 are listening to Queue 1. Each of them will receive unique message for processing in round robin manner. That is a single message cannot be consumed by multiple consumers.&lt;/p&gt;

&lt;h4&gt;
  
  
  Fanout Exchange
&lt;/h4&gt;

&lt;p&gt;A fanout exchange routes messages to all of the queues that are bound to it and the routing key is ignored. &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%2Fhdl8l4oslov5um1kmmh9.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%2Fhdl8l4oslov5um1kmmh9.png" alt="Fanout Exchange" width="800" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If N queues are bound to a fanout exchange, when a new message is published to that exchange a copy of the message is delivered to all N queues. &lt;br&gt;
Fanout exchanges are ideal for the broadcast routing of messages.&lt;/p&gt;

&lt;h4&gt;
  
  
  Topic Exchange
&lt;/h4&gt;

&lt;p&gt;Topic exchanges route messages to one or many queues based on matching between a message routing key and the pattern that was used to bind a queue to an exchange. &lt;/p&gt;

&lt;p&gt;Two special cases for binding keys in topic exchange:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;*&lt;/code&gt; (star) can substitute for exactly one word.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;#&lt;/code&gt; (hash) can substitute for zero or more words and if used alone to bind queue, it will behave like fan-out exchange&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%2Fhpvnaefgdd0hb1nu2ghn.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%2Fhpvnaefgdd0hb1nu2ghn.png" alt="Topic Exchange" width="800" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first word in the routing key here describes a communication-method, second a business function and third  personalized: [communication-method].[business].[personalized].&lt;/p&gt;

&lt;p&gt;As in above diagram,&lt;br&gt;
Colons can be used to align columns.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Routing Key&lt;/th&gt;
&lt;th&gt;Queue Delivered To&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;sms.marketing.all&lt;/td&gt;
&lt;td&gt;Q2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;emails.sales.specific&lt;/td&gt;
&lt;td&gt;Q1,Q3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sms.sales.specific&lt;/td&gt;
&lt;td&gt;Q3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sms.sales.specific.all&lt;/td&gt;
&lt;td&gt;Q3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;emails.sales.specific.all&lt;/td&gt;
&lt;td&gt;Q3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;emails.marketing.specific.all&lt;/td&gt;
&lt;td&gt;Lost message&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h6&gt;
  
  
  References
&lt;/h6&gt;

&lt;p&gt;&lt;a href="https://www.rabbitmq.com/tutorials/amqp-concepts.html" rel="noopener noreferrer"&gt;https://www.rabbitmq.com/tutorials/amqp-concepts.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rabbitmq</category>
      <category>messaging</category>
      <category>microservices</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
