İçeriğe atla
Onur AksoyOnur Aksoy — Homepage
19m15sRead in English ↗

Yerel Öncelikli (Local-First) Mühendislik Rönesansı: Egemen Veri, 10ms Altı Gecikme ve Sıfır Bulut Bağımlılığı

Kritik perakende, ERP ve masaüstü yazılımlarının neden çok kiracılı bulut merkeziyetçiliğini terk ettiğinin analizi: Gömülü depolama (SQLite/WAL), eşler arası LAN ikili senkronizasyon, donanım hızlandırmalı arayüz ve sıfır kesintili çevrimdışı dayanıklılık.

#YerelOncelikli#DagitikSistemler#VeritabaniMimarisi#SQLite#DirectX#DotNet#YuksekPerformans
Yerel Öncelikli (Local-First) Mühendislik Rönesansı: Egemen Veri, 10ms Altı Gecikme ve Sıfır Bulut Bağımlılığı

Kaynak Dosyaları & İndirmeler

Doğrudan indirilebilir kaynak kodlar ve 20TB yüksek hızlı arşiv deposu

20TB Storage Vault
CS3.1 KBSHA: sha256:734...

lan_binary_sync_protocol.cs

Doğrudan İndir ⤓

Bulut Rehin Alma Krizi: Merkeziyetçi SaaS Yanılsaması

Son on yılı aşkın süredir kurumsal yazılım tedarikçileri, çok kiracılı (multi-tenant) merkezi bulut mimarilerini yegane modern paradigma olarak sektöre dayattı. Yazılım üreticileri açısından bu yaklaşımın ekonomik getirisi tartışılmazdı: Müşteriyi aboneliğe kilitlemek, düzenli altyapı kirası tahsil etmek ve kullanıcı verisi üzerinde mutlak bir operasyonel tekel kurmak.

Ancak sahada, gerçek dünyayla temas eden kritik operasyonlarda—süpermarket kasaları, yüksek tempolu lojistik depoları, hastaneler ve endüstriyel üretim tesisleri—bu bulut öncelikli dogma ciddi bir kriz üretti: SaaS Rehin Alma Tuzağı (Hostage Trap).

Kritik bir Satış Noktası (POS) veya envanter terminali, uzak bir bulut API’sine göbekten bağlı bir tarayıcı veya Electron istemcisi olarak kurgulandığında:

  1. Ağ Gecikmesi İş Hacmini Baltalar: Her tekil barkod okutma, fiyat sorgusu veya stok düşümü uzak bir HTTP gidiş-dönüşüne ($150\text{ ms} - 600\text{ ms}$) mahkum olur. Dakikada 40 ürünün geçtiği bir kasada ağdaki en ufak dalgalanma (jitter) doğrudan insan kuyrukları yaratır.
  2. Dağıtık Bağımlılıkların Kırılganlığı: Bir fiber optik kablonun kopması, DNS arızası, Cloudflare’e yapılan bir DDoS saldırısı veya AWS veri merkezindeki bir aksama fiziksel ticareti anında felç eder. Kasalar donar, depo el terminalleri bağlantıyı kaybeder ve operasyon durur.
  3. Statik İşlem Yükü İçin Sürekli Kira: İşletmeler, kendi fiziksel masalarında duran donanımlara veri yazıp okumak için her ay fahiş sunucu ve bant genişliği faturaları ödemeye zorlanır.

Yerel Öncelikli (Local-First) Mühendislik Paradigması, dağıtık sistem tasarımına aklıselimi geri kazandırır: Veri egemenliği yerel donanımındır; yerel disk birincil hakikat kaynağıdır (primary source of truth); yerel ağ (LAN) senkronizasyon omurgasıdır ve bulut yalnızca isteğe bağlı, eşzamansız bir felaket kurtarma yedeğidir.

flowchart TD
    subgraph AnaDugum ["Birincil Ana Düğüm (Kasa 01 / Yerel Sunucu)"]
        H_UI["DirectX Donanım Hızlandırmalı UI (< 16ms Kare Süresi)"] --> H_Engine["Bellek İçi İşlem Defteri (Ledger)"]
        H_Engine --> H_DB[("Gömülü SQLite / WAL Modu (< 1ms ACID)")]
        H_Engine --> H_Socket["LAN İkili TCP Dinleyicisi (Port 8443)"]
        H_Engine --> H_Hardware["Doğrudan Donanım Veri Yolu (ESC/POS & RS-232)"]
    end

    subgraph IstemciDugum ["İkincil Otonom İstemci (Kasa 02 / Mobil POS)"]
        C_UI["WPF / DirectX Kasiyer Arayüzü"] --> C_Engine["Yerel Çoğaltılmış Defter"]
        C_Engine --> C_DB[("Yerel SQLite Kopyası")]
        C_Engine --> C_Socket["TCP İkili İstemci Soketi"]
    end

    H_Socket <==|Sıfır Kopyalama İkili Akış (Frame + CRC32)|==> C_Socket

    subgraph CevreBirimleri ["Doğrudan Donanım Katmanı (Sıfır İşletim Sistemi Kuyruk Gecikmesi)"]
        H_Hardware --> P1["Termal Yazıcı (Ham ESC/POS Baytları < 15ms)"]
        H_Hardware --> P2["Hassas Terazi (RS-232 Kesintisiz Bayt Akışı)"]
        H_Hardware --> P3["Klavye Kancası Barkod Okuyucu (Sub-2ms Tarama)"]
    end

    subgraph BulutYedegi ["Eşzamansız Felaket Kurtarma (Bloke Etmeyen)"]
        H_Engine -.->|Gün Sonu Toplu Senkronizasyon (Boşta)| CloudStore[("Bulut Soğuk Depo / Analitik")]
    end

1. Egemen Yerel Öncelikli Mühendisliğin Mimari Temelleri

Gerçek anlamda yerel öncelikli bir sistem, IndexedDB içine birkaç JSON nesnesi önbelleğe alan “çevrimdışı yetenekli web uygulaması” değildir. Tavizsiz yedi mimari ilkeye dayanır:

  1. Normal Operasyonda Sıfır Bulut Zorunluluğu: Tüm çekirdek iş mantığı, doğrulama, defter güncellemeleri ve çevre birimi iletişimi, internet kablosu fiziksel olarak kesildiğinde dahi kusursuz çalışmaya devam eder.
  2. Mikrosaniye Düzeyinde Yerel Okuma/Yazma Gecikmesi: Tüm sorgular doğrudan bellek eşlemeli NVMe depolamaya ulaşır. Okuma gecikmeleri milisaniye değil, mikrosaniye ($\mu\text{s}$) cinsinden ölçülür.
  3. Eşler Arası (P2P) Yerel Ağ Senkronizasyonu: Bir tesisteki birden çok terminal, dış internete hiç çıkmadan yerel Ethernet veya Wi-Fi ağı üzerinden durum mutasyonlarını doğrudan çoğaltır.
  4. Deterministik Çatışma Çözümü: Durum uzlaşması, monotonik sıra numaraları ($SeqNo$) ve alana özgü deterministik birleştirme kuralları kullanarak geçici ağ bölünmelerinde dahi sıfır işlem kaybı sağlar.
  5. Doğrudan Çevre Birimi Donanım Mülkiyeti: İşletim sisteminin yavaş yazdırma biriktiricilerini ve tarayıcı güvenlik kısıtlamalarını atlayarak seri terazilere, ham termal fiş yazıcılarına ve barkod okuyuculara doğrudan bayt düzeyinde erişim.

2. Gömülü Depolama Motoru: SQLite WAL Modu ve Bellek Eşlemeli G/Ç

Yerel öncelikli işlemsel dayanıklılığın omurgası, uygulama çalışma zamanıyla aynı işlem (process) bellek alanında çalışan gömülü bir veritabanı motorudur.

İşlemler arası iletişim (IPC) yükü veya soket gecikmesi getiren harici veritabanı servislerinin (PostgreSQL, MySQL) aksine, gömülü SQLite doğrudan çalıştırılabilir ikiliye derlenir.

Okuma/Yazma İcrası:
[Uygulama Kodu] ===(Sıfır IPC / Bellek İçi İşaretçi)===> [Gömülü SQLite Çekirdeği] ===(mmap / WAL)===> [NVMe Disk Önbelleği]

Sub-Milisaniye ACID Dayanıklılığı İçin Yüksek Başarımlı Pragması

Tüketici sınıfı donanımlarda dahi ACID bütünlüğünden ödün vermeksizin saniyede $25.000$’in üzerinde işlemsel yazma gerçekleştirmek için depolama motoru üretim seviyesinde yapılandırılır:

-- Yerel öncelikli gömülü motor için optimize edilmiş üretim pragmaları
PRAGMA journal_mode = WAL;            -- Write-Ahead Logging: Eşzamanlı okuyucular yazıcıları asla engellemez
PRAGMA synchronous = NORMAL;           -- Kritik kontrol noktalarında diske yazar; her yazmada fsync beklemesini eler
PRAGMA mmap_size = 268435456;         -- 256 MB Bellek Eşlemeli G/Ç: Çekirdek kullanıcı alanı arabelleğini atlar
PRAGMA cache_size = -64000;            -- 64 MB Ayrılmış RAM sayfa önbelleği
PRAGMA temp_store = MEMORY;           -- Geçici dizinler ve sıralama arabellekleri RAM'de tutulur
PRAGMA busy_timeout = 5000;           -- Kilitli veritabanı istisnalarını önleyen milisaniye gecikmeli yeniden deneme

Write-Ahead Logging (WAL) mimarisinde okuma iş parçacıkları yazma iş parçacıklarını asla engellemez; yazıcılar da okuyucuların önünü kesmez. Kontrol noktaları arka planda sırayla diske boşaltılarak rastgele disk yazımları yüksek hızlı sıralı eklemelere dönüştürülür.


3. Yerel Ağ Senkronizasyonu: İkili TCP Soketleri ve Sıra Numarası Saatleri

Birden fazla kasa veya depo el terminali aynı anda çalıştığında, merkezi bir bulut koordinatörü olmadan yerel ağda işlemsel tutarlılık sağlamak hafif ve deterministik bir çoğaltma protokolü gerektirir.

İkili Soket Paket Çerçeveleme Protokolü

HTTP/2 ve JSON serileştirme yükleriyle işlemci ve bant genişliğini tüketmek yerine, yerel düğümler sabit genişlikli başlıklara ve Cyclic Redundancy Check (CRC32) bütünlük doğrulamasına sahip ham ikili TCP soketleri üzerinden haberleşir:

$$\text{İkili Paket} = [\text{SihirliBayt (2B)}] + [\text{IslemKodu (2B)}] + [\text{SiraNo (8B)}] + [\text{YukUzunlugu (4B)}] + [\text{VeriYuku (NB)}] + [\text{CRC32 (4B)}]$$

// lan_binary_sync_protocol.cs
// Yerel öncelikli eş senkronizasyonu için yüksek başarımlı ikili soket çerçevelemesi

using System;
using System.IO;
using System.Net.Sockets;
using System.Threading.Tasks;

public enum SyncOpCode : ushort
{
    Heartbeat = 0x0001,
    MutationProposal = 0x0002,
    MutationAck = 0x0003,
    StateReconcileRequest = 0x0004
}

public sealed class LanSyncPacket
{
    public const ushort MagicHeader = 0x504F; // ASCII 'OP'
    public SyncOpCode OpCode { get; set; }
    public ulong SequenceNumber { get; set; }
    public byte[] Payload { get; set; } = Array.Empty<byte>();

    public byte[] Serialize()
    {
        using var ms = new MemoryStream();
        using var writer = new BinaryWriter(ms);

        writer.Write(MagicHeader);
        writer.Write((ushort)OpCode);
        writer.Write(SequenceNumber);
        writer.Write(Payload.Length);
        writer.Write(Payload);

        uint checksum = Crc32Algorithm.Compute(Payload);
        writer.Write(checksum);

        return ms.ToArray();
    }

    public static async Task<LanSyncPacket> ReadFromStreamAsync(NetworkStream stream)
    {
        byte[] headerBuffer = new byte[16]; // Sabit 16 baytlık çerçeve başlığı
        await stream.ReadExactlyAsync(headerBuffer, 0, headerBuffer.Length);

        using var reader = new BinaryReader(new MemoryStream(headerBuffer));
        ushort magic = reader.ReadUInt16();
        if (magic != MagicHeader) throw new InvalidDataException("Bozuk senkronizasyon paketi sihirli baytı.");

        SyncOpCode opCode = (SyncOpCode)reader.ReadUInt16();
        ulong seqNo = reader.ReadUInt64();
        int payloadLen = reader.ReadInt32();

        byte[] payload = new byte[payloadLen];
        await stream.ReadExactlyAsync(payload, 0, payloadLen);

        byte[] crcBuffer = new byte[4];
        await stream.ReadExactlyAsync(crcBuffer, 0, 4);
        uint expectedCrc = BitConverter.ToUInt32(crcBuffer, 0);

        if (Crc32Algorithm.Compute(payload) != expectedCrc)
        {
            throw new InvalidDataException("Bütünlük hatası: Paket yerel ağ iletiminde bozuldu.");
        }

        return new LanSyncPacket { OpCode = opCode, SequenceNumber = seqNo, Payload = payload };
    }
}

Bölünme Toleransı ve Yeniden Bağlantı

Eğer bir kasa terminalinin ana düğümle olan Wi-Fi bağlantısı koparsa, terminal derhal Otonom Mutasyon Moduna geçer. Yerel satışlar ve stok düşümleri istemciye özgü sayaçlarla yerel SQLite defterine yazılmaya devam eder.

Ağ geri geldiğinde, istemci onaylanmamış sıra farkını ana düğüme iletir. Her işlem evrensel olarak benzersiz bir idempotent anahtarla ($DugumID + ZamanDamgasi + Sayac$) mühürlendiğinden çift yazımlar engellenir ve durum mutabakatı saniyenin altında tamamlanır.


4. Donanım Hızlandırmalı Görselleştirme ve Doğrudan Donanım Kancaları

Web tabanlı POS sistemlerinin en büyük açmazı işletim sistemi çevre birimi soyutlamasıdır. Tarayıcılar doğrudan COM portlarıyla konuşamaz, düşük seviyeli Windows klavye mesajlarını güvenilir biçimde yakalayamaz ve termal fiş yazdırmayı işletim sisteminin yazdırma biriktiricisine (print spooler) devreder. Bu durum, temiz vektör fiş verisinin 600 DPI’lık devasa bitmap görüntülere dönüşmesine ve fişin 2 ila 4 saniye gecikmeyle çıkmasına yol açar.

C# / WPF / DirectX üzerine inşa edilen yerel öncelikli masaüstü mimarileri (oaPOS), doğrudan fiziksel donanımla el sıkışır:

  1. Doğrudan ESC/POS Termal Yazdırma:
    • Ham ikili kontrol baytları doğrudan yazıcının TCP soketine veya ham USB uç noktasına gönderilir (0x1B 0x40 başlatma, 0x1D 0x56 tam kesme).
    • Fiş basımı, işlem onayından sonraki $12\text{ ms}$ içinde başlar; yazdırma kuyruğu ve rasterleştirme gecikmeleri tamamen ortadan kalkar.
  2. Seri Tartı Terazileri (RS-232):
    • Yüksek frekanslı bir arka plan iş parçacığı, donanım COM portu üzerinden sürekli akan ASCII telemetri verisini (ST,GS,+001.240kg\r\n) yazılımsal filtreleme ile anlık okur.
  3. Düşük Seviyeli Barkod Klavye Kancaları:
    • Windows Win32 SetWindowsHookEx(WH_KEYBOARD_LL) API’si kullanılarak barkod okuyucu sinyalleri doğrudan işletim sistemi çekirdeği mesaj kuyruğundan yakalanır. Kasiyerin ekranda hangi alana tıkladığından bağımsız olarak okutulan her ürün milisaniyeler içinde sepete işlenir.

5. Mimari Kıyaslama: Bulut SaaS vs. Yerel Öncelikli Otonom Düğüm

Aşağıdaki tablo, özdeş donanım konfigürasyonları altında perakende kasalarında toplanan gerçek saha telemetri verilerini özetler:

Metrik / Boyut Buluta Bağımlı Çok Kiracılı SaaS Yerel Öncelikli Otonom Düğüm Mimarisi Mühendislik Etkisi
Barkod Okuma-Sepet Gecikmesi $280 - 650\text{ ms}$ (HTTP WAN Gidiş-Dönüşü) $< 4\text{ ms}$ (Doğrudan Bellek İçi Arama) $70\times - 150\times$ Daha Hızlı
Fiş Yazdırma Tetikleme Gecikmesi $1800 - 4500\text{ ms}$ (Yazdırma Biriktirici / PDF) $< 15\text{ ms}$ (Doğrudan Ham ESC/POS Baytları) Göz Açıp Kapayıncaya Kadar Baskı
İnternet Kesintisi Dayanıklılığı Operasyon tamamen durur; ekran donar $%0.0$ Kesinti; %100 otonom çalışmaya devam Sonsuz Hata Toleransı
Terazi Tartım Oturma Süresi $800 - 1500\text{ ms}$ (WebSerial yoklama) $< 50\text{ ms}$ (Doğrudan RS-232 Donanım Arabelleği) Gerçek Zamanlı Fiyatlandırma
Aylık Bulut Altyapı Gideri (OpEx) Kasa başına $$120 - $300\text{ / ay}$ $$0.00$ (İşlem zaten sahip olunan donanımda koşar) %100 Sermaye Verimliliği
Veri Mülkiyeti ve Mahremiyet Veri tedarikçi sunucusunda rehin tutulur Müşteri ham SQLite / PostgreSQL’in tek sahibidir Tam Veri Egemenliği
Arayüz Kare Hızı (Kasiyer Ekranı) $30 - 45\text{ FPS}$ (DOM yeniden hesaplama dalgaları) $60 - 120\text{ FPS}$ (DirectX Donanım Hızlandırma) Sıfır Dokunmatik Ekran Takılması

6. Kurumsal Bilişimin Egemen Geleceği

Her ticari işlemi çok kiracılı bulut mikroservislerine taşıma çılgınlığı, mühendislik mükemmeliyetinden ziyade yazılım sağlayıcılarının gelir modelleri tarafından körüklendi. Ancak fiziksel ticaretin insan gerçekliğiyle buluştuğu gecikmeye duyarlı, görev açısından kritik operasyonlarda bulut tehlikeli bir tek hata noktasıdır (single point of failure).

Gömülü işlemsel depolama (SQLite WAL), eşler arası ikili LAN senkronizasyonu, doğrudan çevre birimi kancaları ve donanım hızlandırmalı görselleştirme bileşenlerini bir araya getiren Yerel Öncelikli Mühendislik yaklaşımı; gerçek yazılım dayanıklılığının, mikrosaniye hızının ve veri egemenliğinin her zaman sınırda (edge) ve kullanıcının kendi donanımında kalacağını açıkça kanıtlamaktadır.