<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Akmal Ariq — Blog</title>
    <link>https://akmalariq.dev/blog/</link>
    <description>Notes on data engineering, storage, and system design — written to be re-read.</description>
    <language>en</language>
    <atom:link href="https://akmalariq.dev/blog/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Late-arriving data: when the event shows up after the report closed</title>
      <link>https://akmalariq.dev/blog/late-arriving-data/</link>
      <guid isPermaLink="true">https://akmalariq.dev/blog/late-arriving-data/</guid>
      <pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate>
      <description>Event time is not arrival time. How late data breaks closed reports and incremental loads, and the patterns that make it harmless: watermarking, lookback reprocessing, idempotent partitions, and versioned event logs.</description>
      <category>streaming</category>
      <category>event-time</category>
      <category>watermarks</category>
      <category>idempotency</category>
      <category>data-quality</category>
    </item>
    <item>
      <title>Break your CDC pipeline on purpose</title>
      <link>https://akmalariq.dev/blog/break-your-cdc-pipeline/</link>
      <guid isPermaLink="true">https://akmalariq.dev/blog/break-your-cdc-pipeline/</guid>
      <pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate>
      <description>A lab that kills the consumer mid-batch, poisons the topic, and replays a consumer group — plus the bug this pipeline shipped with and how I found it.</description>
      <category>kafka</category>
      <category>dlq</category>
      <category>observability</category>
      <category>testing</category>
      <category>streaming</category>
    </item>
    <item>
      <title>Effectively-once: making a Kafka → ClickHouse sink idempotent</title>
      <link>https://akmalariq.dev/blog/effectively-once-cdc-clickhouse/</link>
      <guid isPermaLink="true">https://akmalariq.dev/blog/effectively-once-cdc-clickhouse/</guid>
      <pubDate>Tue, 29 Sep 2026 00:00:00 GMT</pubDate>
      <description>Kafka only promises at-least-once. Here is how write-then-commit, source-timestamp versions, and ReplacingMergeTree make duplicates harmless — without claiming exactly-once.</description>
      <category>clickhouse</category>
      <category>kafka</category>
      <category>idempotency</category>
      <category>exactly-once</category>
      <category>streaming</category>
    </item>
    <item>
      <title>Change data capture, explained by building it</title>
      <link>https://akmalariq.dev/blog/change-data-capture-explained/</link>
      <guid isPermaLink="true">https://akmalariq.dev/blog/change-data-capture-explained/</guid>
      <pubDate>Tue, 22 Sep 2026 00:00:00 GMT</pubDate>
      <description>Why a nightly sync is never enough — and how Debezium, Kafka, and a Python consumer turn the write-ahead log into a live replica of your database.</description>
      <category>cdc</category>
      <category>streaming</category>
      <category>debezium</category>
      <category>kafka</category>
      <category>postgres</category>
    </item>
    <item>
      <title>File storage vs block storage vs object storage</title>
      <link>https://akmalariq.dev/blog/file-vs-block-vs-object-storage/</link>
      <guid isPermaLink="true">https://akmalariq.dev/blog/file-vs-block-vs-object-storage/</guid>
      <pubDate>Wed, 16 Sep 2026 00:00:00 GMT</pubDate>
      <description>The differences that actually matter to a data engineer — and why your lakehouse lives on objects while your database lives on blocks.</description>
      <category>storage</category>
      <category>fundamentals</category>
      <category>system-design</category>
    </item>
  </channel>
</rss>
