Kısa cevap: çift kayıt nasıl önlenir?
Her muayene işine değişmeyen bir kaynak kimliği verin; ERP aktarımını bu kimlikle idempotent çalıştırın, veritabanında tekilliği zorlayın ve yalnız doğrulanmış hedef belgeyi muhasebeye bağlayın.
Bir entegrasyonun yalnız normal akışta çalışması yeterli değildir. Ağ yanıtı kaybolduğunda, kuyruk mesajı tekrar geldiğinde veya iki worker aynı işi aldığında da sonuç tek müşteri, tek sipariş ve tek faturalama bağlantısı olmalıdır.
Çift kayıt neden oluşur?
Kısa cevap: çoğu çift kayıt, kullanıcı iki kez düğmeye bastığı için değil; ilk isteğin başarılı olup yanıtının kaybolduğu belirsiz anda yapılan kontrolsüz retry nedeniyle oluşur.
Muayene sistemi ERP'ye sipariş açma isteği gönderir. ERP kaydı oluşturur, fakat bağlantı kapanır ve entegrasyon yanıtı alamaz. Worker aynı isteği yeni bir işlem gibi tekrar gönderirse ikinci sipariş açılabilir. Benzer risk kuyrukta en az bir kez teslim, paralel worker, zaman aşımı sonrası manuel tekrar ve toplu senkronizasyonda görülür.
IETF RFC 9110, idempotent işlemi aynı isteğin birden çok uygulanmasının amaçlanan etkisinin tek uygulamayla aynı olması olarak tanımlar. PUT bu niteliğe sahiptir; POST ile yeni kaynak oluşturma ise ayrıca korunmalıdır. Teknik tasarım, ağın tam olarak bir kez teslim yapacağını varsaymamalıdır.

Hangi kimlik kaydın sahibi olmalı?
Muayene işi, ERP siparişi, muhasebe fişi ve e-belge aynı kimlik değildir. Zincirin başlangıcında değişmeyen bir kaynak iş UUID'si bulunmalı; diğer sistemlerin ürettiği kimlikler bunun karşılığı olarak ayrı alanlarda saklanmalıdır.
| Kimlik | Sahibi | Ne zaman oluşur? | Kullanım |
|---|---|---|---|
| Kaynak iş UUID'si | Muayene sistemi | İş ilk açıldığında | Bütün aktarım ve retry'ların sabit iş anahtarı |
| Olay UUID'si | Muayene sistemi | Faturalamaya hazır sürüm oluştuğunda | Kuyruk mesajı ve işlenmiş olay kontrolü |
| ERP müşteri/sipariş ID'si | ERP | Hedef kayıt kabul edildiğinde | Sonraki güncelleme ve durum sorgusu |
| Muhasebe belge ID'si | Muhasebe sistemi | Belge taslağı/kaydı oluştuğunda | Finansal yaşam döngüsü |
| e-Belge UUID/numarası | e-Belge süreci | Belge düzenlendiğinde | Belgenin kendi teknik kimliği |
OASIS UBL 2.4 Invoice, fatura ile sipariş ve diğer belgeler arasında referans alanları tanımlar. GİB e-Fatura Portalı kılavuzu da aynı UUID ve fatura numarasına sahip faturaların tekrar yüklenemeyeceğini belirtir. Buradan çıkan uygulama sonucu, kaynak muayene kimliğini e-belge numarasıyla değiştirmek değil; kimlikleri çift yönlü bir bağ tablosunda ayrı tutmaktır.
Idempotency key nasıl üretilmeli?
Anahtar rastgele her retry'da yeniden üretilmemeli; aynı ticari etkinin bütün denemelerinde aynı kalmalıdır. Örnek kapsam şu parçaların kanonik birleşiminden türetilebilir:
tenant + hedef_sistem + işlem_türü + kaynak_iş_uuid + kaynak_sürümü
Kaynak sürümü önemlidir. Aynı rapor sürümünü tekrar göndermek mevcut sonucu döndürmelidir; yetkili revizyon yeni bir ticari etki yaratacaksa bunun ayrı olay ve açık iş kuralı olması gerekir. İdempotency kaydı anahtarın yanında payload özetini, ilk görülme zamanını, durumu ve hedef yanıt kimliğini tutmalıdır.
Stripe'ın güncel API referansı, bağlantı hatasından sonra create/update isteğinin aynı idempotency key ile güvenle tekrarlanmasını ve anahtar aynıyken parametreler değişmişse isteğin reddedilmesini belgeler. Bu sağlayıcıya özgü davranış, kurum içi ERP adaptörü için de yararlı bir sözleşme örneğidir: aynı anahtar farklı müşteri, tutar veya vergi eşlemesiyle gelirse sessizce üzerine yazmayın; çakışmayı incelemeye alın.
Uygulama kontrolü neden tek başına yetmez?
“Önce var mı diye sorgula, yoksa ekle” yaklaşımında iki worker aynı anda yok sonucunu görebilir. Tekillik veritabanında da zorlanmalıdır.
Entegrasyon bağlantı tablosunda tenant_id + target_system + document_type + source_job_uuid üzerinde bileşik unique constraint kurun. PostgreSQL'in güncel INSERT dokümantasyonu, unique constraint ile ON CONFLICT kullanımının yarış altında atomik insert/update sonucu sağlayabildiğini açıklar. İş kuralınız güncellemeye izin vermiyorsa çatışmada mevcut hedef ID'sini döndürün; veri farklıysa fail-closed inceleme kaydı açın.
UNIQUE (tenant_id, target_system, document_type, source_job_uuid)
aynı anahtar + aynı payload özeti -> mevcut sonucu döndür
aynı anahtar + farklı payload -> çakışma, otomatik belge açmaOutbox ve kuyruk akışı nasıl kurulmalı?
Muayene raporunu “faturalamaya hazır” yapmak ile ERP mesajını ayrı ayrı yazmak yarım durum üretebilir. İş durumu ve entegrasyon olayı aynı yerel transaction içinde commit edilmelidir.
- Yetkili kullanıcı rapor sürümünü ve faturalama kapsamını onaylar.
- Uygulama aynı transaction içinde iş durumunu günceller ve olay UUID'siyle outbox satırı ekler.
- Worker outbox olayını hedef adaptöre sabit idempotency key ile gönderir.
- Başarılı yanıtta ERP hedef ID'si ve yanıt özeti bağ tablosuna kaydedilir.
- ACK kaybolursa aynı olay yeniden gelir; tüketici olay UUID'sini ve iş bağını görüp mevcut sonucu döndürür.
- Kalıcı veri hatası retry döngüsüne sokulmaz; inceleme/dead-letter kuyruğuna alınır.
Microsoft'un Transactional Outbox rehberi, business object ile olayın aynı transaction içinde saklanmasını; Service Bus rehberi ise kayıp ACK ve yeniden teslim nedeniyle tüketicinin MessageId veya ticari kimlikle idempotent olmasını önerir. Gönderici tarafındaki duplicate detection, alıcıdaki tekillik kontrolünün yerine geçmez.
Müşteri, hizmet ve vergi eşlemesi nasıl güvenli yapılır?
Çift kaydı önlemek yalnız teknik retry sorunu değildir. Aynı müşteriyi unvan yazımıyla yeniden açmak veya aynı hizmeti farklı kodla faturalamak da operasyonel çoğalma üretir.
- Müşteri: tenant kapsamında doğrulanmış VKN/TCKN veya kurum ana anahtarıyla eşleyin; unvanı tek başına anahtar yapmayın.
- Hizmet: muayene yöntemini onaylı ERP stok/hizmet kodu tablosuna bağlayın; eşleşmeyen kodu serbest metinle otomatik açmayın.
- Vergi ve para birimi: hedef sistemin kod listesine sürümlü eşleme uygulayın; eksik veya geçersiz eşlemede belge üretimini durdurun.
- Tutar: hesaplanan satırları, indirimleri ve vergiyi kaynak sürüm özetiyle kilitleyin; onay sonrası değişikliği yeni revizyon akışına alın.
- Yetki: müşteri oluşturma, eşleme değiştirme ve finansal belge üretme rollerini ayrı denetim izleriyle yönetin.
Belirsiz eşleşme “en yakın sonucu” seçmemelidir. İnsan incelemesi tamamlanana kadar aktarım beklemeli; verilen kararın kim, zaman, önceki/yeni değer ve gerekçesi kaydedilmelidir.
Aktarım durumu nasıl izlenmeli?
Tek bir “başarılı/başarısız” alanı belirsizliği saklar. Durum makinesi, hangi adımın tekrar edilebilir olduğunu göstermelidir.
| Durum | Anlamı | İzin verilen işlem |
|---|---|---|
| Hazırlanıyor | Eşleme ve payload doğrulanıyor | Eksikleri düzelt |
| Gönderime hazır | Kimlik, sürüm ve payload özeti kilitli | Outbox'a al |
| Belirsiz | Timeout var, hedefte sonuç olabilir | Aynı anahtarla sorgula/retry |
| Aktarıldı | Hedef ID ve yanıt kanıtı kaydedildi | Durum sorgula, kopya oluşturma |
| İnceleme gerekli | Anahtar çakışması veya veri eşleme hatası | Yetkili kararını bekle |
| İptal/ters kayıt bekliyor | Finansal düzeltme gerekiyor | Hedef sistem kuralına göre ayrı işlem |
Başarılı aktarım kaydını silip yeniden göndermek düzeltme yöntemi değildir. Finansal belge oluşmuşsa iptal, iade veya ters kayıt kendi kimliği ve onay akışıyla yürütülmelidir.
Mutabakat hangi kontrolleri yapmalı?
Günlük mutabakat, yalnız hata logunu saymak yerine kaynak ve hedef kayıtlarını kimlik düzeyinde karşılaştırmalıdır.
- Faturalamaya hazır olup hedef bağlantısı bulunmayan işler.
- Aynı kaynak iş UUID'sine bağlanmış birden fazla hedef belge.
- Hedefte bulunan fakat kaynak bağ tablosunda karşılığı olmayan belgeler.
- Kaynak sürümü ile gönderilen payload özeti uyuşmayan kayıtlar.
- Belirsiz durumda tanımlı süreden uzun kalan denemeler.
- Manuel eşleme, iptal ve ters kayıtların onay/kanıt eksikleri.
Mutabakat sonucu otomatik silme veya toplu birleştirme yapmamalıdır. Şüpheli kayıtları, iki sistemdeki kimlikleri ve önerilen güvenli işlemi yetkili kullanıcıya göstermelidir.
VizyonTech entegrasyonu nasıl pilotlanmalı?
Vizyon Periyodik gibi muayene akışlarından ERP'ye geçişte normal senaryodan önce hata senaryolarını deneyin. Aynı iş için çift tıklama, ERP'nin kaydı oluşturup yanıt vermemesi, aynı kuyruk mesajının iki worker'a ulaşması, farklı payload ile aynı anahtar, geçersiz müşteri eşlemesi ve rapor revizyonu test edilmelidir.
Pilotun başarı ölçütü “entegrasyon çalıştı” değildir. Her senaryoda hedefte kaç kayıt oluştuğu, kaynak-hedef bağının kurulup kurulmadığı, retry'ın aynı sonucu döndürdüğü, belirsizliğin görünür kaldığı ve yetkisiz finansal işlemin engellendiği kanıtlanmalıdır. Muayene raporunun karar zincirini korumak için e-imza iş akışı rehberi de birlikte değerlendirilebilir.
Kaynaklar
- IETF — RFC 9110, HTTP Semantics: Idempotent Methods (Haziran 2022; erişim 21 Temmuz 2026).
- Stripe — Idempotent requests, API Reference (güncel çevrimiçi dokümantasyon; erişim 21 Temmuz 2026).
- Microsoft Learn — Prevent message loss and duplicate processing in Azure Service Bus (29 Haziran 2026 güncellemesi).
- Microsoft Learn — Implement the Transactional Outbox pattern (2026; erişim 21 Temmuz 2026).
- PostgreSQL — INSERT ve ON CONFLICT, güncel dokümantasyon (erişim 21 Temmuz 2026).
- OASIS — UBL 2.4 Invoice model özeti (2024).
- Gelir İdaresi Başkanlığı — e-Fatura Portalı Kullanım Kılavuzu v1.5 (Kasım 2013; teknik kimlik ve tekrar yükleme kuralı için, erişim 21 Temmuz 2026).
ERP, muhasebe ve e-Belge alan/kod kuralları kullanılan sağlayıcının güncel teknik dokümanı ve kuruluşun mali süreçleri üzerinden ayrıca doğrulanmalıdır.