<?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: Solvelyn tech</title>
    <description>The latest articles on DEV Community by Solvelyn tech (@solvelyn_tech_6f691ce5521).</description>
    <link>https://dev.to/solvelyn_tech_6f691ce5521</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4226160%2F5df1f25b-b38f-4b7a-acee-ea191b00ebd7.png</url>
      <title>DEV Community: Solvelyn tech</title>
      <link>https://dev.to/solvelyn_tech_6f691ce5521</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/solvelyn_tech_6f691ce5521"/>
    <language>en</language>
    <item>
      <title>How did the team decide not to use Kafka for live location updates of a delivery driver app?</title>
      <dc:creator>Solvelyn tech</dc:creator>
      <pubDate>Wed, 04 Nov 2026 12:16:11 +0000</pubDate>
      <link>https://dev.to/solvelyn_tech_6f691ce5521/how-did-the-team-decide-not-to-use-kafka-for-live-location-updates-of-a-delivery-driver-app-28p3</link>
      <guid>https://dev.to/solvelyn_tech_6f691ce5521/how-did-the-team-decide-not-to-use-kafka-for-live-location-updates-of-a-delivery-driver-app-28p3</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;u&gt;The project: Akaiva Edu Power&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
We are developing Akaiva Edu Power — a same-day delivery platform for books and stationery built for Akaiva Edu Private Limited. Orders placed before 11 am reach customers the same day. A small fleet of delivery drivers is tracked live on a map so customers can watch their delivery approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;The default answer: Kafka&lt;/u&gt;&lt;/strong&gt;&lt;br&gt;
Whenever a room full of engineers hears the phrase "real-time location of delivery drivers", someone will immediately say Kafka. The reasoning is sound in principle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drivers emit location events at high frequency. &lt;/li&gt;
&lt;li&gt;Many consumers (customer apps, dashboards, dispatch systems) may want to read those events independently. &lt;/li&gt;
&lt;li&gt;Kafka's log-based architecture absorbs enormous write throughput and lets you replay history.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a company like Swiggy, Dunzo, or Amazon Flex — with thousands of concurrent drivers — Kafka earns its complexity. But this is a startup, not a hyperscaler.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our actual numbers:&lt;/strong&gt;&lt;br&gt;
Forty rows per minute into a location table. Postgres handles millions of rows per second in write-heavy OLTP workloads. There was simply no load problem to solve.&lt;/p&gt;

&lt;p&gt;What Kafka would have cost us&lt;br&gt;
Setting up Kafka (or a managed alternative like Confluent Cloud / AWS MSK) for this use case would have meant:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Infra overhead — a Kafka cluster, ZooKeeper (or KRaft), topic management, consumer group offsets. 2. Ops burden — monitoring lag, retention policies, partition rebalancing. 3. Developer complexity — producers, consumers, serialisation schemas (Avro/Protobuf), exactly-once semantics. 4. Cost — managed Kafka starts at roughly ₹6,000–₹15,000 per month at the smallest tier; a Postgres instance on the same cloud is a fraction of that. 5. Time — weeks of engineering that a 10-driver startup does not have budget for.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What we did instead&lt;br&gt;
We kept it simple:&lt;/p&gt;

&lt;p&gt;Drivers → POST /location → API route → Postgres upsert on driver id&lt;/p&gt;

&lt;p&gt;The location table has one row per driver, updated in place every 50 seconds:&lt;/p&gt;

&lt;p&gt;CREATE TABLE driver_locations (&lt;br&gt;
  driver_id   UUID        PRIMARY KEY REFERENCES drivers(id),&lt;br&gt;
  lat         NUMERIC(9,6) NOT NULL,&lt;br&gt;
  lng         NUMERIC(9,6) NOT NULL,&lt;br&gt;
  updated_at  TIMESTAMPTZ  NOT NULL DEFAULT now()&lt;br&gt;
);&lt;br&gt;
The customer app polls GET /delivery/{order_id}/location every 30 seconds (or we push via a simple WebSocket channel for the 1–2 active deliveries at a time). The query is a single indexed primary-key lookup — sub-millisecond.&lt;/p&gt;

&lt;p&gt;The lesson&lt;br&gt;
Over-engineering is a form of waste. Choose the simplest solution that handles your actual load, with a clear upgrade path if that ever changes.&lt;br&gt;
If Akaiva Edu ever scales to 500 drivers doing 5-second pings, the right move is to evaluate a message queue at that point — with real numbers, real costs and a team that has the bandwidth to operate it. Until then, Postgres is fast, reliable, cheap, and already in the stack.&lt;/p&gt;

&lt;p&gt;About the author&lt;br&gt;
Leena Wooledge is a Senior Software Developer at Akaiva Private Limited. She leads backend architecture decisions across the Akaiva Edu product suite.&lt;/p&gt;

&lt;p&gt;At &lt;a href="//solvelyn.com"&gt;solvelyn.com&lt;/a&gt; we develop apps, websites, web apps and software with perfection. If you want your app or website to be built, &lt;a href="//solvelyn.com/contact"&gt;contact here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>startup</category>
      <category>founder</category>
      <category>softwaredevelopment</category>
    </item>
  </channel>
</rss>
