<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Comviva MFS Engineering Tech Blog on Medium]]></title>
        <description><![CDATA[Stories by Comviva MFS Engineering Tech Blog on Medium]]></description>
        <link>https://medium.com/@dfs.techblog?source=rss-ffa38b73a75------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*r_HXBhTBTvz9CCVXEMjJDg.png</url>
            <title>Stories by Comviva MFS Engineering Tech Blog on Medium</title>
            <link>https://medium.com/@dfs.techblog?source=rss-ffa38b73a75------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 24 May 2026 21:04:52 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@dfs.techblog/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Kubernetes Hardening & Optimization Checklist]]></title>
            <link>https://medium.com/@dfs.techblog/kubernetes-hardening-optimization-checklist-711d45dff908?source=rss-ffa38b73a75------2</link>
            <guid isPermaLink="false">https://medium.com/p/711d45dff908</guid>
            <category><![CDATA[kubernetes]]></category>
            <dc:creator><![CDATA[Comviva MFS Engineering Tech Blog]]></dc:creator>
            <pubDate>Mon, 02 Mar 2026 07:24:47 GMT</pubDate>
            <atom:updated>2026-03-02T07:39:37.719Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/64/0*g1zk1t8KMu2RhHks.png" /><figcaption>-By <a href="https://medium.com/u/5bd601ad4beb">Sudhakar Bhat</a> , T Archana Shetty</figcaption></figure><p>As part of our ongoing platform reliability and security improvements,<br>we evaluated a set of Kubernetes best practices across infrastructure,<br>scheduling, security, storage, and governance.</p><p>Below is a consolidated view of what we implemented, what we tuned, and<br>what we intentionally decided not to adopt along with the reasoning.</p><h3>1. Image Optimization &amp; Cleanup</h3><h3>Optimizing Image Sizes</h3><p>We adapted the <strong>Dive tool</strong> to analyze container layers and reduce<br>image bloat.</p><p><strong>Impact</strong> — UI optimized to 98% — Image size reduced by &gt;83%</p><p>Smaller images reduce: Pull time</p><ul><li>Startup latency</li><li>Registry storage costs</li></ul><h3>Pruning Unused Images (Kubelet GC Tuning)</h3><p>Kubernetes includes built-in image garbage collection managed by<br><strong>Kubelet</strong>.</p><p>Two key parameters:</p><ul><li>image-gc-high-threshold (default: 85–90%)</li><li>image-gc-low-threshold (default: 80%)</li></ul><p>We tuned this more aggressively:</p><pre>--image-gc-high-threshold=60<br>--image-gc-low-threshold=50</pre><p>Location:</p><pre>/var/lib/kubelet/kubeadm-flags.env</pre><p>This ensures earlier cleanup and avoids disk pressure under high<br>deployment frequency.</p><h3>2. Scheduling &amp; Workload Placement</h3><h3>Node Affinity &amp; Anti-Affinity</h3><p>To ensure: — Controlled workload placement — Fault<br>isolation</p><h3>Taints &amp; Tolerations</h3><p>Used to isolate infrastructure workloads from application workloads.</p><h3>Descheduler (Not Required)</h3><p>We use <strong>dedicated worker nodes</strong> for specific workloads.<br>Even if pods are evicted, they must reschedule on the same worker class.</p><p>Therefore, descheduler eviction adds little value in our current<br>architecture.</p><h3>3. Kernel-Level Performance Tuning</h3><p>Kernel tuning is node-level (not Kubernetes-specific) and useful during:</p><ul><li>High traffic spikes</li><li>Network packet drops</li><li>Latency anomalies</li></ul><h3>Network buffer tuning</h3><pre>sysctl -w net.core.rmem_max=26214400<br>sysctl -w net.core.wmem_max=26214400</pre><h3>Increase open file descriptors</h3><pre>sysctl -w fs.file-max=100000</pre><p>⚠ These changes must be validated during load testing before production<br>rollout.</p><h3>4. Resource Optimization</h3><h3>Vertical Pod Autoscaler (VPA)</h3><p>To right-size workloads dynamically.</p><h3>5. Network Security with Cilium</h3><h3>IPsec Encryption</h3><p>Enabled at Cilium layer for encrypted pod-to-pod communication.</p><h3>7. CSI Volume Cloning</h3><p>CSI volume cloning allows duplication of existing volumes.</p><p>However:</p><ul><li>Supported only for CSI drivers</li><li>Supported only for dynamic provisioners</li><li>We currently do not use CSI drivers</li></ul><p>Therefore, CSI cloning is not applicable in our setup.</p><h3>8. Namespace Segregation</h3><ul><li>Infra namespace</li><li>Application namespace</li><li>OAM namespace</li><li>UI namespace</li></ul><p>Ensures: — Logical separation — Access boundary enforcement — Cleaner<br>RBAC model</p><h3>9. Structured Logging</h3><p>JSON logging implemented across services.</p><p>Benefits: — Better log parsing — SIEM compatibility — Faster incident<br>investigation</p><h3>Key Takeaways</h3><ol><li>Not every Kubernetes feature should be adopted blindly.</li><li>Context-driven architecture decisions matter.</li><li>Policy-as-Code (OPA) significantly strengthens governance.</li><li>Image size optimization and GC tuning offer immediate ROI.</li><li>Kernel tuning should always be validated under load.</li></ol><p><em>Originally published at </em><a href="https://medium.com/@sudhakar.bhat247/kubernetes-hardening-optimization-checklist-6a1129cef04a"><em>https://medium.com</em></a><em> on March 2, 2026.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=711d45dff908" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Cross-Site Scripting (XSS): Why innerHTML Is Dangerous (and What Else to Avoid)]]></title>
            <link>https://medium.com/@dfs.techblog/cross-site-scripting-xss-why-innerhtml-is-dangerous-and-what-else-to-avoid-0a11e550dda9?source=rss-ffa38b73a75------2</link>
            <guid isPermaLink="false">https://medium.com/p/0a11e550dda9</guid>
            <category><![CDATA[cross-site-scripting]]></category>
            <dc:creator><![CDATA[Comviva MFS Engineering Tech Blog]]></dc:creator>
            <pubDate>Mon, 02 Mar 2026 07:10:03 GMT</pubDate>
            <atom:updated>2026-03-02T07:11:34.162Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/64/0*_SpvnKORd3MKnPJ1.png" /><figcaption>-By <a href="https://medium.com/u/5bd601ad4beb">Sudhakar Bhat</a></figcaption></figure><h3>Introduction</h3><p>Cross-Site Scripting (XSS) is not an exotic vulnerability. It often hides inside everyday features like:</p><ul><li>remarks fields</li><li>comments</li><li>notes</li><li>audit descriptions</li><li>rich text inputs</li></ul><p>The root cause is almost always the same:</p><blockquote>Treating user input as executable HTML.</blockquote><p>One of the biggest offenders is innerHTML — but it’s not the only one.</p><p>This article explains:</p><ul><li>why regex filtering doesn’t work</li><li>why innerHTML is dangerous</li><li>other APIs that cause XSS</li><li>what attackers can actually do</li><li>how to prevent it properly</li></ul><p>This is written for engineers building real systems, not theoretical demos.</p><h3>The Typical Mistake: Rendering Remarks as HTML</h3><p>Developers want to preserve formatting:</p><pre>element.innerHTML = userInput;</pre><p>To “secure” it, they add regex:</p><pre>if (!/&lt;script&gt;/i.test(userInput)) {<br> element.innerHTML = userInput;<br>}</pre><p>This feels safe.</p><p>It is not.</p><p>Attackers don’t need &lt;script&gt;.</p><p>They can use:</p><pre>&lt;img src=x onerror=alert(1)&gt;<br>&lt;svg onload=alert(1)&gt;<br>&lt;a href=&quot;javascript:alert(1)&quot;&gt;click&lt;/a&gt;</pre><p>Regex cannot predict all attack variations.</p><p>Security is not pattern matching.</p><p>It’s context-aware escaping.</p><h3>Why Regex Filtering Fails</h3><p>Regex assumes attacks follow predictable patterns.</p><p>Attackers can:</p><ul><li>encode payloads</li><li>nest tags</li><li>split keywords</li><li>abuse attributes</li><li>use browser quirks</li><li>inject via SVG or CSS</li><li>use event handlers instead of script tags</li></ul><p>There are hundreds of bypass techniques.</p><p>No regex can safely sanitize HTML.</p><p>Only an HTML parser can.</p><h3>What Happens During XSS</h3><p>When you use innerHTML, the browser parses the string as DOM.</p><p>That means:</p><ul><li>scripts run</li><li>event handlers execute</li><li>injected CSS applies</li><li>malicious links activate</li></ul><p>The attacker’s code runs with your app’s permissions.</p><p>To the browser:</p><blockquote>The attack is trusted content.</blockquote><h3>What an Attacker Can Do</h3><p>XSS is not just alert popups.</p><p>Real damage includes:</p><ul><li>stealing session tokens</li><li>account takeover</li><li>data exfiltration</li><li>injecting fake UI</li><li>phishing inside your app</li><li>hidden click hijacking via CSS</li><li>persistent stored attacks</li></ul><p>Stored XSS is especially dangerous because it spreads to all viewers.</p><h3>innerHTML Is Not the Only Dangerous API</h3><p>Many APIs silently execute HTML or scripts.</p><p>Avoid these with untrusted input:</p><h3>Dangerous APIs</h3><ul><li>innerHTML</li><li>outerHTML</li><li>insertAdjacentHTML</li><li>document.write</li><li>eval()</li><li>new Function()</li><li>setTimeout(string)</li><li>React: dangerouslySetInnerHTML</li><li>Angular: bypassSecurityTrustHtml</li></ul><p>These APIs are unsafe <strong>only when used with untrusted data</strong>. Untrusted includes any data that ultimately originated from users, external systems, logs, or databases — even if it’s now stored internally.</p><h3>Safe Alternatives</h3><h3>Use text rendering instead of HTML</h3><pre>element.textContent = userInput;</pre><p>This treats input as text.</p><p>No execution. No parsing. Safe by default.</p><h3>If HTML formatting is required</h3><p>Use a real sanitizer:</p><ul><li>DOMPurify</li><li>sanitize-html</li><li>OWASP HTML Sanitizer</li></ul><pre>element.innerHTML = DOMPurify.sanitize(userInput);</pre><p>Sanitizers understand DOM structure.</p><p>Regex does not.</p><h3>Defense in Depth</h3><p>Even sanitized systems should add extra protection.</p><h3>Enable Content Security Policy (CSP)</h3><pre>Content-Security-Policy: default-src &#39;self&#39;;</pre><p>CSP limits script execution and reduces XSS impact.</p><p>Not a replacement — a safety net.</p><h3>Escape on output, not input</h3><p>Store raw data.</p><p>Escape when rendering.</p><p>Input validation ≠ output encoding.</p><h3>Treat stored content as untrusted</h3><p>Even database data.</p><p>Stored XSS is one of the most common enterprise vulnerabilities.</p><h3>Practical Engineering Checklist</h3><p>Before rendering dynamic content:</p><ul><li>Are we using textContent instead of innerHTML?</li><li>If HTML is needed, are we sanitizing with a real library?</li><li>Are React/Angular escape hatches avoided?</li><li>Is CSP enabled?</li><li>Are remarks/comment fields reviewed specifically?</li><li>Are logs and audit text escaped?</li></ul><p>Remarks fields are the #1 hidden XSS surface.</p><h3>Closing Thoughts</h3><p>XSS happens when data becomes code.</p><p>Regex filtering gives false confidence.</p><p>The real rule is simple:</p><blockquote>Never execute user input as HTML. <br>Sanitize with proper tools. <br>Default to safe rendering</blockquote><p><em>Originally published at </em><a href="https://medium.com/@sudhakar.bhat247/cross-site-scripting-xss-why-innerhtml-is-dangerous-and-what-else-to-avoid-8eef0e259370"><em>https://medium.com</em></a><em> on March 2, 2026.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0a11e550dda9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Multi-Tenancy Approach]]></title>
            <link>https://medium.com/@dfs.techblog/multi-tenancy-approach-08dc360aa40d?source=rss-ffa38b73a75------2</link>
            <guid isPermaLink="false">https://medium.com/p/08dc360aa40d</guid>
            <category><![CDATA[multitenant-architecture]]></category>
            <dc:creator><![CDATA[Comviva MFS Engineering Tech Blog]]></dc:creator>
            <pubDate>Wed, 04 Feb 2026 06:14:37 GMT</pubDate>
            <atom:updated>2026-02-05T03:35:24.723Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/64/0*1UjAhAW07wA3w6ao.png" /><figcaption>- By T. Archana Shetty, <a href="https://medium.com/u/5bd601ad4beb">Sudhakar Bhat</a></figcaption></figure><p>Multi-tenancy is a foundational architectural concept in cloud-native and SaaS platforms. It enables a single system to serve multiple customers (tenants) while ensuring strict data isolation and efficient resource utilization.</p><p>At its core, multi-tenancy allows several users to share computing, networking, config and storage resources without ever accessing one another’s data. When implemented correctly, it balances scalability, cost efficiency, performance, and security.</p><p>This article explores:</p><p>* What multi-tenancy really means</p><p>* Configuration strategies</p><p>* Database architecture approaches</p><p>* Scheduler design per tenant</p><p>* Trade-offs of each model</p><p>* When to choose what</p><h3>What is a Tenant?</h3><p>A tenant is a client or customer served by one or more application instances. In a SaaS product, each tenant typically represents an organization or logical customer group.</p><p>Although tenants share infrastructure, the system must guarantee:</p><p>* Logical isolation of data</p><p>* Security boundaries</p><p>* Configuration independence</p><p>* Performance fairness</p><p>Multi-tenancy is not just a database pattern it affects configuration management, deployment strategy, scaling, background processing, and operational complexity.</p><h3>Multi-Tenancy Configuration Strategies</h3><p>Each tenant may require different settings such as:</p><p>* Branding</p><p>* Feature flags</p><p>* API endpoints</p><p>* Rate limits</p><p>* Business rules</p><p>Two common implementation approaches exist.</p><h3>Tenant-Specific Property Loading at Startup</h3><p>Each tenant has its own configuration file loaded into memory or cache during application boot.</p><p>Example:</p><p>app-tenant_1.properties</p><p>app-tenant_2.properties</p><p>app-tenant_3.properties</p><p>How it works:</p><p>* At startup, the application loads all tenant configs</p><p>* They are stored in memory/cache</p><p>* Runtime lookup fetches tenant-specific configuration</p><p>Advantages:</p><p>* Clear separation of tenant configs</p><p>* Easy debugging</p><p>* Explicit onboarding</p><p>Disadvantages:</p><p>* Boot time increases with tenant count</p><p>* Higher memory footprint</p><p>* Operational overhead managing many files</p><p>Best suited for small to mid-sized tenant ecosystems.</p><h3>Single Property File with Dynamic Keys</h3><p>A shared configuration file contains tenant-prefixed keys.</p><p>Example:</p><p>app.properties</p><p>Inside the file:</p><p>tenant_1.db.url=…</p><p>tenant_2.db.url=…</p><p>tenant_1.featureX.enabled=true</p><p>tenant_2.featureX.enabled=false</p><p>Keys are generated dynamically using tenant IDs.</p><p>Advantages:</p><p>* Centralized configuration</p><p>* Faster boot time</p><p>* Easier automation</p><p>Disadvantages:</p><p>* Large files become hard to manage</p><p>* Risk of misconfiguration</p><p>* Reduced readability</p><p>This approach scales better when tenant onboarding is automated.</p><h3>Multi-Tenancy Database Architecture</h3><p>There are three common multi-tenant database models. Each is a trade-off between cost, complexity, and isolation.</p><h3>Shared Schema (Shared Database)</h3><p>All tenant data lives in the same tables with a tenant identifier column.</p><p>Example table structure:</p><p>orders</p><p>tenant_id | order_id | amount | …</p><p>Advantages:</p><p>* Simplest architecture</p><p>* Lowest infrastructure cost</p><p>* Easy deployment</p><p>Disadvantages:</p><p>* Performance degradation at scale</p><p>* Large shared tables</p><p>* Harder tenant isolation</p><p>Ideal for early-stage SaaS or lightweight systems.</p><h3>Schema-per-Tenant (Shared Database, Separate Schemas)</h3><p>Each tenant has its own schema inside a shared database instance.</p><p>Example layout:</p><p>db_instance</p><p>tenant_1_schema</p><p>tenant_2_schema</p><p>tenant_3_schema</p><p>Advantages:</p><p>* Better performance</p><p>* Stronger separation</p><p>* Easier tenant backup/restore</p><p>Disadvantages:</p><p>* More complex migrations</p><p>* Schema lifecycle management required</p><p>Suitable for mid-scale SaaS platforms.</p><h3>Database-per-Tenant (Separate Databases)</h3><p>Each tenant gets its own database or DB instance.</p><p>Example layout:</p><p>tenant_1_db</p><p>tenant_2_db</p><p>tenant_3_db</p><p>Advantages:</p><p>* Best performance isolation</p><p>* Maximum data separation</p><p>* Independent scaling</p><p>Disadvantages:</p><p>* Highest infrastructure cost</p><p>* Operational complexity</p><p>* Requires strong automation</p><p>Used in enterprise SaaS, fintech, and regulated industries.</p><h3>Scheduler Design in Multi-Tenant Systems</h3><p>Background jobs introduce a unique challenge in multi-tenant architecture. Examples include:</p><p>* Billing cycles</p><p>* Report generation</p><p>* Data sync</p><p>* Notifications</p><p>* Cleanup jobs</p><p>A key design decision is whether to run:</p><p>* One global scheduler for all tenants</p><p>* A scheduler per tenant</p><h3>Scheduler Per Tenant Simpler and Safer</h3><p>The simplest and most reliable model is scheduler-per-tenant.</p><p>Each tenant has its own scheduled job context, either:</p><p>* Dedicated worker threads</p><p>* Tenant-scoped job queues</p><p>* Isolated cron triggers</p><p>Why this approach works well:</p><p>* Tenant failures don’t impact others</p><p>* Easy debugging</p><p>* Natural workload isolation</p><p>* Clear ownership boundaries</p><p>* Fair resource usage</p><p>If Tenant A has heavy workloads, Tenant B remains unaffected.</p><h3>Implementation Patterns</h3><p>Tenant-aware job queue</p><p>Each job carries tenant metadata:</p><p>job → tenantId: tenant_1</p><p>job → type: billing</p><p>job → payload: {…}</p><p>Workers fetch and process jobs in tenant context.</p><p>Dedicated scheduler instance per tenant</p><p>Each tenant registers its own cron:</p><p>tenant_1 → 01:00 billing job</p><p>tenant_2 → 01:15 billing job</p><p>Logical isolation in distributed schedulers</p><p>Using Quartz clusters, Kubernetes CronJobs, or message queue schedulers where tenants run as independent job namespaces.</p><h3>Advantages of Scheduler-Per-Tenant</h3><p>* Failure isolation</p><p>* Predictable execution</p><p>* Easier SLA management</p><p>* Tenant-level throttling</p><p>* Better observability</p><p>Disadvantages:</p><p>* Slightly higher orchestration overhead</p><p>* Requires tenant lifecycle automation</p><p>Despite this, scheduler-per-tenant is often the most maintainable long-term model.</p><h3>Choosing the Right Multi-Tenant Strategy</h3><p>There is no universal best architecture. The right model depends on:</p><p>* Tenant volume</p><p>* Compliance requirements</p><p>* Budget</p><p>* Performance expectations</p><p>* Growth trajectory</p><p>* Operational maturity</p><p>Many systems evolve over time:</p><p>Shared Schema → Schema-per-Tenant → Database-per-Tenant</p><p>Similarly, background processing evolves:</p><p>Global Scheduler → Tenant-Aware Scheduler → Scheduler-per-Tenant</p><h3>Final Thoughts</h3><p>Multi-tenancy is a strategic architectural decision, not just a technical pattern.</p><p>Every choice balances:</p><p>* Simplicity vs isolation</p><p>* Cost vs scalability</p><p>* Speed vs flexibility</p><p>The most successful systems design for growth early and automate tenant lifecycle management from day one.</p><p>Modern SaaS platforms often adopt hybrid approaches dedicating resources to high-value tenants while sharing infrastructure for smaller ones.</p><p>The goal is not perfect isolation.</p><p>The goal is controlled, scalable, and observable multi-tenancy.</p><p><em>Originally published at </em><a href="https://medium.com/@sudhakar.bhat247/multi-tenancy-approach-8d285edd5c33"><em>https://medium.com</em></a><em> on February 4, 2026.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=08dc360aa40d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How we use a tech radar strategy to drive safe and continuous software upgrades]]></title>
            <link>https://medium.com/@dfs.techblog/how-we-use-a-tech-radar-strategy-to-drive-safe-and-continuous-software-upgrades-71e8fe635c32?source=rss-ffa38b73a75------2</link>
            <guid isPermaLink="false">https://medium.com/p/71e8fe635c32</guid>
            <category><![CDATA[upgrade]]></category>
            <category><![CDATA[strategy]]></category>
            <dc:creator><![CDATA[Comviva MFS Engineering Tech Blog]]></dc:creator>
            <pubDate>Mon, 22 Dec 2025 10:52:44 GMT</pubDate>
            <atom:updated>2025-12-22T10:52:44.462Z</atom:updated>
            <content:encoded><![CDATA[<p>— By <a href="https://medium.com/u/5bd601ad4beb">Sudhakar Bhat</a>, Bhavna Gupta</p><h3>Introduction</h3><p>In fast growing platforms, <strong>software upgrades are inevitable </strong>but unmanaged upgrades lead to instability, security gaps, and production incidents. Over time, we realised that ad-hoc upgrade decisions or reactive patching were not scalable.</p><p>To address this, we institutionalised a <strong>Tech Radar</strong> a <strong>monthly, structured, and action-oriented internal practice</strong> that governs how we track, evaluate, and upgrade <strong>both internal infrastructure and third-party software</strong> across our product ecosystem.</p><p>This document outlines <strong>our Tech Radar strategy</strong>, how it works in practice, and why it has become a core part of our engineering governance.</p><h3>What Is Our Tech Radar?</h3><p>Our Tech Radar is a <strong>monthly internal engineering blog and review process</strong> that captures the <strong>current state, risks, and planned actions</strong> for all critical technologies used in our platform.</p><p>It covers:</p><ul><li>Core infrastructure components</li><li>Application frameworks and runtimes</li><li>Databases and messaging systems</li><li>Observability and security tools</li><li>Third-party SDKs and libraries</li></ul><p>The goal is simple:</p><blockquote><strong><em>Ensure every technology we run has a clear, conscious ownership and upgrade path.</em></strong></blockquote><h3>Why We Needed a Tech Radar</h3><p>Before introducing the Tech Radar, we faced recurring challenges:</p><ul><li>Unplanned upgrades triggered by incidents</li><li>Security patches applied inconsistently</li><li>Multiple versions of the same software running in production</li><li>No single view of “what version are we on and why”</li><li>Upgrade risk being discovered only during release windows</li></ul><p>The Tech Radar shifted us from <strong>reactive upgrades</strong> to <strong>planned evolution</strong>.</p><h3>Scope of the Tech Radar</h3><p>The Tech Radar tracks <strong>everything that can affect platform stability</strong>.</p><h3>Infrastructure &amp; Platform</h3><ul><li>Kubernetes</li><li>Databases</li><li>Messaging systems</li><li>Security components</li></ul><h3>Application Stack</h3><ul><li>Java, Spring Boot</li><li>Node.js</li><li>Angular / frontend frameworks and other web apps</li></ul><h3>Observability &amp; Tooling</h3><ul><li>Grafana</li><li>Superset</li><li>Logging and monitoring agents</li></ul><h3>Third-Party Integrations</h3><ul><li>SDKs</li><li>External APIs</li></ul><h3>Monthly Tech Radar Cadence</h3><p>The Tech Radar operates on a <strong>fixed monthly cycle</strong>.</p><h3>Step 1: Version Discovery</h3><p>Each team identifies:</p><ul><li>Current version in production</li><li>Latest stable version available</li><li>End-of-life or deprecation notices</li></ul><h3>Step 2: Risk &amp; Impact Assessment</h3><p>For each technology, we assess:</p><ul><li>Security vulnerabilities</li><li>Performance or stability risks</li><li>Breaking changes</li><li>Compatibility with existing workloads</li></ul><h3>Step 3: Radar Classification</h3><p>Each item is classified into one of four states:</p><ul><li><strong>Adopt</strong> — Proven, safe, and recommended for use</li><li><strong>Trial</strong> — Promising, under controlled evaluation</li><li><strong>Hold</strong> — Stable but not recommended for new usage</li><li><strong>Retire</strong> — Planned removal or replacement</li></ul><h3>Action-Oriented Output</h3><p>The Tech Radar is not a passive document.</p><p>Every entry must result in a <strong>clear action</strong>, such as:</p><ul><li>Upgrade now</li><li>Upgrade in next quarter</li><li>Hold and reassess</li><li>Replace with alternative</li></ul><p>Each action includes:</p><ul><li>Owner</li><li>Target timeline</li><li>Risk level</li><li>Dependencies</li></ul><p>This ensures the radar directly feeds into <strong>engineering roadmaps and sprint planning</strong>.</p><h3>How the Tech Radar Drives Software Upgrades</h3><h3>Planned Upgrades</h3><ul><li>Major upgrades are identified months in advance</li><li>Compatibility testing is scheduled proactively</li><li>Infra and application upgrades are aligned</li></ul><h3>Reduced Blast Radius</h3><ul><li>Early identification of breaking changes</li><li>Canary or phased rollout strategies for application</li><li>Rollback plans defined before execution</li></ul><h3>Security by Default</h3><ul><li>CVEs are tracked monthly</li><li>Patch windows are planned instead of rushed</li><li>No “unknown” versions running in production</li></ul><h3>Ownership Model</h3><p>Each technology has:</p><ul><li>A <strong>primary owner</strong></li><li>A <strong>secondary reviewer</strong></li><li>Clear escalation paths</li></ul><p>Ownership ensures:</p><ul><li>Accountability for upgrades</li><li>Consistent knowledge across teams</li><li>Faster decision-making during incidents</li></ul><h3>Publishing the Tech Radar</h3><p>The finalised Tech Radar is published as:</p><ul><li>A <strong>monthly internal Medium blog</strong></li><li>A reference document for engineering and leadership</li><li>Input for architecture and risk reviews</li></ul><p>This transparency helps:</p><ul><li>Align teams on technology direction</li><li>Reduce duplicated evaluations</li><li>Create a shared understanding of platform maturity</li></ul><h3>Benefits We’ve Observed</h3><p>Since adopting the Tech Radar, we have seen:</p><ul><li>Fewer surprise upgrades</li><li>Faster and safer production rollouts</li><li>Improved security posture</li><li>Better cross-team alignment</li><li>Clear technology lifecycle visibility</li></ul><p>Most importantly, upgrades are now a <strong>strategic decision</strong>, not an emergency response.</p><h3>Key Takeaways</h3><ul><li>A Tech Radar works only if it is <strong>action-driven</strong></li><li>Monthly cadence keeps information relevant</li><li>Ownership and accountability are critical</li><li>Publishing the radar creates organisational clarity</li></ul><h3>Closing Thoughts</h3><p>Technology constantly evolves but platforms should evolve <strong>deliberately</strong>.</p><p>Our Tech Radar acts as a <strong>compass</strong>, helping us balance innovation with stability, and speed with safety. It has become a foundational practice in how we run and scale our engineering platform.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=71e8fe635c32" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How clickHouse reduced our log storage cost and enabled scalable multi-tenancy]]></title>
            <link>https://medium.com/@dfs.techblog/how-clickhouse-reduced-our-log-storage-cost-and-enabled-scalable-multi-tenancy-1240b7c5a8d4?source=rss-ffa38b73a75------2</link>
            <guid isPermaLink="false">https://medium.com/p/1240b7c5a8d4</guid>
            <category><![CDATA[clickhouse]]></category>
            <category><![CDATA[logging]]></category>
            <dc:creator><![CDATA[Comviva MFS Engineering Tech Blog]]></dc:creator>
            <pubDate>Mon, 22 Dec 2025 06:55:10 GMT</pubDate>
            <atom:updated>2025-12-22T06:55:10.782Z</atom:updated>
            <content:encoded><![CDATA[<p>-by <a href="https://medium.com/u/5bd601ad4beb">Sudhakar Bhat</a>, Harish R1</p><h3>Background: The Log Analytics Problem We Were Solving</h3><p>As our platform scaled, <strong>log volume grew exponentially</strong>, especially with increasing TPS and microservice adoption. Over time, we started seeing clear pain points:</p><ul><li>High <strong>storage cost per hour</strong></li><li>Increasing <strong>query response latency</strong>, even for simple lookups</li><li><strong>Dropped logs</strong> during peak traffic</li><li>Difficulty enforcing <strong>tenant-level isolation</strong></li><li>Operational overhead in managing retention and scaling</li></ul><p>We needed a solution that could:</p><ul><li>Sustain <strong>high log ingestion rates</strong></li><li>Provide <strong>fast analytical queries</strong></li><li>Significantly <strong>reduce storage footprint</strong></li><li>Support <strong>multitenancy by design</strong></li><li>Integrate seamlessly with <strong>Grafana</strong></li></ul><p>This led us to evaluate and adopt <strong>ClickHouse</strong>.</p><h3>Why ClickHouse?</h3><p>ClickHouse is an <strong>open-source, columnar database</strong> designed for <strong>high-performance analytics and reporting</strong>. Unlike traditional search-centric systems, ClickHouse is optimized for:</p><ul><li>Large-scale aggregations</li><li>Sequential columnar reads</li><li>High compression ratios</li><li>Predictable performance under load</li><li>Key reasons it stood out for our logging use case:</li><li>Queries read only required columns</li><li>Compression is enabled by default</li><li>Simple horizontal scalability</li><li>Strong performance even with massive datasets</li></ul><h3>Compression: The Biggest Cost Reduction Lever</h3><p>One of the most immediate benefits we observed was <strong>storage reduction through compression</strong>.</p><h3>What We Got by Default</h3><ul><li>ClickHouse automatically uses <strong>compression</strong></li><li>Extremely fast compression and decompression</li><li>No additional tuning required to see benefits</li></ul><h3>Additional Optimizations We Applied</h3><ul><li>Chose precise data types instead of generic String</li><li>Used LowCardinality for: tenantId,sourceHost,component</li></ul><p>This drastically reduced dictionary size and disk usage, especially for repetitive values common in logs.</p><h3>Benchmark Results: Elastic vs ClickHouse (50 TPS)</h3><p>We benchmarked both systems under similar conditions. The results were decisive.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hzKrWYvvRy3lYNFdyD2T-A.png" /></figure><p><strong>Outcome:</strong></p><p>ClickHouse reduced log storage by 6times while delivering <strong>6x faster query performance</strong>.</p><h3>Log Ingestion Architecture (Fluent Bit → ClickHouse)</h3><p>Fluent Bit does not provide a native ClickHouse output plugin, so we used <strong>HTTP ingestion</strong>, which worked reliably at scale.</p><h3>Ingestion Flow</h3><p>Fluent Bit reads logs from:</p><pre>/var/log/pods/*.log</pre><p>Converts logs into JSONEachRow format</p><p>Sends logs via <strong>HTTP output plugin</strong></p><p>ClickHouse ingests logs on <strong>port 8123</strong></p><p>This approach proved:</p><ul><li>Simple to operate</li><li>High throughput</li><li>Easy to debug</li></ul><h3>Log Schema Design</h3><pre>CREATE TABLE applog ON CLUSTER default<br>(<br>  eventTime String,<br>  eventType String,<br>  sourceHost String,<br>  component String,<br>  tenantId String,<br>  flowId String,<br>  threadName String,<br>  level String,<br>  message String,<br>  stacktrace String<br>)<br>ORDER BY eventTime;</pre><p>The schema was created once using ON CLUSTER, automatically propagating across all ClickHouse pods.</p><h3>Enabling multitenancy with Row-Level Security</h3><h3>Creating Users (Cluster-Wide)</h3><pre>CREATE USER T1 IDENTIFIED BY &#39;T1&#39; ON CLUSTER default;<br>CREATE USER T2 IDENTIFIED BY &#39;T2&#39; ON CLUSTER default;</pre><p>Using ON CLUSTER ensured:</p><ul><li>Users were created on all pods</li><li>No manual synchronization was required</li></ul><h3>Defining Row-Level Policies</h3><pre>CREATE ROW POLICY T1_policy<br>ON default.testlog<br>FOR SELECT<br>USING tenantId = &#39;T1&#39;<br>TO T1<br>ON CLUSTER default;</pre><pre>CREATE ROW POLICY T2_policy<br>ON default.testlog<br>FOR SELECT<br>USING tenantId = &#39;T2&#39;<br>TO T2<br>ON CLUSTER default;</pre><h3>Granting Access</h3><pre>GRANT SELECT ON testlog TO T1 ON CLUSTER default;<br>GRANT SELECT ON testlog TO T2 ON CLUSTER default;</pre><h3>Verification</h3><pre>clickhouse-client --user=T1 --password=XXXX<br>clickhouse-client --user=T2 --password=XXXX</pre><ul><li>Each tenant can only view its own logs</li><li>The default/admin user can view all logs</li><li>Logs without a tenant identifier are visible only to admin</li></ul><h3>Visualization and Monitoring with Grafana</h3><h3>Grafana Configuration</h3><ul><li>Installed ClickHouse plugin</li><li>Added ClickHouse as a data source:</li><li>Host: clickhouse.T.svc.cluster.local</li><li>Database: applog</li><li>Port: 8123</li><li>Protocol: HTTP</li></ul><h3>Sample Query</h3><pre>SELECT<br>  message,<br>  flowId,<br>  component,<br>  level<br>FROM applog;</pre><p>We primarily used <strong>table views</strong> for logs and dashboards for:</p><ul><li>Error analysis</li><li>Component-level failures</li><li>Tenant-level observability</li></ul><h3>Retention and Performance Best Practices</h3><ul><li>Use <strong>TTL</strong> to automatically purge old logs</li><li>Avoid deletes and manual cleanup</li><li>Use LowCardinality aggressively</li><li>Prefer TTL over ILM-style workflows</li></ul><h3>Problems ClickHouse Solved for Us</h3><ul><li>Drastically reduced <strong>log storage cost</strong></li><li>Eliminated <strong>log drops</strong> under load</li><li>Faster troubleshooting and RCA</li><li>Clean and enforceable <strong>multitenancy</strong></li><li>Simpler operational model</li><li>Predictable scaling behavior</li></ul><h3>Closing Thoughts</h3><p>ClickHouse helped us move from <strong>search-heavy logging</strong> to <strong>analytics-driven observability</strong>.</p><p>The combination of <strong>compression, performance, and tenant isolation</strong> made it a strong fit for our scale and growth trajectory.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1240b7c5a8d4" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Disappearance of Craft: What Happens When Everyone Can Build?]]></title>
            <link>https://medium.com/@dfs.techblog/the-disappearance-of-craft-what-happens-when-everyone-can-build-264b32c8997d?source=rss-ffa38b73a75------2</link>
            <guid isPermaLink="false">https://medium.com/p/264b32c8997d</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[future-of-work]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Comviva MFS Engineering Tech Blog]]></dc:creator>
            <pubDate>Fri, 19 Dec 2025 04:01:16 GMT</pubDate>
            <atom:updated>2025-12-19T04:01:16.916Z</atom:updated>
            <content:encoded><![CDATA[<p>By Swagata Acharyya</p><p>There was a time (not too long ago) when craft was defined by distance.</p><p>You could watch a potter shape clay all day, but that did not make you a potter. You could stand beside a carpenter for years and still not understand the language between wood, grain, pressure, and patience. Craft lived not in observation, but in execution, in repetition, in failure, in time.</p><p>Software also, once (until in very recent past) shared that gravity.</p><p>To build something meaningful, we had to wrestle with constraints. We learned by breaking things, misjudging complexity, losing data, taking systems down, apologising to users. Understanding was earned through friction. And that friction shaped identity. It separated curiosity from capability. It created pride. Today, that <em>distance</em> is collapsing.</p><p>For the first time in the history of software, execution is no longer the bottleneck. Interfaces, APIs, infrastructure, tests, even full deployment pipelines can now be generated in seconds. The distance between imagination and implementation has nearly collapsed.</p><p>This is celebrated as progress. But something far more subtle is disappearing in the process.</p><p><strong>The Craft</strong>.</p><h3>The Collapse of Execution as Power</h3><p>For decades, the software world ran on a simple truth: <em>execution was scarce</em>. Those who could execute held power. Careers, hierarchies, credibility, and compensation were all organised around this scarcity. If you could build what others could not, you mattered. Now, execution is becoming abundant.</p><p>Machines do not forget syntax. They do not grow tired of boilerplate. They do not hesitate in front of unfamiliar frameworks, or neither do they feel dread at unfamiliar codebases. They generate endlessly, tirelessly.</p><p>When everyone can produce output, output stops being a reliable signal of competence. When output stops being a signal, craft loses its social visibility.</p><p>You can still practise it. But fewer people will see it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UGhCh7T8ENydOJSb5GiLLA.png" /></figure><h3>The psychological shift</h3><p>A quiet tension is forming beneath the surface of modern teams. Output is accelerating at a breathtaking pace, yet understanding is not keeping up. Systems grow larger, releases grow faster, architectures grow more complex. And increasingly, the people responsible for these systems do not fully understand the structures they now own.</p><p>Earlier, difficulty forced comprehension. You had to understand networking to debug it. You had to understand databases to trust them. You had to understand concurrency to survive it. The pain of misunderstanding was immediate and personal.</p><p>Now, you can gesture at these concerns and move forward. The system works — until one day it doesn’t. Friction is absorbed upstream by tools, abstractions, and generated fixes. Understanding becomes optional.</p><p>This is not a technical shift. It is a psychological one.</p><h3>The judgement problem</h3><p>Craft in software was never just about writing clean code. It lived in judgement. In anticipating failure before it arrived. In choosing simplicity when complexity would have impressed. In seeing long-term consequences hidden inside short-term wins. In caring for future maintainers you would never meet.</p><p>But judgement is forged through consequence.</p><p>Unless you are a great visionary, the judgement generally forms when bad decisions hurt. When shortcuts come back months later. When scaling exposes assumptions you forgot you ever made, and when systems evolve beyond their original intent and begin to resist their creators.</p><p>If machines absorb most of the friction, where does judgement now come from?</p><h3>When Prototypes Start Pretending to Be Systems</h3><p>As building becomes easier, it also becomes more performative. Prototypes begin to masquerade as systems. Demos begin to pose as products. Generated output begins to impersonate understanding. Velocity begins to stand in for maturity.</p><p>The danger here is subtle. We begin to believe we <em>know</em> things we have only <em>seen</em> being assembled in front of us. And slowly, quietly, architectural decay accelerates. Security becomes ornamental. Complexity compounds invisibly. Systems grow brittle even as dashboards glow green.</p><p>Nothing appears wrong. Until everything suddenly is.</p><h3>Migration of craft</h3><p>Craft has not vanished. But its host has now shifted.</p><p>If we continue to measure our work by lines of code, by feature counts, by sprint throughput and release velocity, then yes — craft is already obsolete.</p><p>But if we measure by the quality of decisions, by the containment of failure, by the emotional and cognitive load placed on humans inside systems, by how resilient our architectures remain under pressure, then craft has not disappeared at all. It has moved up the stack.</p><p>There are things machines still cannot do.</p><p>They do not feel regret; they do not carry moral conflict. They do not absorb the political cost of difficult decisions. They do not hold responsibility across time. They do not feel the weight of what happens if a system fails quietly at scale.</p><p>The last irreducible domain of human craft is no longer construction. It is responsibility under uncertainty. It lives in the moments that never go viral. It is in the architect who tightens a constraint and absorbs backlash. It is in the reviewer who blocks a risky change and delays a release. It stays with the lead who slows the team to protect the future. These acts rarely look impressive. They rarely feel productive. But they are where real craft now survives.</p><h3>Identity Cost</h3><p>Almost no one talks about the identity cost of this shift. For years, builders defined themselves through execution. Through problem-solving under pressure. Through technical dominance. Through the quiet pride of being the person who could “make it work.”</p><p>When AI begins to outperform in those very domains, the wound is not economic at first. It is existential. Confidence erodes quietly. Comparison anxiety intensifies. Senior engineers feel unexpectedly replaceable. Junior engineers feel prematurely powerful. We trained builders for execution. We did not train them for meaning after execution becomes cheap.</p><h3>The professional split — emergence of the future builder</h3><p>A new professional split is already forming.</p><p>Some will become operators. They will orchestrate prompts, assemble outputs, deploy quickly, iterate endlessly. They will dominate in visible productivity.</p><p>Others will become architects of consequence. They will design constraints, define accountability, shape risk, and decide when speed itself is the danger. They will dominate in survivability, trust, and long-term coherence.</p><p>Most organisations currently reward the first group louder. They will learn, slowly and sometimes painfully, why the second group matters more.</p><p>The instinctive human response is to chase tools. To learn faster workflows. To optimise prompts. To compete with machines on velocity. That is the wrong battleground.</p><p>The future builder does not win by moving faster. The future builder survives by moving wiser. By thinking in second-order consequences. By studying failure instead of celebrating only success. By understanding incentives as deeply as infrastructure. By practising restraint in a world that constantly rewards acceleration.</p><p>The future builder is not a faster coder. The future builder is a curator of complexity and consequence.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZZnN_Uig3FMB_d8Ne0snpA.png" /></figure><h3>The debate</h3><p>The real question was never whether AI would take our jobs. The real question is what happens to human identity when creation no longer requires struggle.</p><p>For centuries, craft gave us progress, hierarchy, mentorship, pride, and meaning through difficulty. When difficulty dissolves, meaning must be renegotiated.</p><p>Who adapts with dignity? Who becomes bitter? Who mistakes noise for progress? Who quietly loses faith in their own relevance?</p><p>That negotiation has already begun.</p><h3>The Last Refuge of Craft</h3><p>Craft is not gone. It has simply moved beyond typing, beyond syntax, and beyond mechanical output. It now lives in restraint, in responsibility, in judgement. It lives in the decisions that cannot be undone.</p><p>Everyone can now build. But not everyone can carry the weight of what they built.</p><p>And that is where the last human craft lives.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=264b32c8997d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[SDUI: Flexible, Fast… and Far From Simple]]></title>
            <link>https://medium.com/@dfs.techblog/sdui-flexible-fast-and-far-from-simple-13173e8876fd?source=rss-ffa38b73a75------2</link>
            <guid isPermaLink="false">https://medium.com/p/13173e8876fd</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[mobile-apps]]></category>
            <category><![CDATA[server-driven-ui]]></category>
            <category><![CDATA[kotlin-multiplatform]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <dc:creator><![CDATA[Comviva MFS Engineering Tech Blog]]></dc:creator>
            <pubDate>Fri, 05 Dec 2025 08:42:49 GMT</pubDate>
            <atom:updated>2025-12-05T08:42:49.138Z</atom:updated>
            <content:encoded><![CDATA[<p>By Swagata Acharyya</p><p>Over past some time, our team have been deeply involved in building and maintaining a Server-Driven UI (SDUI) platform — a Kotlin Multiplatform (KMP) based platform that transforms JSON configurations into native Android and iOS interfaces. This journey has been both exhilarating and challenging, filled with moments of “this is brilliant!” and “why is this so complicated?”</p><p>In this article, I’ll share our experiences — the victories, the struggles, and the hard-won lessons from creating the platform and working with SDUI. Whether you’re considering building SDUI platform, adopting it, already working with it, or just curious about this architectural approach, I hope our story provides valuable insights.</p><h3>What is SDUI?</h3><p>Before diving into the good and not-so-good parts, let me briefly explain what SDUI is. Server-Driven UI is an architectural pattern where the backend defines UI screens as JSON configurations (this is specific to our implementation, you might want to store your screen definitions in another way), and the client SDK dynamically renders these configurations into native UI components. Think of it as having your UI defined remotely, allowing you to update screens, change layouts, and modify user flows without releasing new app versions.</p><p>Our platform supports 40+ component types, handles 30+ action types, implements sophisticated caching strategies, and provides enterprise-grade security — all while maintaining a shared codebase between Android and iOS through KMP.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9h6wKmo4KEMKJy8d2RJjsg.png" /><figcaption>SDUI</figcaption></figure><h3>The Good Parts</h3><h4>1. Rapid Iteration Without App Releases</h4><p>This is SDUI’s crown jewel. The ability to push UI changes, fix bugs, and A/B test different layouts without going through app store approval processes is transformative. We’ve seen product teams iterate on user flows multiple times in a single day — something that would have taken weeks in a traditional native app development cycle.</p><p>Real Impact: During a critical launch, we discovered a flow issue in one of the crucial flows. Instead of waiting for the next release cycle (which could take 2–3 weeks), we fixed it server-side and pushed the update within hours. Users experienced the fix the same day.</p><h4>2. True Multi-Platform Consistency</h4><p>By leveraging Kotlin Multiplatform (KMP), we’ve achieved something remarkable: a single codebase for business logic, data management, caching strategies, and network handling that works seamlessly on both Android and iOS. The platform-specific layer is minimal — mostly just UI rendering with some complex parsing.</p><p>The Architecture: Our SDK follows a four-layer architecture:</p><ul><li>KMP Data Layer: Network, caching, storage (shared)</li><li>KMP Domain Layer: Business logic, repositories (shared)</li><li>Android/iOS SDK Layer: Android/iOS -specific ViewModels and state management</li><li>Android/iOS UI Layer: Jetpack Compose and SwiftUI components</li></ul><p>This separation means bug fixes and feature additions benefit both platforms simultaneously, dramatically reducing maintenance overhead.</p><h4>3. Intelligent Three-Tier Caching</h4><p>Performance is critical in mobile apps, and SDUI’s caching strategy has been a game-changer. We implemented a three-tier caching system:</p><ul><li><strong>Memory Cache:</strong> Lightning-fast access for frequently used screens</li><li><strong>Disk Storage:</strong> Persistent storage for offline access and faster subsequent loads</li><li><strong>Network Fetch:</strong> Fresh data when needed</li></ul><p>The beauty is in the automatic fallback mechanism. If a screen isn’t in memory, check disk. If not on disk, fetch from network. Each tier stores the data for future use, creating a self-optimizing system that gets faster with usage.</p><p>Performance Gains: We’ve seen screen load times drop from 800ms on first load to under 50ms on subsequent visits, even with complex screens containing multiple sections and components.</p><h4>4. Action-Driven Architecture</h4><p>Instead of tightly coupling UI components to specific business logic, we built an action-driven system where components’ trigger actions are defined in JSON. This creates incredible flexibility — the same button component can navigate, make API calls, show dialogs, or update state, all based on configuration. And the best part? It can be modified and deployed with as simple as a small change in JSON. So, you do a JSON change, and a new flow is ready for users.</p><p>Action Types We Support:</p><ul><li>Navigation (screen transitions, native app navigation)</li><li>Data operations (set, cache, global data management)</li><li>UI interactions (alerts, toasts, dialogs, pickers)</li><li>Network requests (with parallel request support)</li><li>System integrations (location, camera, biometrics, file sharing)</li><li>and many more..</li></ul><p>The composability of actions — where actions can chain success and error handlers — allows for complex user flows to be defined declaratively in JSON.</p><h4>5. Comprehensive Performance Monitoring</h4><p>We built performance tracking directly into the SDK, tracking metrics at every stage:</p><ul><li>Navigation timing</li><li>Cache hit/miss rates</li><li>API request durations</li><li>UI composition times</li><li>Screen render completion</li></ul><p>This visibility has been invaluable for identifying bottlenecks and optimizing the platform. We can see exactly where time is spent — whether it’s network latency, cache misses, or UI rendering complexity.</p><h4>6. Enterprise Security Features</h4><p>Security was a non-negotiable requirement, and we’ve implemented multiple layers:</p><ul><li>Secure Storage: Encrypted key-value storage using platform key stores</li><li>Storage Encryption: Optional encryption for cached data</li><li>SSL Pinning: Certificate pinning for network security</li><li>Data Protection: In-memory and transmission protection</li></ul><p>These features ensure compliance with GDPR, HIPAA, PCI DSS, and SOC 2 requirements, making the platform suitable for enterprise applications handling sensitive data.</p><h4>7. Rich Component Library</h4><p>With 40+ component types, we can build complex, production-ready screens entirely through JSON configuration. From basic components like text, buttons, and inputs to advanced ones like maps, camera views, QR scanners, calendars, and file pickers — the platform covers most use cases without requiring custom native code.</p><h4>8. Flexibility to add new modules</h4><p>The platform supports adding new native modules within an SDUI environment. This was probably the most satisfying thing and this helps teams to move gradually to SDUI — one module at a time, instead of converting a whole app into SDUI and making it ready for release.</p><h3>The Hard Parts Nobody (very few) Talks About</h3><h4>1. State Management Complexity</h4><p>Managing state in SDUI is inherently complex. You’re dealing with multiple state layers:</p><ul><li>Local State: Form data, component-specific state</li><li>Global State: Application-wide data shared across screens</li><li>Cache State: Persisted data that survives app restarts</li><li>API State: Response data from network calls</li><li>UI State: Dialogs, progress bars, loading indicators</li></ul><p>The challenge is ensuring these states stay synchronized, especially when actions trigger cascading updates. We’ve spent significant time debugging race conditions where UI renders before state updates complete, leading to stale data or incorrect UI states.</p><p>In one example, we encountered a race condition with language changes. When switching from English to Arabic, the RTL layout would apply correctly, but strings would remain in English because the UI rendered before the Arabic strings were fetched from server and finished loading in memory. The fix required careful sequencing of async operations and proper callback chaining.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2vy7X0RqAAu_OEz7sAJPQg.png" /></figure><h4>2. Debugging Challenges</h4><p>Debugging SDUI applications is fundamentally different from traditional native apps. When something goes wrong, you’re not debugging code — you’re debugging JSON configurations, state transitions, and action chains. Traditional debugging tools provide limited value.</p><p>Challenges We Faced:</p><ul><li>No Code to Step Through: Errors manifest in JSON parsing or state management, not in your code</li><li>State Inspection: Understanding the current state across multiple layers requires custom tooling</li><li>Action Tracing: Following action chains through JSON configurations is tedious</li><li>Network Issues: Distinguishing between network problems, caching issues, and configuration errors</li></ul><p>We’ve built custom debugging tools and extensive logging, but it’s still more challenging than debugging traditional apps. The learning curve for new developers joining the team is steeper because they need to understand both the SDK architecture and the JSON configuration format.</p><h4>3. JSON Configuration Complexity</h4><p>As screens become more complex, JSON configurations grow exponentially. A moderately complex screen can have hundreds of lines of JSON, with nested structures, conditional logic, and action chains. This creates several problems:</p><ul><li>Readability: Large JSON files are hard to read and understand</li><li>Maintainability: Making changes requires careful navigation of nested structures</li><li>Validation: Ensuring JSON is valid and follows the schema is error-prone</li><li>Version Control: Merge conflicts in JSON files are common and difficult to resolve</li></ul><p>We’ve seen JSON files grow to thousands of lines for complex screens, making them nearly impossible to maintain without specialized tooling. We are now building a web portal to provide drag and drop support to build the JSON screens on the fly.</p><h4>4. Performance Overhead</h4><p>While caching helps significantly, SDUI introduces inherent performance overhead:</p><ul><li>JSON Parsing: Every screen load requires parsing potentially large JSON structures</li><li>Component Resolution: Determining which component to render for each JSON element</li><li>Style Application: Merging global, component, and dynamic styles</li><li>State Reconciliation: Ensuring state consistency across multiple layers</li></ul><p>For simple screens, this overhead is negligible. But for complex screens with many components, nested structures, and multiple sections, the overhead becomes noticeable, especially on lower-end devices.</p><p>We’ve implemented lazy loading, view recycling, and intelligent caching, but the fundamental footprint remains and we are improving every day. This is a trade-off we accept for the flexibility SDUI provides.</p><h4>5. Testing Challenges</h4><p>Testing SDUI applications is more complex than testing traditional apps:</p><ul><li>Unit Testing: Testing individual components requires mocking JSON configurations and state</li><li>Integration Testing: Testing action chains and state transitions requires complex setup</li><li>UI Testing: Screens are dynamic, making it harder to write stable UI tests</li><li>Backend Dependency: Tests often require backend services or extensive mocking</li></ul><p>We’ve developed testing utilities and patterns, but the testing experience is still more cumbersome than traditional app testing. The dynamic nature of SDUI means tests are more brittle and require more maintenance. Our research is ongoing on this section.</p><h4>6. Learning Curve</h4><p>SDUI requires understanding multiple concepts simultaneously:</p><ul><li>The SDK architecture and how components interact</li><li>JSON configuration format and schema. This is, by all means, a new programming language.</li><li>Action system and how actions chain</li><li>State management across multiple layers</li><li>Caching strategies and when data is fetched vs. cached</li><li>Platform-specific considerations (Android vs. iOS)</li></ul><p>New developers typically need 2–3 months to become productive, compared to 2–3 weeks for traditional native development. This is a significant investment, and the learning curve can be overwhelming.</p><h4>7. Limited Type Safety</h4><p>JSON is inherently untyped, which means:</p><ul><li>No Compile-Time Validation: Errors are discovered at runtime</li><li>No IDE Support: Limited autocomplete and refactoring capabilities</li><li>Refactoring Risks: Changing component names or structures requires manual updates across all JSON files</li><li>Documentation Dependency: Developers must rely on documentation and examples</li></ul><p>We’ve created JSON schemas and validation tools, but they don’t provide the same safety net as strongly-typed languages. This leads to more runtime errors and requires more careful code reviews.</p><h4>8. Backend Dependency</h4><p>SDUI creates a strong dependency on backend services. If the backend is down, slow, or returns invalid configurations, the app experience degrades significantly. We’ve implemented offline support and caching, but there are limits to what can be cached.</p><p>During a backend outage, users couldn’t access new screens or see updated content, even though the app itself was functioning. This dependency requires robust backend infrastructure and careful error handling.</p><h4>9. Version Compatibility</h4><p>As the SDK evolves, we need to maintain backward compatibility with existing JSON configurations. This creates constraints on how we can improve the platform. Breaking changes require coordinating updates across backend services and client apps, which can be a lengthy process.</p><p>We’ve implemented versioning strategies, but managing compatibility across versions adds complexity to the codebase and limits our ability to make architectural improvements.</p><h4>10. Debugging Production Issues</h4><p>When issues occur in production, debugging is particularly challenging:</p><ul><li>No Direct Access: We can’t directly inspect the JSON or state on user devices</li><li>Reproduction Difficulty: Issues might be configuration-specific or state-dependent</li><li>Limited Logging: Extensive logging impacts performance, so we must be selective</li><li>User Context: Understanding what the user was doing when an issue occurred requires additional instrumentation</li></ul><p>We’ve built analytics, performance recording, and error reporting, but debugging production issues still requires more effort than traditional apps. A comprehensive review is required with backend log and our own crash details to understand what would have gone wrong.</p><h3>Lessons Learned</h3><h4>What We’d (perhaps) Do Differently</h4><ol><li>Invest in Tooling Earlier: Custom debugging tools, JSON designer, JSON validators, and configuration generators would have saved significant time. It’s not these were not planned, but we wanted to defer them till the core concept was established. Starting with these early would save a lot of time down the line.</li><li>Stronger Type Safety: We’d implement more validation layers and potentially consider alternatives to pure JSON (like a DSL or typed configuration format).</li><li>Better Documentation: Comprehensive documentation with examples would have reduced the learning curve and prevented many mistakes.</li><li>Testing Infrastructure: Building testing utilities and patterns from the start would have improved code quality and developer confidence.</li><li>Performance Monitoring: Implementing performance tracking earlier would have helped identify bottlenecks before they became problems.</li></ol><h3>What Worked Well</h3><ol><li>Layered Architecture: The separation between KMM and platform-specific layers has been invaluable for maintenance and testing.</li><li>Action System: The action-driven architecture provides the flexibility we needed while keeping the system composable.</li><li>Caching Strategy: The three-tier caching system has been crucial for performance and user experience.</li><li>Security First: Building security features from the start ensured we could meet enterprise requirements without major refactoring.</li><li>Performance Tracking: Comprehensive metrics have been essential for optimization and troubleshooting.</li></ol><h3>When to Use SDUI</h3><p>SDUI is not a silver bullet. It’s a powerful tool that makes sense in specific scenarios:</p><p>Good Fit:</p><ul><li>Apps requiring frequent UI updates</li><li>Multi-platform applications (Android + iOS)</li><li>Enterprise applications with complex requirements</li><li>Apps with A/B testing needs</li><li>Applications where backend teams need UI control</li></ul><p>Not a Great Fit:</p><ul><li>Simple apps with static UIs</li><li>Apps requiring pixel-perfect, highly customized designs</li><li>Projects with limited backend resources</li><li>Teams without the capacity to invest in learning SDUI</li></ul><h3>Conclusion</h3><p>Working with SDUI has been a journey of trade-offs. We’ve gained incredible flexibility and rapid iteration capabilities, but at the cost of increased complexity, debugging challenges, and a steeper learning curve.</p><p>The platform has enabled us to build features faster, maintain consistency across platforms, and respond quickly to user feedback. But it’s also required significant investment in tooling, documentation, and developer education.</p><p>If you’re considering SDUI, weigh the benefits against the costs. For our use case — enterprise mobile applications requiring frequent updates and multi-platform support — the benefits have outweighed the challenges. But this might not be true for every project.</p><p>The key is understanding what you’re signing up for: SDUI is powerful, but it’s not simple. It requires investment in infrastructure, tooling, and team education. If you’re willing to make that investment, SDUI can be transformative. If not, traditional native development might be a better fit.</p><p>As we continue to evolve the platform, we’re constantly learning and improving. The challenges we’ve faced have made us better engineers, and the solutions we’ve built have made the platform more robust. That, perhaps, is the greatest value of this journey — not just the platform we’ve built (which is invaluable), but the expertise we’ve gained along the way.</p><p><em>Have you built SDUI or similar server-driven architectures? I’d love to hear about your experiences and the challenges you’ve faced. Let’s continue the conversation in the comments.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=13173e8876fd" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ AI-Powered Fintech: The Next Big Leap in Financial Inclusion, Transaction Intelligence &…]]></title>
            <link>https://medium.com/@dfs.techblog/ai-powered-fintech-the-next-big-leap-in-financial-inclusion-transaction-intelligence-d8eca60f4130?source=rss-ffa38b73a75------2</link>
            <guid isPermaLink="false">https://medium.com/p/d8eca60f4130</guid>
            <category><![CDATA[fintech]]></category>
            <category><![CDATA[smart-transaction]]></category>
            <category><![CDATA[ai-in-fintech]]></category>
            <category><![CDATA[ai-voice-assistant]]></category>
            <category><![CDATA[ai-fraud-prevention]]></category>
            <dc:creator><![CDATA[Comviva MFS Engineering Tech Blog]]></dc:creator>
            <pubDate>Wed, 03 Dec 2025 03:45:03 GMT</pubDate>
            <atom:updated>2025-12-03T03:45:03.194Z</atom:updated>
            <content:encoded><![CDATA[<h3>AI-Powered Fintech: The Next Big Leap in Financial Inclusion, Transaction Intelligence &amp; Fraud-Free Growth</h3><p>By : Mohit Dikshit</p><p>As financial services become increasingly digital, AI is redefining the very foundations of how money moves, how customers engage, how businesses grow, and how fraud is prevented. What began as digitization has now evolved into <em>intelligent financial ecosystems</em> — platforms capable of real-time decisioning, predictive personalisation, inclusion at scale, and autonomous risk management.</p><p>Across emerging markets like India, Africa, and Southeast Asia, AI-driven fintech is no longer optional. It is the backbone of economic participation and digital trust.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*foiV5g1QpzqllWzpev6Ftg.png" /></figure><h3>1. AI Will Power Hyper-Inclusive Financial Ecosystems</h3><p>For years, the challenge wasn’t just <em>access</em> — it was meaningful usage.<br> AI finally closes this gap by creating <strong>intelligent inclusion</strong>:</p><h3>➡️ Instant KYC, even from poor-quality documents</h3><p>Computer vision models extract, validate, and auto-correct scanned or photographed ID documents, reducing friction for rural and first-time users.</p><h3>➡️ Voice-led banking in local languages</h3><p>LLM-powered voicebots allow anyone — even the illiterate or digitally inexperienced — to use mobile money via natural speech.</p><h3>➡️ AI-assisted digital coaching</h3><p>Chatbots explain how to transact, save, budget, and avoid fraud, enabling digital confidence.</p><h3>➡️ Intelligent micro-loan eligibility</h3><p>AI uses patterns in mobile usage, spending behaviour, merchant cashflow, and telco data to offer instant credit to those without formal credit scores.</p><p><em>This makes inclusion proactive, personalized, and scalable.</em></p><h3>2. AI Will Create Seamless, Autonomous Financial Transactions</h3><p>Payments will soon route and optimize themselves — without human intervention.</p><h3>➡️ Smart payment routing</h3><p>AI predicts success rates per payment rail (UPI, cards, netbanking, wallet, QR) and auto-selects the best path in milliseconds.</p><h3>➡️ Predictive failure prevention</h3><p>Models detect whether a transaction is likely to fail due to issuer downtime, network load, or user patterns — and reroute it proactively.</p><h3>➡️ Autonomous back-office</h3><p>AI resolves reconciliation mismatches, classifies disputes, updates ledgers, and manages operational workflows.</p><h3>➡️ Cognitive wallets</h3><p>Wallets that “think”:</p><ul><li>They suggest best payment method</li><li>Warn before overspending</li><li>Auto-top-up</li><li>Detect anomalies</li><li>Predict upcoming bills</li></ul><p>Payments become <em>invisible, effortless, and intelligent</em>.</p><h3>3. AI Will Drive Business Growth Through Predictive Insights</h3><p>Businesses move from descriptive analytics → to predictive → to <em>prescriptive intelligence</em>.</p><h3>➡️ Merchant growth prediction</h3><p>AI analyses transaction trends to identify which merchants will need fund advances, terminal upgrades, or better settlement cycles.</p><h3>➡️ Smart pricing models</h3><p>Fees and commissions dynamically adjust based on customer segment, risk level, and usage patterns.</p><h3>➡️ Personalized offers</h3><p>AI triggers savings reminders, cashbacks, credit upgrades, and investment opportunities.</p><h3>➡️ Infrastructure demand forecasting</h3><p>Predictive capacity planning ensures high availability even on festival peaks or salary days.</p><p>AI becomes a business partner — not just a tool.</p><h3>4. Fraud Prevention Enters Its Most Advanced Phase</h3><p>Fraudsters now use bots, emulators, and deepfakes.<br> AI must stay one step ahead with:</p><h3>➡️ Graph AI to detect fraud rings</h3><p>It identifies hidden relationships between accounts, devices, SIMs, merchants, and IP patterns.</p><h3>➡️ Behavioural biometrics</h3><p>Typing speed, scroll velocity, app gesture signatures — all used to detect when a fraudster, not the real user, is operating the device.</p><h3>➡️ NLP-driven scam detection</h3><p>Models scan messages, WhatsApp patterns, merchant categories, or call transcripts to detect scam narratives.</p><h3>➡️ Federated learning</h3><p>Banks share fraud patterns <em>without sharing customer data</em>.</p><h3>➡️ Real-time risk scoring</h3><p>Every transaction gets an AI score before approval, blocking suspicious activity instantly.</p><p>This creates a resilient and trustworthy digital financial ecosystem.</p><h3>5. AI-Powered Compliance and Governance</h3><p>Compliance becomes continuous, proactive, and automated:</p><ul><li>AI auto-monitors transactions to detect AML anomalies</li><li>NLP models read new regulations and map them to internal processes</li><li>Synthetic data allows safe testing of new financial flows</li><li>AI generates explainable audit logs (“why this transaction was blocked”)</li></ul><p>Regulation becomes faster and cheaper — while improving customer protection.</p><h3>6. The Future: Autonomous, Inclusive, Trusted Finance</h3><p>In the next 3–5 years:</p><ul><li>Transactions will be self-healing</li><li>Fraud will be prevented <em>before</em> it happens</li><li>Credit will be instant and personalized</li><li>Inclusion will be voice-driven and AI-assisted</li><li>Financial ecosystems will scale from millions → billions</li></ul><p>AI isn’t just automating finance — it is <strong>reinventing it</strong>.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d8eca60f4130" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Azure Container Apps vs AKS: Which Is Better for SaaS Scalability and High Availability?]]></title>
            <link>https://medium.com/@dfs.techblog/azure-container-apps-vs-aks-which-is-better-for-saas-scalability-and-high-availability-83f37b5dde67?source=rss-ffa38b73a75------2</link>
            <guid isPermaLink="false">https://medium.com/p/83f37b5dde67</guid>
            <category><![CDATA[kubernetes-autoscaling]]></category>
            <category><![CDATA[azure-kubernetes-service]]></category>
            <category><![CDATA[cloud-scaling]]></category>
            <category><![CDATA[azure-container-apps]]></category>
            <dc:creator><![CDATA[Comviva MFS Engineering Tech Blog]]></dc:creator>
            <pubDate>Thu, 23 Oct 2025 06:15:07 GMT</pubDate>
            <atom:updated>2025-11-03T09:14:04.509Z</atom:updated>
            <content:encoded><![CDATA[<h4>By : Mohit Dikshit</h4><p>Choosing between <strong>Azure Container Apps</strong> and <strong>Azure Kubernetes Service (AKS)</strong> can define the scalability and reliability of your SaaS platform — especially in fast-evolving industries like <a href="https://www.comviva.com/products-solutions/fintech/">FinTech</a> and <a href="https://www.comviva.com/products-solutions/fintech/">digital payments</a>, where uptime and agility directly influence customer trust and transaction success. This in-depth comparison explores auto-scaling, high availability, and operational complexity — helping you decide which Azure service truly fits a SaaS-first growth strategy.</p><h3>Introduction</h3><p>For modern SaaS teams building on Microsoft Azure — particularly those delivering <a href="https://www.comviva.com/products-solutions/fintech/">digital wallet platforms</a>, or <a href="https://www.comviva.com/products-solutions/fintech/">payment gateway solutions</a> — the choice between <strong>Azure Container Apps (ACA)</strong> and <strong>Azure Kubernetes Service (AKS)</strong> often sparks debate. Both promise scalability and reliability — but the underlying architecture, scaling model, and operational overhead differ drastically.</p><p>If your SaaS success depends on <strong>elastic scaling</strong>, <strong>high uptime</strong>, and <strong>fast deployment cycles</strong>, this article breaks down the trade-offs and reveals which Azure service delivers better results for SaaS workloads in <a href="https://www.comviva.com/products-solutions/fintech/">FinTech innovation</a> and <a href="https://www.comviva.com/products-solutions/fintech/">digital transaction ecosystems</a>.</p><h3>1. Understanding the Two Services</h3><h3>Azure Kubernetes Service (AKS)</h3><p>AKS is Azure’s <strong>managed Kubernetes</strong> offering — a robust, enterprise-grade orchestration platform for running containerized applications. It gives you deep control over nodes, networking, scaling, and security policies — ideal for <a href="https://www.comviva.com/products-solutions/fintech/">financial institutions</a> or <a href="https://www.comviva.com/products-solutions/fintech/">payment services providers</a> needing strict compliance and control.</p><p>However, that power comes with complexity: managing node pools, updating clusters, handling ingress controllers, and ensuring uptime are part of your daily operational tasks.</p><h3>Azure Container Apps (ACA)</h3><p>Azure Container Apps is a <strong>serverless container platform</strong> built <em>on top of</em> AKS, but without the need to manage clusters. It leverages <strong>KEDA (Kubernetes Event-Driven Autoscaler)</strong> and <strong>Dapr (Distributed Application Runtime)</strong> to handle scaling, microservices communication, and resilience behind the scenes.</p><p>In essence, ACA abstracts Kubernetes — letting you focus on <strong>deploying microservices and APIs</strong>, not maintaining infrastructure.</p><h3>2. Auto-Scaling: Smarter Simplicity vs Complete Control</h3><h3>AKS Auto-Scaling</h3><p>AKS supports <strong>cluster autoscaling</strong> (adding/removing nodes) and <strong>horizontal pod autoscaling (HPA)</strong> based on CPU, memory, or custom metrics. It’s powerful and flexible — but requires hands-on tuning, metrics integration (Prometheus), and capacity planning.</p><p><strong>Pros:</strong><br> ✅ Granular scaling control<br> ✅ Supports event-driven scaling via KEDA<br> ✅ Works for complex multi-tenant SaaS payment systems</p><p><strong>Cons:</strong><br> ❌ Configuration overhead<br> ❌ Slow to react to sudden load spikes<br> ❌ Risk of over-provisioning if not tuned</p><h3>ACA Auto-Scaling</h3><p>Azure Container Apps makes scaling almost invisible. Define simple rules for concurrent requests or events, and ACA automatically scales your containers — even down to <strong>zero replicas</strong> when idle.</p><pre>scale:<br>  minReplicas: 0<br>  maxReplicas: 50<br>  rules:<br>    - name: http<br>      http:<br>        concurrentRequests: 50</pre><p><strong>Pros:</strong><br> ✅ Instant scale-out and scale-in<br> ✅ Built-in KEDA and scale-to-zero<br> ✅ Zero infrastructure management</p><p><strong>Cons:</strong><br> ❌ Limited fine-tuning options<br> ❌ Less visibility into scaling internals</p><p><strong>Verdict:</strong><br> For dynamic <a href="https://www.comviva.com/products-solutions/fintech/">digital payment platforms</a> with unpredictable demand, <strong>Azure Container Apps</strong> wins on <strong>ease, cost efficiency, and responsiveness</strong>.</p><h3>3. High Availability: Built-In vs Configurable</h3><h3>AKS HA</h3><p>AKS provides <strong>multi-zone redundancy</strong>, <strong>node pool distribution</strong>, and <strong>replica management</strong>. You can architect complex <strong>multi-region failover</strong> setups using <strong>Azure Front Door</strong> or <strong>Traffic Manager</strong> — but this requires DevOps expertise and maintenance effort.</p><p><strong>Pros:</strong><br> ✅ Enterprise-grade HA and multi-region support<br> ✅ Full control over deployment topology<br> ✅ Highly customizable failover strategies</p><p><strong>Cons:</strong><br> ❌ Requires manual setup and monitoring<br> ❌ Higher operational cost</p><h3>ACA HA</h3><p>Azure Container Apps automatically distributes workloads across <strong>Availability Zones</strong> within a region. For cross-region HA, simply deploy multiple ACA environments and load balance using <strong>Front Door</strong>.</p><p><strong>Pros:</strong><br> ✅ Zone-level redundancy by default<br> ✅ Minimal management overhead<br> ✅ Seamless global scaling with Front Door</p><p><strong>Cons:</strong><br> ❌ No control over replica placement<br> ❌ Manual multi-region setup if required</p><p><strong>Summary :</strong><br> For most <a href="https://www.comviva.com/products-solutions/fintech/">FinTech SaaS platforms</a> targeting <strong>99.9% uptime</strong>, <strong>ACA</strong> delivers <strong>reliable HA without cluster complexity</strong>. While AKS is ideal for teams chasing <strong>99.99%+ uptime</strong> with region-specific failover requirements.</p><h3>4. Operational Complexity and Cost</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*t80Z4W7RrHknnn55GwA8CQ.png" /></figure><p>For SaaS teams prioritizing <strong>feature velocity</strong> and <strong>DevOps simplicity</strong>, <strong>ACA offers a faster path to market</strong>.<br> AKS, while more flexible, suits mature organizations with dedicated infrastructure teams.</p><h3>5. When to Choose Each</h3><p><strong>Choose Azure Container Apps if:</strong></p><ul><li>You’re building microservices or APIs with variable workloads.</li><li>You want serverless economics (scale-to-zero).</li><li>You prefer minimal DevOps overhead.</li><li>You’re focused on fast deployments and rapid iteration.</li></ul><p><strong>Choose Azure Kubernetes Service if:</strong></p><ul><li>You need full Kubernetes control (CRDs, custom operators).</li><li>You’re building a multi-tenant, complex SaaS architecture.</li><li>You already have Kubernetes expertise in-house.</li><li>You plan for hybrid or on-prem integrations.</li></ul><h3>6. The SaaS Verdict</h3><p>When evaluating purely on <strong>auto-scaling</strong> and <strong>high availability</strong>, <strong>Azure Container Apps</strong> emerges as the <strong>better fit for most SaaS applications </strong>especially in <a href="https://www.comviva.com/products-solutions/fintech/">FinTech</a>, <a href="https://www.comviva.com/products-solutions/fintech/">digital wallet ecosystems</a>, and <a href="https://www.comviva.com/products-solutions/fintech/">mobile payment innovations</a>.</p><p>It delivers:</p><ul><li>Effortless, event-driven scaling with zero configuration.</li><li>Built-in high availability across zones.</li><li>Reduced cost via scale-to-zero.</li><li>Simpler DevOps and faster go-to-market.</li></ul><p>AKS remains the best choice for <strong>large enterprises</strong> needing <strong>custom orchestration</strong>, <strong>hybrid deployments</strong>, or <strong>Kubernetes portability</strong>.</p><p>But for 80% of SaaS startups and mid-scale providers, <strong>Azure Container Apps</strong> provides the ideal balance of <strong>scalability, resilience, and simplicity</strong>.</p><blockquote><em>💡 </em><strong><em>Final Takeaway:</em></strong><em><br> If your SaaS strategy revolves around agility, uptime, and </em><a href="https://www.comviva.com/products-solutions/fintech/"><em>cost optimization in digital payments</em></a><em> — go with </em><strong><em>Azure Container Apps</em></strong><em>.<br> If your strategy demands full Kubernetes control and multi-cloud complexity — choose </em><strong><em>AKS</em></strong><em>.</em></blockquote><p><a href="https://ind01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fwww.comviva.com%2Fproducts-solutions%2Ffintech%2Fmobiquity-pay%2F&amp;data=05%7C02%7Cshammi.gaur%40comviva.com%7Ca508adc6b0df4233ab8a08de1aa972a6%7C84ee5792e85e4bbea9d61b06a2157e10%7C0%7C0%7C638977512222446357%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&amp;sdata=b2pGGiFL1E7IB7oYPTEOzSduWDGiODbYVXxFgHXxaz0%3D&amp;reserved=0">Find out more about Comviva’s FinTech Solutions</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=83f37b5dde67" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Device Binding in Android Fintech Apps: Your Phone Is the Key to Your Bank Account]]></title>
            <link>https://medium.com/@dfs.techblog/device-binding-in-android-fintech-apps-your-phone-is-the-key-to-your-bank-account-33808a53c0c2?source=rss-ffa38b73a75------2</link>
            <guid isPermaLink="false">https://medium.com/p/33808a53c0c2</guid>
            <category><![CDATA[fintech]]></category>
            <category><![CDATA[android-security]]></category>
            <category><![CDATA[android]]></category>
            <category><![CDATA[android-app-development]]></category>
            <category><![CDATA[device-binding]]></category>
            <dc:creator><![CDATA[Comviva MFS Engineering Tech Blog]]></dc:creator>
            <pubDate>Wed, 24 Sep 2025 14:41:53 GMT</pubDate>
            <atom:updated>2025-11-03T09:23:46.298Z</atom:updated>
            <content:encoded><![CDATA[<p>By: Swagata Acharyya</p><p>Imagine locking your home with not just a password, but a physical key that only you possess. Even if someone knows your door code, they can’t get in without that key. This is what <strong>device binding</strong> does for fintech apps; it ties your account access to <em>your phone</em>, ensuring that only your trusted device can unlock your finances.</p><h3>What is Device Binding?</h3><p>Device binding links a specific phone to a user’s account so the app only runs on that trusted device. Even if someone steals your login credentials, they can’t simply log in from another phone without passing extra checks or re-binding the new device.</p><p>In fintech, this is critical. Apps like Google Pay or PhonePe don’t just verify your password or OTP — they silently check, <em>“Is this the same phone that was registered?”</em> If not, access is blocked or additional verification is required.</p><p>It’s like having a permanent second factor of authentication that lives inside your phone, protecting your account behind the scenes.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mdmB9O7oJm54D96lTlFv3w.png" /></figure><h3>Why It Matters in Fintech</h3><p>For <a href="https://www.comviva.com/products-solutions/fintech/"><strong><em>financial technology</em></strong></a> and <a href="https://www.comviva.com/products-solutions/fintech/"><strong><em>digital wallet solutions</em></strong></a><strong><em> </em></strong>device binding isn’t just a nice-to-have — it’s a frontline defense:</p><ul><li><strong>Stops Fraud:</strong> Attackers often steal passwords or intercept OTPs. Device binding makes these worthless without the actual phone. Even stolen session tokens can’t be reused elsewhere because the server expects proof from the original device.</li><li><strong>Regulatory Requirement:</strong> In India, the <strong>RBI mandates device binding</strong> for mobile banking and UPI apps. This ensures that transactions come only from verified devices, reducing fraud at scale.</li><li><strong>User Trust:</strong> Once a device is marked trusted, logins become smoother — often just a PIN or biometric. At the same time, if a new phone tries to log in, the app knows to treat it with suspicion.</li></ul><p>This balance of security and convenience is why almost every modern fintech app uses some form of device binding today. <em>(Learn more about advanced </em><a href="https://www.comviva.com/products-solutions/fintech/"><strong><em>FinTech solutions</em></strong></a><em> that combine security and innovation.)</em></p><h3>How Device Binding Works: The Basics</h3><p>Think of device binding as a digital handshake between your phone and the bank’s servers. When you first register the app, a few key things happen under the hood:</p><ol><li><strong>Device Fingerprint:</strong> The app collects unique signals like your phone model, OS version, or a generated device ID. In India, many apps also verify your mobile number by sending a silent SMS during setup — this proves the SIM is physically in your phone.</li><li><strong>Cryptographic Key Pair:</strong> The app generates a private and public key pair. The private key stays locked inside your phone, while the public key is sent to the server. From now on, every sensitive request: login, payment, balance check is <em>signed</em> with that private key.<br>The server checks the signature with the public key, confirming that the request came from your bound device and hasn’t been tampered with.<br>Even if a hacker steals your session token, they can’t use it on another phone because they don’t have the private key.</li><li><strong>Secure Storage (Android Keystore):</strong> The private key is stored inside the <strong>Android Keystore</strong>, a secure hardware-backed vault. Even if your phone is compromised, the raw key can’t be extracted — it can only be used for signing inside the secure environment.</li></ol><p>This creates a tight chain of trust: device identity → cryptographic proof → protected storage.</p><h3>Integrity and Root Detection</h3><p>But what if the device itself is compromised, like being rooted or running a fake OS? This is where <strong>attestation APIs</strong>come in.</p><p>Modern apps use Google’s <strong>Play Integrity API</strong> (previously SafetyNet) to check the health of the device. Google essentially certifies: <em>“Yes, this is a genuine, untampered device.”</em></p><p>If the check fails — maybe the phone is rooted or running an emulator — the app refuses to bind or blocks sensitive actions.<br>Many fintech apps also implement their own root detection for extra safety. RBI guidelines explicitly require this step to prevent malware from bypassing binding altogether.</p><h3>Device Binding in Action</h3><p>For users, device binding is mostly invisible:</p><ul><li><strong>First-time setup:</strong> You install the app, verify your phone number, and maybe receive a silent SMS. This is the binding process at work, linking your account to that phone.</li><li><strong>Daily use:</strong> Once bound, logins are fast; just a PIN or biometric check: because the app already trusts the device.</li><li><strong>New phone:</strong> If you get a new phone, you’ll need to go through binding again. Most apps limit accounts to one active device, so the old one gets unlinked automatically.</li><li><strong>High-risk actions:</strong> Behind the scenes, every big transaction is cryptographically signed by your device. If anything doesn’t match — wrong device, tampered app — the server rejects it instantly.</li></ul><p>This mix of convenience and silent verification makes device binding powerful and user-friendly for <a href="https://www.comviva.com/products-solutions/fintech/">digital payments</a>.</p><h3>Why India Emphasizes Device Binding</h3><p>India’s digital payment boom, led by UPI, depends heavily on device binding. UPI apps require an active SIM linked to your bank account, verified via a one-time SMS during registration.</p><p>RBI and NPCI mandate this because it drastically cuts down fraud. Even if a scammer gets your UPI PIN, they <em>can’t use it on their phone</em>.</p><p>This is why you can’t casually log into a friend’s phone to make UPI payments — the system simply won’t allow it. The restriction may feel inconvenient, but it’s a deliberate trade-off for <a href="https://www.comviva.com/products-solutions/fintech/">payment security</a> at scale.</p><h3>The Bigger Picture</h3><p>Device binding doesn’t just protect individual accounts — it strengthens the entire financial ecosystem. By making every phone a unique, cryptographic key, fintech apps reduce fraud, comply with regulations, and build user trust.</p><p>The next time your banking app says “registering your device,” remember what’s really happening: your phone is becoming a secure gatekeeper to your money. Behind that simple step lies a sophisticated security dance of keys, checks, and verifications — all designed to keep attackers locked out while keeping you safely in.</p><p>When passwords can be stolen and OTPs intercepted, <strong>your phone itself becomes the unstealable password</strong>. And that’s a future worth banking on.</p><p><a href="https://www.comviva.com/products-solutions/fintech/mobiquity-pay/">Find out more about Comviva’s FinTech Solutions</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=33808a53c0c2" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>