<?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: VipraTech Solutions</title>
    <description>The latest articles on DEV Community by VipraTech Solutions (@vipra_tech_solutions).</description>
    <link>https://dev.to/vipra_tech_solutions</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%2F1594508%2F709d08d8-1a95-41dd-a1ca-16cfe6f3523c.png</url>
      <title>DEV Community: VipraTech Solutions</title>
      <link>https://dev.to/vipra_tech_solutions</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vipra_tech_solutions"/>
    <language>en</language>
    <item>
      <title>Fixed Window Rate Limiting: Concept, Examples, and Java Implementation</title>
      <dc:creator>VipraTech Solutions</dc:creator>
      <pubDate>Tue, 09 Sep 2025 05:56:16 +0000</pubDate>
      <link>https://dev.to/vipratechsolutions/fixed-window-rate-limiting-concept-examples-and-java-implementation-5070</link>
      <guid>https://dev.to/vipratechsolutions/fixed-window-rate-limiting-concept-examples-and-java-implementation-5070</guid>
      <description>&lt;h2&gt;
  
  
  📌 What Is Fixed Window Rate Limiting?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Fixed Window Rate Limiting&lt;/strong&gt; is a straightforward algorithm that controls request rates by dividing time into fixed intervals (windows) and allowing a maximum number of requests per window.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If an API allows 100 requests per minute:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The counter resets at the start of each minute.&lt;/li&gt;
&lt;li&gt;A user making 100 requests at 00:59:59 can immediately make 100 more after 01:00:00.
This can cause sudden bursts at window boundaries.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  📝 Example Scenario
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use Case:&lt;/strong&gt; Login API with a limit of 10 attempts per minute.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Behavior:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;A user can try 10 times in the current minute.
&lt;/li&gt;
&lt;li&gt;After the window resets, the counter refreshes, allowing another 10 attempts.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ Benefits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Simple and easy to implement.&lt;/li&gt;
&lt;li&gt;Minimal overhead and resource usage.&lt;/li&gt;
&lt;li&gt;Easy to debug and understand.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚠️ Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Burstiness:&lt;/strong&gt; Allows spikes at window boundaries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Precision:&lt;/strong&gt; Less smooth than sliding window methods.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distributed Challenges:&lt;/strong&gt; Single in-memory counter won’t work across multiple instances without central coordination.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💻 Single-Machine Implementation (Thread-Safe Java)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;When to Use:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Small-scale services.
&lt;/li&gt;
&lt;li&gt;Non-critical endpoints.
&lt;/li&gt;
&lt;li&gt;Internal services where distributed coordination isn’t needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Code for Single-Machine Fixed Window Rate Limiter:&lt;/strong&gt;&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;import&lt;/span&gt; &lt;span class="nn"&gt;java.time.Duration&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.util.Map&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.util.concurrent.ConcurrentHashMap&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.util.concurrent.atomic.AtomicInteger&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Single-machine Fixed Window Rate Limiter.
 * Thread-safe implementation for small-scale services.
 */&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;FixedRateLimiter&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;IRateLimiter&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="nc"&gt;Timer&lt;/span&gt; &lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Provides current time (injectable for testing)&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;FixedWindow&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Stores request counts per user/requestId&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Duration&lt;/span&gt; &lt;span class="n"&gt;windowSize&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Size of fixed time window&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Max requests per window&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;FixedRateLimiter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Duration&lt;/span&gt; &lt;span class="n"&gt;windowSize&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Timer&lt;/span&gt; &lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;timer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;map&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;ConcurrentHashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;windowSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;windowSize&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;capacity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="cm"&gt;/**
     * Checks if a request is allowed for the given requestId.
     *
     * @param requestId Unique identifier for a client/user
     * @return true if allowed, false if rate limit exceeded
     */&lt;/span&gt;
    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isAllowed&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;requestId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;currentTimeMillis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// Get or create FixedWindow for this requestId&lt;/span&gt;
        &lt;span class="nc"&gt;FixedWindow&lt;/span&gt; &lt;span class="n"&gt;fixedWindow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;computeIfAbsent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;requestId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FixedWindow&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;AtomicInteger&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="n"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Reset window if current time exceeds previous window&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentTimeMillis&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;fixedWindow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lastAccessTime&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;windowSize&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toMillis&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;synchronized&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fixedWindow&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentTimeMillis&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;fixedWindow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lastAccessTime&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;windowSize&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toMillis&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;fixedWindow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lastAccessTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
                    &lt;span class="n"&gt;fixedWindow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requestCount&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;capacity&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Reset request count&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="c1"&gt;// Allow request if capacity remains&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fixedWindow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requestCount&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;fixedWindow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requestCount&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;decrementAndGet&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Deny if limit reached&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="cm"&gt;/**
     * Internal class to hold request count and last access time per window.
     */&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FixedWindow&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;AtomicInteger&lt;/span&gt; &lt;span class="n"&gt;requestCount&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Tracks remaining requests&lt;/span&gt;
        &lt;span class="kd"&gt;volatile&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;lastAccessTime&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Timestamp of window start&lt;/span&gt;

        &lt;span class="nc"&gt;FixedWindow&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;AtomicInteger&lt;/span&gt; &lt;span class="n"&gt;requestCount&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;lastAccessTime&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requestCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requestCount&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lastAccessTime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lastAccessTime&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="cm"&gt;/**
     * Timer abstraction for easy testing (injectable current time provider)
     */&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="nf"&gt;Timer&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="nf"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&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;currentTimeMillis&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;
  
  
  🌐 Distributed Implementation (Redis + Java)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;When to Use:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High-scale APIs across multiple instances.
&lt;/li&gt;
&lt;li&gt;Requires central coordination to prevent users from exceeding limits globally.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Code for Redis-Based Fixed Window Rate Limiter:&lt;/strong&gt;&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;import&lt;/span&gt; &lt;span class="nn"&gt;redis.clients.jedis.Jedis&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;redis.clients.jedis.JedisPool&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="cm"&gt;/**
 * Distributed Fixed Window Rate Limiter using Redis.
 * Suitable for multi-instance applications.
 */&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;RedisFixedRateLimiter&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="nc"&gt;JedisPool&lt;/span&gt; &lt;span class="n"&gt;jedisPool&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Redis connection pool&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;rateLimitKeyPrefix&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Prefix for Redis keys, e.g., "rate_limit:"&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;maxRequestsPerWindow&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Max requests allowed per window&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;windowDurationInSeconds&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Window size in seconds&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;RedisFixedRateLimiter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;JedisPool&lt;/span&gt; &lt;span class="n"&gt;jedisPool&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;rateLimitKeyPrefix&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                                 &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;maxRequestsPerWindow&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
                                 &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;windowDurationInSeconds&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jedisPool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jedisPool&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;rateLimitKeyPrefix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rateLimitKeyPrefix&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;maxRequestsPerWindow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;maxRequestsPerWindow&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;windowDurationInSeconds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;windowDurationInSeconds&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="cm"&gt;/**
     * Checks if a request is allowed for a given userId.
     *
     * @param userId Unique identifier for the client/user
     * @return true if request is allowed, false if rate limit exceeded
     */&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isRequestAllowed&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;userId&lt;/span&gt;&lt;span class="o"&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;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rateLimitKeyPrefix&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;userId&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;Jedis&lt;/span&gt; &lt;span class="n"&gt;jedis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jedisPool&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getResource&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Atomically increment the request count in Redis&lt;/span&gt;
            &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;currentCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jedis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;incr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

            &lt;span class="c1"&gt;// Set expiration only for the first request in the window&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentCount&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;jedis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;expire&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;windowDurationInSeconds&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;

            &lt;span class="c1"&gt;// Allow if count does not exceed the maximum&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;currentCount&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;maxRequestsPerWindow&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Fail-open: allow requests if Redis is unavailable&lt;/span&gt;
            &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printStackTrace&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&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;
  
  
  ⚡ Fault Tolerance for Redis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Redis Down:&lt;/strong&gt; Implement a &lt;strong&gt;fail-open policy&lt;/strong&gt; (allow requests) or &lt;strong&gt;local fallback counters&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Circuit Breaker:&lt;/strong&gt; Temporarily stop excessive traffic when Redis is unreachable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graceful Degradation:&lt;/strong&gt; Use in-memory counters with a short TTL to limit impact until Redis recovers.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fixed Window is &lt;strong&gt;simple, efficient, and effective&lt;/strong&gt; for many straightforward use cases.
&lt;/li&gt;
&lt;li&gt;Main limitation: &lt;strong&gt;bursts at window boundaries&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single-machine approach:&lt;/strong&gt; Suitable for low-traffic, non-critical services.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redis-based approach:&lt;/strong&gt; Ideal for distributed high-traffic environments but requires fault-tolerance planning.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ratelimiting</category>
      <category>fixedwindow</category>
      <category>techinterviewprep</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Rate Limiting Algorithms: Concepts, Use Cases, and Implementation Strategies</title>
      <dc:creator>VipraTech Solutions</dc:creator>
      <pubDate>Tue, 09 Sep 2025 05:46:39 +0000</pubDate>
      <link>https://dev.to/vipratechsolutions/rate-limiting-algorithms-concepts-use-cases-and-implementation-strategies-33bl</link>
      <guid>https://dev.to/vipratechsolutions/rate-limiting-algorithms-concepts-use-cases-and-implementation-strategies-33bl</guid>
      <description>&lt;h2&gt;
  
  
  📚 What Is Rate Limiting and Why Is It Important?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Rate limiting&lt;/strong&gt; is a technique used to control how many times a client (user, IP, or service) can access an API or service within a defined time window.&lt;br&gt;&lt;br&gt;
It is essential for preventing abuse (e.g., DDoS attacks), ensuring fair usage of system resources, and maintaining application stability during high traffic periods.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Why Rate Limiting Matters
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Protects against malicious usage like brute-force attacks or excessive scraping.&lt;/li&gt;
&lt;li&gt;Prevents system overload during traffic spikes.&lt;/li&gt;
&lt;li&gt;Ensures consistent performance for all users.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ When to Apply Rate Limiting
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Public APIs&lt;/strong&gt; – Prevent misuse by external or unauthorized clients.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication Endpoints&lt;/strong&gt; – Block brute-force login attempts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment Gateways&lt;/strong&gt; – Prevent fraudulent transaction spamming.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Scraping Prevention&lt;/strong&gt; – Limit automated data harvesting.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚫 When Not to Apply Rate Limiting
&lt;/h2&gt;

&lt;p&gt;In some cases, applying rate limiting may not be appropriate or necessary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Internal Microservice Communication&lt;/strong&gt; – Introducing limits can create artificial bottlenecks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Systems&lt;/strong&gt; – Systems like chat apps, online gaming, or financial tickers require consistently low latency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Critical Business Services&lt;/strong&gt; – Healthcare, financial transactions, or emergency services must not throttle requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Caveat&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Deciding &lt;em&gt;not&lt;/em&gt; to apply rate limiting must be evaluated carefully per use case.&lt;br&gt;&lt;br&gt;
If skipped, ensure robust &lt;strong&gt;auto-scaling based on traffic patterns&lt;/strong&gt; to handle sudden spikes without service degradation.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ⚙️ Where Should Rate Limiting Be Implemented?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;th&gt;Pros&lt;/th&gt;
&lt;th&gt;Cons&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;API Gateway&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- Centralized control across services.&lt;br&gt;- Shields applications from cross-cutting concerns.&lt;br&gt;- Stops abusive traffic early.&lt;/td&gt;
&lt;td&gt;- Adds latency.&lt;br&gt;- Limited flexibility for fine-grained service rules.&lt;br&gt;- Single point of failure if not highly available.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sidecar Container&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- Service-level control close to the application.&lt;br&gt;- Easier horizontal scaling.&lt;br&gt;- More flexible than API Gateway.&lt;/td&gt;
&lt;td&gt;- Adds deployment complexity.&lt;br&gt;- Application may still be vulnerable if misconfigured.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Within Application&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;- Full flexibility and control.&lt;br&gt;- Best for business-specific rate limiting logic.&lt;/td&gt;
&lt;td&gt;- Higher development &amp;amp; maintenance effort.&lt;br&gt;- Application remains exposed to direct traffic spikes or DDoS attacks.&lt;br&gt;- Doesn’t handle network-level throttling.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ &lt;strong&gt;Best Practice&lt;/strong&gt;:&lt;br&gt;&lt;br&gt;
Combine &lt;strong&gt;API Gateway rate limiting&lt;/strong&gt; with application-level controls for critical endpoints to maximize protection.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🧱 Important HTTP Headers and Status Codes for API Rate Limiting
&lt;/h2&gt;

&lt;p&gt;When designing rate-limited APIs, it’s important to provide both &lt;strong&gt;HTTP headers&lt;/strong&gt; and &lt;strong&gt;status codes&lt;/strong&gt; so clients can manage their request behavior properly:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Headers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;X-RateLimit-Limit&lt;/code&gt;: Maximum allowed requests in the time window.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;X-RateLimit-Remaining&lt;/code&gt;: Remaining requests available in the current window.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;X-RateLimit-Reset&lt;/code&gt;: Timestamp (usually in Unix epoch seconds) when the limit resets.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;HTTP Status Codes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;200 OK&lt;/code&gt;&lt;/strong&gt;: The request was successful and within the rate limit.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;429 Too Many Requests&lt;/code&gt;&lt;/strong&gt;: The client has exceeded the allowed number of requests for the current window. Clients should respect the &lt;code&gt;X-RateLimit-Reset&lt;/code&gt; header before retrying.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example Behavior:&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;Scenario&lt;/th&gt;
&lt;th&gt;Status Code&lt;/th&gt;
&lt;th&gt;Headers Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Request under limit&lt;/td&gt;
&lt;td&gt;200 OK&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;X-RateLimit-Limit: 100&lt;/code&gt;, &lt;code&gt;X-RateLimit-Remaining: 50&lt;/code&gt;, &lt;code&gt;X-RateLimit-Reset: 1694294400&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Request exceeds limit&lt;/td&gt;
&lt;td&gt;429 Too Many Requests&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;X-RateLimit-Limit: 100&lt;/code&gt;, &lt;code&gt;X-RateLimit-Remaining: 0&lt;/code&gt;, &lt;code&gt;X-RateLimit-Reset: 1694294400&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This combination allows clients to &lt;strong&gt;implement proper retry strategies&lt;/strong&gt; and avoid unnecessary failures due to exceeding limits.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ Overview of Popular Rate Limiting Algorithms
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Algorithm&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Link for Detailed Article&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fixed Window&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simple counting of requests in fixed time intervals.&lt;br&gt;Risk of bursts at window boundaries.&lt;/td&gt;
&lt;td&gt;[Read More → TBD]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sliding Window&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tracks requests in a rolling time window.&lt;br&gt;Smoother distribution of limits.&lt;/td&gt;
&lt;td&gt;[Read More → TBD]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Leaky Bucket&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Processes requests at a fixed rate.&lt;br&gt;Excess requests are queued or dropped.&lt;/td&gt;
&lt;td&gt;[Read More → TBD]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Token Bucket&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tokens accumulate over time, allowing bursts up to a limit.&lt;br&gt;Highly flexible and widely used.&lt;/td&gt;
&lt;td&gt;[Read More → TBD]&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ✅ Conclusion
&lt;/h2&gt;

&lt;p&gt;Rate limiting is a critical tool to safeguard APIs and services from abuse, prevent resource exhaustion, and ensure reliable system performance.&lt;br&gt;&lt;br&gt;
However, the choice of algorithm, implementation location, and necessity must be carefully evaluated based on your system’s architecture and business needs.&lt;/p&gt;

&lt;p&gt;👉 Next Steps →&lt;br&gt;&lt;br&gt;
Explore our in-depth articles on each algorithm to learn about implementation examples, benefits, limitations, and strategies for single-machine and distributed setups.&lt;/p&gt;

</description>
      <category>ratelimiting</category>
      <category>distributedsystems</category>
      <category>systemdesign</category>
      <category>techinterviewprep</category>
    </item>
    <item>
      <title>Count-Min Sketch: A Memory-Efficient Way to Track Frequencies in Data Streams</title>
      <dc:creator>VipraTech Solutions</dc:creator>
      <pubDate>Mon, 08 Sep 2025 11:54:38 +0000</pubDate>
      <link>https://dev.to/vipratechsolutions/count-min-sketch-a-memory-efficient-way-to-track-frequencies-in-data-streams-1o4h</link>
      <guid>https://dev.to/vipratechsolutions/count-min-sketch-a-memory-efficient-way-to-track-frequencies-in-data-streams-1o4h</guid>
      <description>&lt;h2&gt;
  
  
  Count-Min Sketch: The Fast, Memory-Efficient Way to Estimate Frequencies in Data Streams
&lt;/h2&gt;

&lt;p&gt;In the realm of big data, accurately counting the frequency of elements in a massive stream can be a daunting task. Traditional methods often fall short due to memory constraints and the sheer volume of data. Enter &lt;strong&gt;Count-Min Sketch (CMS)&lt;/strong&gt;—a probabilistic data structure designed to provide approximate frequency counts with minimal memory usage.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 What Is Count-Min Sketch?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Count-Min Sketch&lt;/strong&gt; is a probabilistic data structure that serves as a frequency table of events in a stream of data. It uses multiple hash functions to map events to frequencies, but unlike a hash table, it uses only sub-linear space.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 Core Idea
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A 2D matrix of size &lt;code&gt;d x w&lt;/code&gt; (where &lt;code&gt;d&lt;/code&gt; is the number of hash functions and &lt;code&gt;w&lt;/code&gt; is the width).&lt;/li&gt;
&lt;li&gt;Each incoming element is hashed &lt;code&gt;d&lt;/code&gt; times (once per row) using different seeds or hash functions.&lt;/li&gt;
&lt;li&gt;Each hash function computes a column index where the count is incremented.&lt;/li&gt;
&lt;li&gt;The estimated count is the &lt;strong&gt;minimum&lt;/strong&gt; of the values across all hash functions.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ Simple Example
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem
&lt;/h3&gt;

&lt;p&gt;You have a small stream of words:&lt;br&gt;&lt;br&gt;
&lt;code&gt;["apple", "banana", "apple"]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We use a CMS with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;d = 2&lt;/code&gt; hash functions (rows)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;w = 5&lt;/code&gt; columns (columns indexed 0 to 4)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Step-by-Step Example
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Start with a zero-initialized matrix:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Row\Col&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Add "apple":

&lt;ul&gt;
&lt;li&gt;Hash1("apple") → 1 → increment table[0][1]&lt;/li&gt;
&lt;li&gt;Hash2("apple") → 3 → increment table[1][3]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Row\Col&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Add "banana":

&lt;ul&gt;
&lt;li&gt;Hash1("banana") → 2 → increment table[0][2]&lt;/li&gt;
&lt;li&gt;Hash2("banana") → 1 → increment table[1][1]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Row\Col&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Add "apple" again:

&lt;ul&gt;
&lt;li&gt;Hash1("apple") → 1 → increment table[0]&lt;a href="https://dev.tonow%202"&gt;1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Hash2("apple") → 3 → increment table[1]&lt;a href="https://dev.tonow%202"&gt;3&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Final matrix:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Row\Col&lt;/th&gt;
&lt;th&gt;0&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Query Example: Count of "apple"
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hash1("apple") → 1 → table[0][1] = 2
&lt;/li&gt;
&lt;li&gt;Hash2("apple") → 3 → table[1][3] = 2
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estimated count → min(2, 2) = &lt;strong&gt;2&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚖️ Trade-Offs: Accuracy vs. Memory
&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;Count-Min Sketch&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Memory Usage&lt;/td&gt;
&lt;td&gt;Fixed, sub-linear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accuracy&lt;/td&gt;
&lt;td&gt;Approximate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speed&lt;/td&gt;
&lt;td&gt;Very Fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overcounting&lt;/td&gt;
&lt;td&gt;Possible due to hash collisions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  🚀 Real-World Use Cases
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. &lt;strong&gt;Tracking Popular Hashtags in Social Media&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Efficiently track the frequency of hashtags in high-throughput environments like Twitter. CMS estimates frequencies without storing every individual tweet.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. &lt;strong&gt;Network Traffic Monitoring&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Estimate frequency of IP addresses or URLs accessed, useful for anomaly detection.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. &lt;strong&gt;Recommendation Systems&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Estimate popular items or user interactions to provide personalized recommendations.&lt;/p&gt;


&lt;h2&gt;
  
  
  💡 Example Java Implementation
&lt;/h2&gt;

&lt;p&gt;Copy the following Java code into your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public class CountMinSketch {
    private final int[][] table;
    private final int[] seeds;
    private final int rows;
    private final int cols;
    private final Random rand = new Random();

    public CountMinSketch(int rows, int cols) {
        this.rows = rows;
        this.cols = cols;
        this.table = new int[rows][cols];
        this.seeds = new int[rows];
        for (int i = 0; i &amp;lt; rows; i++) seeds[i] = rand.nextInt();
    }

    public void add(String key) {
        for (int i = 0; i &amp;lt; rows; i++) {
            int index = Math.abs(hash(key, seeds[i]) % cols);
            table[i][index]++;
        }
    }

    public int count(String key) {
        int min = Integer.MAX_VALUE;
        for (int i = 0; i &amp;lt; rows; i++) {
            int index = Math.abs(hash(key, seeds[i]) % cols);
            min = Math.min(min, table[i][index]);
        }
        return min;
    }

    private int hash(String key, int seed) {
        int hash = 0;
        for (char c : key.toCharArray()) {
            hash = hash * seed + c;
        }
        return hash;
    }
}

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ Conclusion
&lt;/h2&gt;

&lt;p&gt;Count-Min Sketch provides a space-efficient solution for estimating frequencies in data streams, with trade-offs acceptable in many real-world scenarios where approximate answers are good enough.&lt;/p&gt;

&lt;p&gt;For an advanced use case showing how to track &lt;strong&gt;Top-K Trending Hashtags&lt;/strong&gt;, see our dedicated article:&lt;br&gt;&lt;br&gt;
&lt;a href="https://vipratechsolutions.com/blogs/2828504" rel="noopener noreferrer"&gt;How to Find Top-K Trending Hashtags Using CMS&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cms</category>
      <category>systemdesign</category>
      <category>interview</category>
      <category>bigdata</category>
    </item>
    <item>
      <title>How to Find Top-K Trending Hashtags from a Stream of Tweets Using Count-Min Sketch</title>
      <dc:creator>VipraTech Solutions</dc:creator>
      <pubDate>Mon, 08 Sep 2025 11:41:09 +0000</pubDate>
      <link>https://dev.to/vipratechsolutions/how-to-find-top-k-trending-hashtags-from-a-stream-of-tweets-using-count-min-sketch-2dj3</link>
      <guid>https://dev.to/vipratechsolutions/how-to-find-top-k-trending-hashtags-from-a-stream-of-tweets-using-count-min-sketch-2dj3</guid>
      <description>&lt;p&gt;When working with massive streams of data like hashtags from tweets, storing and processing every individual hashtag becomes impractical due to high memory usage and real-time constraints.&lt;br&gt;&lt;br&gt;
👉 The goal:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Find the top-K trending hashtags in real time, from a continuous stream of tweets.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Problem Statement
&lt;/h2&gt;

&lt;p&gt;A large-scale tweet stream sends thousands of hashtags per second.&lt;br&gt;&lt;br&gt;
Your task: Continuously identify the most popular hashtags trending right now.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Challenges:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Huge volume of hashtags makes exact counting infeasible.&lt;/li&gt;
&lt;li&gt;Limited memory and need for fast processing.&lt;/li&gt;
&lt;li&gt;Real-time approximate results with good accuracy.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧐 Two Practical Approaches
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ Multiple CMS Time Window Approach
&lt;/h3&gt;

&lt;h4&gt;
  
  
  ✔️ What It Solves:
&lt;/h4&gt;

&lt;p&gt;Enables answering questions like:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“What are the top trending hashtags in the last 15 minutes?”
&lt;/li&gt;
&lt;li&gt;“What are the top trending hashtags in the last 30 minutes?”
&lt;/li&gt;
&lt;li&gt;“What are the top trending hashtags in the last 1 hour?”&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  ✔️ How It Works:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Maintain multiple CMS instances, one per fixed time window (e.g., one CMS per minute).&lt;/li&gt;
&lt;li&gt;Keep only the latest N CMS instances corresponding to the desired time window (sliding window).&lt;/li&gt;
&lt;li&gt;At query time, sum counts across the relevant CMS instances.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  ✅ Java Implementation Example:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SlidingWindowCMS&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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;windowSize&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="nc"&gt;LinkedList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;CountMinSketch&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cmsList&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;SlidingWindowCMS&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;windowSize&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;cols&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;windowSize&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;windowSize&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cmsList&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;LinkedList&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;addNewMinuteCMS&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CountMinSketch&lt;/span&gt; &lt;span class="n"&gt;newCms&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmsList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;windowSize&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;cmsList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;removeFirst&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;cmsList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addLast&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newCms&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;query&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;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;totalCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;CountMinSketch&lt;/span&gt; &lt;span class="n"&gt;cms&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cmsList&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;totalCount&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;cms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;totalCount&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;h3&gt;
  
  
  2️⃣ Decaying Count Approach
&lt;/h3&gt;

&lt;h4&gt;
  
  
  ✔️ What It Solves:
&lt;/h4&gt;

&lt;p&gt;Answers questions such as:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“What are the currently trending hashtags, giving more weight to recent data?”&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  ✔️ How It Works:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Use a single CMS instance.&lt;/li&gt;
&lt;li&gt;Periodically apply a &lt;strong&gt;decay factor&lt;/strong&gt; to all counters (e.g., multiply by 0.99 every minute).&lt;/li&gt;
&lt;li&gt;Recent hashtags remain significant while older counts fade automatically.&lt;/li&gt;
&lt;li&gt;Eliminates the need for storing multiple CMS instances.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  ✅ Java Implementation Example:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DecayingCMS&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="nc"&gt;CountMinSketch&lt;/span&gt; &lt;span class="n"&gt;cms&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="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;decayFactor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;DecayingCMS&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;cols&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;decayFactor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cms&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;CountMinSketch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cols&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;decayFactor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;decayFactor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;add&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;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;cms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;query&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;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;applyDecay&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;cms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;applyDecay&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decayFactor&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;h3&gt;
  
  
  ✅ Count-Min Sketch Implementation Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CountMinSketch&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="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[][]&lt;/span&gt; &lt;span class="n"&gt;table&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="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;seeds&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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;rows&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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;cols&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="nc"&gt;Random&lt;/span&gt; &lt;span class="n"&gt;rand&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;Random&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;CountMinSketch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;cols&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cols&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;cols&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;seeds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="n"&gt;seeds&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nextInt&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;add&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;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;abs&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seeds&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;cols&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;index&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="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;count&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;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MAX_VALUE&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;abs&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seeds&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;cols&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;min&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;min&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;]);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;applyDecay&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;factor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;cols&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt;
                &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="n"&gt;factor&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;hash&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;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toCharArray&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;hash&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;
  
  
  ✅ Conclusion
&lt;/h2&gt;

&lt;p&gt;When processing streams of hashtags in real time:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Use &lt;strong&gt;Multiple CMS Time Windows&lt;/strong&gt; if you need exact top-K in fixed time windows (e.g., last 15 min, 1 hour).&lt;/li&gt;
&lt;li&gt;✅ Use &lt;strong&gt;Decaying Counts CMS&lt;/strong&gt; for smooth, approximate real-time trending insights without separate windows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both approaches solve real-world problems depending on your requirements.&lt;/p&gt;

&lt;p&gt;👉 For a deeper overview of how Count-Min Sketch works in general, check out our detailed CMS overview 👉 &lt;a href="https://vipratechsolutions.com/blogs/2828522" rel="noopener noreferrer"&gt;Count-Min Sketch Overview&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cms</category>
      <category>systemdesign</category>
      <category>topktrending</category>
      <category>interview</category>
    </item>
    <item>
      <title>🚀 Bloom Filters: The Fast &amp; Memory-Efficient Way to Check Membership</title>
      <dc:creator>VipraTech Solutions</dc:creator>
      <pubDate>Mon, 08 Sep 2025 04:14:20 +0000</pubDate>
      <link>https://dev.to/vipratechsolutions/bloom-filters-the-fast-memory-efficient-way-to-check-membership-5hee</link>
      <guid>https://dev.to/vipratechsolutions/bloom-filters-the-fast-memory-efficient-way-to-check-membership-5hee</guid>
      <description>&lt;p&gt;Have you ever wondered how large systems answer the simple question:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Is this item in my dataset?”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Whether you’re checking if a username is taken, a web page is cached, or a key exists in a database, performance matters. That’s where &lt;strong&gt;Bloom filters&lt;/strong&gt; come in — a clever, space-efficient data structure that gives fast, probabilistic answers.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 What Is a Bloom Filter?
&lt;/h2&gt;

&lt;p&gt;A Bloom filter is a &lt;strong&gt;bit array&lt;/strong&gt; plus multiple &lt;strong&gt;hash functions&lt;/strong&gt;. It answers two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;em&gt;Definitely not in the set&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;⚠️ &lt;em&gt;Possibly in the set (with a small chance of error)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How It Works:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;To &lt;strong&gt;add an item&lt;/strong&gt;, hash it several ways and set bits in the array.
&lt;/li&gt;
&lt;li&gt;To &lt;strong&gt;check for presence&lt;/strong&gt;, hash it the same way and check the bits:

&lt;ul&gt;
&lt;li&gt;Any bit = &lt;code&gt;0&lt;/code&gt; → Definitely not present
&lt;/li&gt;
&lt;li&gt;All bits = &lt;code&gt;1&lt;/code&gt; → Possibly present (could be a false positive)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🎯 Simple Example
&lt;/h2&gt;

&lt;p&gt;Let’s say we have a bit array of size 10 with 2 hash functions (h1 &amp;amp; h2):&lt;br&gt;&lt;br&gt;
&lt;code&gt;[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add &lt;code&gt;"apple"&lt;/code&gt; → Hash to indexes h1("apple") = 3 and h2("apple") = 7 → &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;[0, 0, 0, 1, 0, 0, 0, 1, 0, 0]&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check &lt;code&gt;"apple"&lt;/code&gt; → Bits 3 &amp;amp; 7 are set → &lt;strong&gt;Possibly present (true in this case)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Check &lt;code&gt;"banana"&lt;/code&gt; → Bits at its hash indexes are not fully set → &lt;strong&gt;Definitely not present&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  💡 Example: Java Bloom Filter Implementation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.BitSet&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.util.Random&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;BloomFilter&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;BitSet&lt;/span&gt; &lt;span class="n"&gt;bitset&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;hashSeeds&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;BloomFilter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numHashes&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bitset&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;BitSet&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hashSeeds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;numHashes&lt;/span&gt;&lt;span class="o"&gt;];&lt;/span&gt;
        &lt;span class="nc"&gt;Random&lt;/span&gt; &lt;span class="n"&gt;rand&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;Random&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;numHashes&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;hashSeeds&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rand&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nextInt&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="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;hash&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;data&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toCharArray&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;abs&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;add&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;data&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hashSeeds&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;bitset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;set&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&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="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;mightContain&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;data&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hashSeeds&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;bitset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;;&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;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;BloomFilter&lt;/span&gt; &lt;span class="n"&gt;filter&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;BloomFilter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"apple"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"banana"&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="n"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mightContain&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"apple"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;   &lt;span class="c1"&gt;// true  &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="n"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mightContain&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"banana"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// true  &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="n"&gt;filter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mightContain&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"cherry"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// false&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;
  
  
  ✅ Why Use Bloom Filters?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Speed&lt;/strong&gt;: O(k) lookup time (k = number of hash functions)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Efficient&lt;/strong&gt;: Only stores bits, no actual items
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scales Well&lt;/strong&gt;: Handles huge datasets
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ But remember:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;False positives are possible (but false negatives are not).&lt;/li&gt;
&lt;li&gt;No element removal (unless using counting Bloom filters).

&lt;ul&gt;
&lt;li&gt;Standard Bloom filters only store bits, so removing an item by clearing bits can accidentally remove bits set by other items, leading to incorrect results. Counting Bloom filters use counters to track how many times a bit was set, allowing safe removal.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  ✅ Real-World Use Cases of Bloom Filters
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;Databases (e.g., Apache Cassandra, HBase)&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Databases store huge amounts of data on disk in sorted files called SSTables.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Without Bloom filters:&lt;/strong&gt; Every key lookup must check multiple files on disk, which is slow.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With Bloom filters:&lt;/strong&gt; Each SSTable has a Bloom filter summarizing its keys in memory.&lt;br&gt;&lt;br&gt;
When querying for a key:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Bloom filter is checked first.&lt;/li&gt;
&lt;li&gt;If &lt;strong&gt;false&lt;/strong&gt;, the file is skipped (definitely not there).&lt;/li&gt;
&lt;li&gt;If &lt;strong&gt;true&lt;/strong&gt;, the file is checked on disk (might be present).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This reduces expensive disk reads, improving performance significantly.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. &lt;strong&gt;Web Caching (e.g., CDNs like Cloudflare, Akamai)&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Content Delivery Networks (CDNs) cache web pages to serve them faster to users.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Problem:&lt;/strong&gt; Storing every cached URL in memory consumes a lot of space.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution with Bloom filters:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A Bloom filter stores all cached URLs in a compact form.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To check if a URL is cached, the system first checks the filter.&lt;/li&gt;
&lt;li&gt;If &lt;strong&gt;false → Not cached&lt;/strong&gt;, fetch from origin server.&lt;/li&gt;
&lt;li&gt;If &lt;strong&gt;true → Possibly cached&lt;/strong&gt;, check the cache.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This saves memory while speeding up cache lookups.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. &lt;strong&gt;Networking (Packet Routing)&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;In network routers, Bloom filters can help quickly decide if a packet’s destination is known, without storing large routing tables in memory.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the filter says &lt;strong&gt;false&lt;/strong&gt;, the packet does not go through that route.
&lt;/li&gt;
&lt;li&gt;If &lt;strong&gt;true&lt;/strong&gt;, deeper routing checks are performed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  4. &lt;strong&gt;Distributed Systems (e.g., Distributed Key-Value Stores)&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;In distributed databases or caches (like Amazon DynamoDB):&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Problem:&lt;/strong&gt; Before querying remote nodes, we want to know if they are likely to contain the requested data.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution with Bloom filters:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Each node maintains a Bloom filter of its keys in memory.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When a query comes in, the filter is checked first.
&lt;/li&gt;
&lt;li&gt;If &lt;strong&gt;false → Skip the node&lt;/strong&gt; (no point querying).
&lt;/li&gt;
&lt;li&gt;If &lt;strong&gt;true → Query the node&lt;/strong&gt; (might have the data).
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This minimizes network traffic and speeds up distributed lookups.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⚡ Conclusion
&lt;/h3&gt;

&lt;p&gt;Bloom filters are the unsung heroes of performance-critical systems.&lt;br&gt;
They help databases, caches, and distributed systems avoid expensive operations by providing fast, probabilistic membership checks.&lt;/p&gt;

&lt;p&gt;Next time your database feels lightning fast, chances are a Bloom filter is quietly doing its job! 🌟&lt;/p&gt;

</description>
      <category>bloomfilter</category>
      <category>datastructures</category>
      <category>systemdesign</category>
      <category>caching</category>
    </item>
    <item>
      <title>Navigating Software Resiliency: A Comprehensive Classification</title>
      <dc:creator>VipraTech Solutions</dc:creator>
      <pubDate>Wed, 19 Jun 2024 02:53:47 +0000</pubDate>
      <link>https://dev.to/vipra_tech_solutions/navigating-software-resiliency-a-comprehensive-classification-3m1k</link>
      <guid>https://dev.to/vipra_tech_solutions/navigating-software-resiliency-a-comprehensive-classification-3m1k</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In today’s digital era, software systems must be robust and resilient to meet the demands of users and withstand various challenges. Software resiliency ensures that a system can handle and recover from failures gracefully, maintaining functionality even under adverse conditions. This comprehensive guide will introduce you to the key concepts and categories of software resiliency, setting the stage for deeper exploration in subsequent articles.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Software Resiliency?
&lt;/h2&gt;

&lt;p&gt;Software resiliency refers to the ability of a system to recover quickly from failures and continue to function effectively. This involves not just avoiding failures, but also being prepared to handle them when they occur. A resilient system can maintain service continuity, often in a degraded state, without significant impact on the end-users.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Importance of Software Resiliency
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Business Continuity&lt;/strong&gt;: Ensures that critical services remain available even during failures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customer Satisfaction&lt;/strong&gt;: Minimizes downtime and maintains a seamless user experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operational Efficiency&lt;/strong&gt;: Reduces the time and effort required to recover from failures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost Savings&lt;/strong&gt;: Prevents revenue loss and reduces recovery costs associated with system outages.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  High-Level Classification of Software Resiliency Patterns and Practices
&lt;/h2&gt;

&lt;p&gt;To build resilient systems, it's essential to understand various patterns and practices. These can be broadly classified into several categories:&lt;/p&gt;

&lt;h3&gt;
  
  
  Fault Detection and Handling
&lt;/h3&gt;

&lt;p&gt;Detecting and handling faults promptly is essential to minimize the impact of failures.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Health Checks&lt;/strong&gt;: Continuously checks the health of system components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timeout&lt;/strong&gt;: Sets limits on how long to wait for operations to complete.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Circuit Breaker&lt;/strong&gt;: Prevents calls to a failing service to avoid cascading failures.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Fault Recovery
&lt;/h3&gt;

&lt;p&gt;Strategies for recovering from faults ensure that systems can maintain service continuity.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Retry&lt;/strong&gt;: Implements retry logic for transient failures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallback&lt;/strong&gt;: Provides alternative mechanisms when primary methods fail.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Autoscaling&lt;/strong&gt;: Adjusts the number of running instances based on load.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graceful Degradation&lt;/strong&gt;: Allows a system to continue operating in a reduced capacity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-Healing&lt;/strong&gt;: Automatically detects and recovers from faults.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warmup&lt;/strong&gt;: Gradually increases load on new instances to prevent sudden failures.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Fault Prevention
&lt;/h3&gt;

&lt;p&gt;Preventing faults before they occur is key to maintaining system stability.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multiple Instances&lt;/strong&gt;: Ensures redundancy by running multiple instances.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service Level Objective (SLO)&lt;/strong&gt;: Defines acceptable levels of service reliability and performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static Stability&lt;/strong&gt;: Ensures the system remains stable under expected load conditions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate Limiting&lt;/strong&gt;: Controls the rate of requests to prevent system overload.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Fault Isolation and Containment
&lt;/h3&gt;

&lt;p&gt;Fault isolation and containment are crucial to prevent a failure in one part of the system from affecting the entire system.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bulkhead&lt;/strong&gt;: Isolates different parts of a system to prevent cascading failures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-AZ (Availability Zone)&lt;/strong&gt;: Distributes applications across multiple availability zones within a region.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Region&lt;/strong&gt;: Distributes applications across different geographic regions for enhanced fault tolerance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Resiliency Testing
&lt;/h3&gt;

&lt;p&gt;Testing is essential to ensure that systems can handle and recover from failures.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chaos Engineering&lt;/strong&gt;: Intentionally introduces failures to test system resiliency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Load Testing&lt;/strong&gt;: Simulates high load to ensure the system can handle peak traffic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stress Testing&lt;/strong&gt;: Tests the system's ability to cope with extreme conditions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failover Testing&lt;/strong&gt;: Simulates failures to ensure failover mechanisms work correctly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Architectural Patterns for Resiliency
&lt;/h3&gt;

&lt;p&gt;Designing systems with resiliency in mind from the ground up is critical.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Microservices Architecture&lt;/strong&gt;: Designs systems as a collection of loosely coupled services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event-Driven Architecture&lt;/strong&gt;: Uses events to communicate between components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CQRS (Command Query Responsibility Segregation)&lt;/strong&gt;: Separates read and write operations to optimize performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Operational Practices
&lt;/h3&gt;

&lt;p&gt;Operational practices play a vital role in maintaining resilient systems.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Continuous Monitoring&lt;/strong&gt;: Keeps track of system performance and health in real-time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incident Response Plans&lt;/strong&gt;: Prepares procedures to quickly address and recover from failures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disaster Recovery Plans&lt;/strong&gt;: Defines strategies for recovering from catastrophic failures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regular Maintenance&lt;/strong&gt;: Ensures the system is regularly updated and maintained.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Building resilient software systems is not just about preventing failures but also about being prepared to handle them gracefully when they occur. By understanding and implementing these patterns and practices, you can ensure your systems are robust, reliable, and ready to meet the demands of today’s digital landscape.&lt;/p&gt;

&lt;p&gt;In the upcoming articles, we will dive deeper into each of these classifications, exploring specific patterns, real-world examples, and practical implementation tips. Stay tuned to master the art of building resilient software systems!&lt;/p&gt;

</description>
      <category>resiliency</category>
      <category>reliability</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Kafka vs SQS: A Comprehensive Comparison</title>
      <dc:creator>VipraTech Solutions</dc:creator>
      <pubDate>Sat, 15 Jun 2024 06:36:18 +0000</pubDate>
      <link>https://dev.to/vipratechsolutions/kafka-vs-sqs-a-comprehensive-comparison-5fj8</link>
      <guid>https://dev.to/vipratechsolutions/kafka-vs-sqs-a-comprehensive-comparison-5fj8</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Comparing Apache Kafka and Amazon SQS (Simple Queue Service) involves understanding their architectures, use cases, and performance characteristics. Both are popular messaging systems but are designed for different purposes and scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  High-Level Overview
&lt;/h2&gt;

&lt;p&gt;Apache Kafka is a distributed streaming platform that is used for building real-time streaming data pipelines and applications. It is known for its high throughput, fault tolerance, and scalability. Kafka is often used for building real-time analytics, log aggregation, and event-driven architectures.&lt;/p&gt;

&lt;p&gt;Amazon SQS, on the other hand, is a fully managed message queuing service that enables you to decouple and scale microservices, distributed systems, and serverless applications. SQS offers reliable message delivery and can handle high message throughput.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Kafka Works?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8g2g45avp152ohgzcjr7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8g2g45avp152ohgzcjr7.png" alt="How Kafka works?" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kafka Broker:&lt;/strong&gt; A Kafka broker is a server that stores and manages Kafka topics. It is responsible for receiving messages from producers, storing them on disk, and serving them to consumers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Topic:&lt;/strong&gt; A topic is a category or feed name to which records are published. Topics in Kafka are similar to tables in a database. They help in organizing and segregating messages.&lt;/li&gt;
&lt;li&gt;Partition: Topics in Kafka are divided into partitions to parallelize data across multiple brokers. Each partition is an ordered, immutable sequence of records that is continually appended to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Producer:&lt;/strong&gt; A producer is a client application that publishes records to Kafka topics. Producers are responsible for choosing which record to assign to which partition within the topic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consumer:&lt;/strong&gt; A consumer is a client application that reads records from Kafka topics. Consumers subscribe to one or more topics and process records in the order they are stored in the partition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consumer Group:&lt;/strong&gt; A Consumer Group is a collection of consumers that work together to consume and process records from Kafka topics. Each consumer in the group reads data from a subset of the partitions in the topic(s) assigned to that group.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kafka Record:&lt;/strong&gt; A Kafka record is a key-value pair consisting of a key, a value, and metadata. The key and value are byte arrays, and the metadata includes information such as the topic, partition, and offset of the record.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Basic Functioning of Kafka:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Producers publish records:&lt;/strong&gt; Producers send records to Kafka brokers. The producer specifies a topic and, optionally, a key, value, and partition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kafka stores records in partitions:&lt;/strong&gt; Each partition is an ordered sequence of records. Kafka appends incoming records to the end of the partition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consumers subscribe to topics:&lt;/strong&gt; Consumers subscribe to one or more topics and read records from partitions. Each consumer is assigned to one partition and reads records in the order they are stored.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Records are processed by consumers:&lt;/strong&gt; Consumers process records based on their application logic. Once a record is processed, the consumer commits its offset to Kafka to indicate that it has been processed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fault tolerance and scalability:&lt;/strong&gt; Kafka provides fault tolerance by replicating partitions across multiple brokers. This ensures that data is not lost in case of a broker failure. Kafka is scalable, allowing you to add more brokers and partitions to handle increased load.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Durability:&lt;/strong&gt; Kafka ensures that once a record is written to a partition, it is immutable and will not be lost unless the retention policy expires. This durability guarantee is crucial for applications that require data persistence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High throughput and low latency:&lt;/strong&gt; Kafka is designed to handle high message throughput with low latency, making it suitable for real-time streaming applications.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How SQS Works?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhxast49cdd3ds1eq8rxa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhxast49cdd3ds1eq8rxa.png" alt="How SQS Works?" width="800" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Queue:&lt;/strong&gt; An SQS queue is a buffer that stores messages. It acts as a temporary repository for messages that are waiting to be processed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Message:&lt;/strong&gt; A message in SQS is a unit of data that contains the payload (the actual data) and metadata (attributes such as message ID, timestamp, etc.). Messages are stored in SQS queues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Producers:&lt;/strong&gt; Producers are entities that send messages to SQS queues. They can be applications, services, or systems that generate messages to be processed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consumers:&lt;/strong&gt; Consumers are entities that receive and process messages from SQS queues. They can be applications, services, or systems that retrieve messages from queues for processing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Basic Functioning of SQS:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sending messages to queues:&lt;/strong&gt; Producers send messages to SQS queues using the SQS API or SDK. Messages are stored in the queue until they are processed by consumers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Receiving messages from queues:&lt;/strong&gt; Consumers poll SQS queues to receive messages. SQS guarantees that messages are delivered at least once and in the same order they are sent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Processing messages:&lt;/strong&gt; Consumers process messages based on their application logic. Once a message is processed, it is deleted from the queue. If a message cannot be processed successfully, SQS can be configured to retry delivering the message.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visibility timeout:&lt;/strong&gt; SQS provides a visibility timeout for messages. When a consumer receives a message from a queue, the message becomes invisible to other consumers for a specified period. This ensures that only one consumer processes the message at a time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dead-letter queues:&lt;/strong&gt; SQS allows you to configure a dead-letter queue (DLQ) for messages that cannot be processed successfully after a certain number of retries. Messages sent to the DLQ can be analyzed to identify and fix processing issues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scaling:&lt;/strong&gt; SQS is designed to scale horizontally to handle large numbers of messages and consumers. You can increase the number of queues, message producers, and consumers to accommodate increased load.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability:&lt;/strong&gt; SQS is a fully managed service provided by AWS, ensuring high availability and durability of messages. AWS manages the infrastructure and handles tasks such as message replication and storage.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Detailed Comparison
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Kafka vs SQS
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Features&lt;/th&gt;
&lt;th&gt;Apache Kafka&lt;/th&gt;
&lt;th&gt;Amazon SQS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;- Fully Managed by Confluent, AWS MSK Managed Service, Manual Deployment&lt;/td&gt;
&lt;td&gt;AWS SQS Managed Service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability&lt;/td&gt;
&lt;td&gt;Horizontally scalable with partitioning and broker replication.&lt;/td&gt;
&lt;td&gt;Automatically scales with demand, but individual queues have throughput limits.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Message Retention&lt;/td&gt;
&lt;td&gt;Configurable retention period for messages, with Confluent also supporting tiered storage.&lt;/td&gt;
&lt;td&gt;Max 14 days.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Message Ordering&lt;/td&gt;
&lt;td&gt;Preserves order within a partition based on partition key.&lt;/td&gt;
&lt;td&gt;FIFO queue supports ordering but with limited throughput, while the Standard queue does not support ordering but offers high throughput.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Message Delivery&lt;/td&gt;
&lt;td&gt;At-least-once, exactly-once, and at-most-once semantics.&lt;/td&gt;
&lt;td&gt;Standard Queue - At-least Once&lt;br&gt;FIFO Queue - Exactly Once&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Message Size Limit&lt;/td&gt;
&lt;td&gt;Limited by broker configuration&lt;/td&gt;
&lt;td&gt;256 KiB per message (There are other ways to support larger messages but supported at its core)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Message Visibility&lt;/td&gt;
&lt;td&gt;Messages remain in the queue until consumed or retention period expires&lt;/td&gt;
&lt;td&gt;Messages become invisible for a specified time when polled by a consumer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vendor Lock-in&lt;/td&gt;
&lt;td&gt;Open-source with no vendor lock-in, can be deployed on any infrastructure&lt;/td&gt;
&lt;td&gt;Tied to AWS, which may limit flexibility in switching to other cloud providers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Durability&lt;/td&gt;
&lt;td&gt;Data replication across brokers ensures high durability.&lt;/td&gt;
&lt;td&gt;Messages are stored redundantly across multiple servers.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Communication Pattern&lt;/td&gt;
&lt;td&gt;Pub/Sub Architecture&lt;/td&gt;
&lt;td&gt;SQS offers producer/consumer queuing pattern and no pub/sub by design, but can be implemented in conjunction with SNS.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Message ACK&lt;/td&gt;
&lt;td&gt;Auto and Manual Commits&lt;/td&gt;
&lt;td&gt;Based on Visibility timeout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parallelism&lt;/td&gt;
&lt;td&gt;Based on no of partitions in a topic.&lt;/td&gt;
&lt;td&gt;Based on the number of consumers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;High throughput and low latency due to efficient batching and partitioning.&lt;/td&gt;
&lt;td&gt;Good performance but can vary based on message size and queue configuration.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integration&lt;/td&gt;
&lt;td&gt;Rich ecosystem with Kafka Streams, Kafka Connect, and integrations with big data tools.&lt;/td&gt;
&lt;td&gt;Strong integration with AWS services like Lambda, SNS, and more.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use Kafka:&lt;/strong&gt; For real-time data pipelines, high-throughput requirements, complex streaming needs, message replay, pub/sub, and when you need fine-grained control over message processing.&lt;br&gt;
&lt;strong&gt;Use SQS:&lt;/strong&gt; For simple queueing requirements, easy integration with AWS services, managed service with minimal operational overhead, and when message ordering and deduplication are required.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
