<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>gywn&#39;s tech</title>
    <link>/en/</link>
    <description>Recent content on gywn&#39;s tech</description>
    <generator>Hugo</generator>
    <language>en</language>
    <managingEditor>gywndi@gmail.com (gywndi)</managingEditor>
    <webMaster>gywndi@gmail.com (gywndi)</webMaster>
    <lastBuildDate>Sun, 23 Aug 2026 23:31:52 +0900</lastBuildDate>
    <atom:link href="/en/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Debezium Only Captures - Verifying Source Swapping and Parallel Processing in Practice</title>
      <link>/en/2026/08/embedded-debezium-parallel-pipeline/</link>
      <pubDate>Sun, 23 Aug 2026 22:30:49 +0900</pubDate><author>gywndi@gmail.com (gywndi)</author>
      <guid>/en/2026/08/embedded-debezium-parallel-pipeline/</guid>
      <description>&lt;h2 id=&#34;previous-post-recap&#34;&gt;Previous Post Recap&lt;/h2&gt;&#xA;&lt;p&gt;In the &lt;a href=&#34;/en/2026/08/debezium-smt-cant-parallelize/&#34;&gt;previous post&lt;/a&gt;, I confirmed that splitting the Debezium embedded engine&amp;rsquo;s callback into a submit thread (TRD1) and an order-preserving drain thread (TRD2) lets you process in parallel with no performance loss (98-101%) while still preserving order. But that was a pure benchmark - just a single id pulled out, queued, and checked for order.&lt;/p&gt;&#xA;&lt;p&gt;This post set out to build two things.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Can you swap MySQL for Postgres without changing a single line of our code?&lt;/strong&gt; Just as swapping a JDBC driver leaves the application logic untouched, I implemented Debezium so it&amp;rsquo;s only responsible for &amp;ldquo;where to capture from&amp;rdquo; - everything after that (transforming, sending) is application code we write however we need.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Does &amp;ldquo;parallel processing while preserving order,&amp;rdquo; confirmed by the benchmark, still hold when the workers are running a real transform and sending to a real Kafka, not just an id?&lt;/strong&gt; Last time I measured order with a single id; this time I reproduced that same conclusion with a small application that transforms real columns and sends to a real Kafka.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;the-full-data-flow&#34;&gt;The Full Data Flow&lt;/h2&gt;&#xA;&lt;p&gt;Multi-source only branches at the Debezium connector stage. Everything after that (TRD1 - worker pool - TRD2 - KafkaSink) is handled by exactly the same code regardless of source, and it all lands in the same topic.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SMTs Can&#39;t Be Parallelized — Boosting Throughput Outside Debezium While Preserving Order</title>
      <link>/en/2026/08/debezium-smt-cant-parallelize/</link>
      <pubDate>Tue, 18 Aug 2026 22:57:37 +0900</pubDate><author>gywndi@gmail.com (gywndi)</author>
      <guid>/en/2026/08/debezium-smt-cant-parallelize/</guid>
      <description>&lt;h1 id=&#34;cdc-and-debezium&#34;&gt;CDC and Debezium&lt;/h1&gt;&#xA;&lt;p&gt;When you need to sync data in real time between heterogeneous systems (RDBMS, search engines, caches, other services&amp;rsquo; databases, etc.), periodically polling the source database has limits in both scalability and latency. CDC (Change Data Capture) is the standard way to solve this — reading a database&amp;rsquo;s change log in real time and turning those changes into events delivered to wherever they&amp;rsquo;re needed. Debezium is one of the most widely used open-source tools for implementing CDC, and it&amp;rsquo;s a common core component in data-sync pipelines across heterogeneous systems.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Understanding Vitess by Building It Yourself, Locally</title>
      <link>/en/2026/08/vitess-from-scratch-bare-metal-sharding/</link>
      <pubDate>Sun, 09 Aug 2026 23:15:14 +0900</pubDate><author>gywndi@gmail.com (gywndi)</author>
      <guid>/en/2026/08/vitess-from-scratch-bare-metal-sharding/</guid>
      <description>&lt;p&gt;There comes a point where a single MySQL instance just can&amp;rsquo;t keep up with the data anymore.&#xA;Vitess is one of the approaches YouTube, Slack, and GitHub have used to solve this problem.&#xA;I worked through what Vitess actually does, what components it&amp;rsquo;s made of, and how those&#xA;components should actually be laid out, by building it myself in a local Docker environment.&#xA;The setup shown here is posted as-is in a &lt;a href=&#34;https://github.com/gywndi/vitess-example&#34;&gt;GitHub repo&lt;/a&gt;,&#xA;and you can spin it up yourself with nothing but Docker.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Local LLM Comment Moderation — A Model Swap Story</title>
      <link>/en/2026/03/cafe-llm-model-migration/</link>
      <pubDate>Fri, 27 Mar 2026 22:15:02 +0900</pubDate><author>gywndi@gmail.com (gywndi)</author>
      <guid>/en/2026/03/cafe-llm-model-migration/</guid>
      <description>&lt;h2 id=&#34;comments-were-piling-up&#34;&gt;Comments Were Piling Up&lt;/h2&gt;&#xA;&lt;p&gt;When someone leaves a comment on my café&amp;rsquo;s guestbook, a human doesn&amp;rsquo;t review it first — a local LLM does. It decides whether the comment is abusive, an ad, or just a nice review, and handles it automatically.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://cafepurplemint.com&#34;&gt;https://cafepurplemint.com&lt;/a&gt; (a tiny bit of shameless promotion)&lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;Then one day, while going through the logs, I noticed something odd.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[MOD] Processing 5 pending entries...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[MOD] Processing 5 pending entries...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[MOD] Processing 5 pending entries...&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The same log line kept repeating. The next poll was kicking off before the previous batch had finished processing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How AI Helped Me Clean Up a Cafe Menu</title>
      <link>/en/2026/03/cafe-menu-ai-assistant/</link>
      <pubDate>Sat, 14 Mar 2026 22:37:02 +0900</pubDate><author>gywndi@gmail.com (gywndi)</author>
      <guid>/en/2026/03/cafe-menu-ai-assistant/</guid>
      <description>&lt;h1 id=&#34;fixing-a-homepage-after-3-years&#34;&gt;Fixing a Homepage After 3 Years&lt;/h1&gt;&#xA;&lt;p&gt;My wife currently runs an unmanned cafe. And three years ago, I built the cafe&amp;rsquo;s homepage on WordPress.&lt;/p&gt;&#xA;&lt;p&gt;Since then, I&amp;rsquo;d barely touched it. Menus changed, images changed, but the homepage just sat there. Maintaining it was too much of a hassle. One day I opened it up and it was completely out of sync with reality — discontinued items were still listed, and current items were missing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Claude Code Writing Code Before You&#39;ve Even Defined Requirements?</title>
      <link>/en/2026/03/ralph-workflow-for-claude-code/</link>
      <pubDate>Tue, 10 Mar 2026 16:16:38 +0900</pubDate><author>gywndi@gmail.com (gywndi)</author>
      <guid>/en/2026/03/ralph-workflow-for-claude-code/</guid>
      <description>&lt;h2 id=&#34;the-problem-you-run-into-with-claude-code&#34;&gt;The problem you run into with Claude Code&lt;/h2&gt;&#xA;&lt;p&gt;These days, more and more developers are using &lt;strong&gt;Claude Code&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Claude Code is Anthropic&amp;rsquo;s AI coding tool — you describe what you want in the terminal, and it writes the actual code for you. It&amp;rsquo;s genuinely powerful.&lt;/p&gt;&#xA;&lt;p&gt;But if you&amp;rsquo;ve used it for a while, you&amp;rsquo;ve probably run into something like this.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;Build me a sign-up feature.&amp;rdquo;&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;That&amp;rsquo;s all you said, and Claude starts churning out everything from database design to API code. At first it feels like &amp;ldquo;wow, that&amp;rsquo;s fast!&amp;rdquo; — but look closer, and it&amp;rsquo;s often not what you actually wanted.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Career</title>
      <link>/en/page/career/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>gywndi@gmail.com (gywndi)</author>
      <guid>/en/page/career/</guid>
      <description>&lt;h2 id=&#34;about&#34;&gt;About&lt;/h2&gt;&#xA;&lt;p&gt;Designed and built one of Korea&amp;rsquo;s first large-scale distributed MySQL databases for a financial service, running &lt;strong&gt;tens of thousands of transactions per second across hundreds of production databases&lt;/strong&gt; with zero downtime, while automating repetitive operations so that systems handle about 90% of routine work.&lt;/p&gt;&#xA;&lt;p&gt;Later expanded focus &lt;strong&gt;from storing data to moving it&lt;/strong&gt; — building and operating an in-house CDC platform that delivers large-scale change data from Oracle/MySQL/PostgreSQL to services in real time, along with a Kafka-based environment processing up to 1 million messages per second.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
