Sayfalar

28 Şubat 2025 Cuma

How to manage distributed transaction in Microservices?

In a Microservices architecture, services are designed to be small, autonomous, and loosely coupled. This design philosophy provides many benefits, including scalability, flexibility, and faster development cycles. 
However, managing transactions across multiple microservices can be a challenging task. In this article, we will explore how to manage distributed transactions in microservices and provide relevant code examples.
There are multiple ways to manage transactions in Microservices like applying SAGA Pattern, using 2 Phase commit or using Event Sourcing Design Pattern. In this article, we will understand all of those but before that, let's understand what is distributed transactions and what are challenges related to transaction management in Microservices. 


1. What are Distributed Transactions in Microservices?

A distributed transaction involves multiple services that need to work together to complete a transaction. 

In a Microservices architectureMicroservices architecture, each service may have its own database, and transactions that require data from multiple services may need to coordinate the work of all these services to ensure that the transaction is completed successfully.

For example, when a user makes a purchase, the transaction may involve several services, such as the order service, payment service, and inventory service.

Challenges of Managing Distributed Transactions in Microservices

Managing distributed transactions in a microservices architecture can be challenging due to the following reasons:

1. Complexity
Managing transactions across multiple services can be complex, and coordinating the work of all these services can be challenging.

2. Failure Handling
In a distributed system, failures are inevitable, and handling these failures in a distributed transaction can be challenging.

3. Scalability
Microservices architecture is designed to be scalable, and managing transactions across multiple services can be challenging in a highly scalable environment.

4. Latency
Coordinating the work of multiple services can introduce latency, which can impact the performance of the system.


6 Ways to Manage Distributed Transactions in Microservices?

There are several approaches to manage distributed transactions in a microservices architecture. Here are some of the most popular approaches:

1. Two-Phase Commit (2PC)

Two-phase commit is a protocol used to ensure that all participants in a distributed transaction agree to commit or abort the transaction. In this approach, a coordinator service is responsible for coordinating the work of all the services involved in the transaction. 

The coordinator asks all the services to prepare for the transaction, and if all the services are ready, the coordinator sends a commit message to all the services. If any of the services fail to prepare or respond, the coordinator sends an abort message to all the services.

Here is a nice diagram which shows how two phase commit works:

2. Saga Pattern

The Saga pattern is a pattern used to manage long-running transactions in a distributed system. In this pattern, each service involved in the transaction performs a local transaction and sends a message to the next service to perform its transaction. 

If any of the services fail, the Saga can be rolled back by sending a compensating transaction to undo the work that has already been done.

Here is a nice diagram which shows how Saga pattern works in a Microservices architecture:

3. Event-Driven Architecture

Event-driven architecture is an architectural pattern that involves the use of events to trigger actions in a system. In a distributed transaction, each service can publish events when it has completed its part of the transaction. 

Other services can then subscribe to these events and perform their part of the transaction. This is probably the simplest solution of managing distributed transactions in Microservices architecture. 

Here is a nice diagram to show how Event Drive Architecture works:

Code Example of SAGA and 2-Phase Commit in Java Microservices

Let's take a look at some code examples of how to manage distributed transactions in microservices using the two-phase commit and Saga pattern approaches.

  • Two-Phase Commit (2PC)

Here is a sample code of two phase commit using Java:

@Service
public class OrderService {

    @Autowired
    private PaymentService paymentService;

    @Autowired
    private InventoryService inventoryService;

    @Transactional
    public void placeOrder(Order order) throws Exception {
        // Reserve inventory
        inventoryService.reserveInventory(order);

        // Charge payment
        paymentService.chargePayment(order);

        // Commit transaction
        // This is handled by the transaction manager
    }
}

Here is how 2-phase commit look like in a sequence diagram:

  •  Saga Pattern

Now that we have seen code example of using 2 phase commit for managing transactions in Microservices, its time to look at SAGA Pattern, another popular ways to manage distributed transactions. 

public class OrderSaga {

    @Autowired
    private OrderService orderService;

    @Autowired
    private PaymentService paymentService;

    @Autowired
    private InventoryService inventoryService;

    @SagaStart
    public


    public void placeOrder(Order order) throws Exception {
        try {
            // Step 1: Reserve inventory
            inventoryService.reserveInventory(order);
            order.setStatus("Inventory Reserved");

            // Step 2: Charge payment
            paymentService.chargePayment(order);
            order.setStatus("Payment Charged");

            // Step 3: Confirm order
            orderService.confirmOrder(order);
            order.setStatus("Order Confirmed");
        } catch (Exception ex) {
            // Step 4: Handle failure
            inventoryService.cancelInventoryReservation(order);
            paymentService.refundPayment(order);
            orderService.cancelOrder(order);
            order.setStatus("Transaction Failed");
        }
    }
}

In addition to the above approaches, there are a few more techniques and best practices that can help manage distributed transactions in microservices. 

Let's take a look at a few of them.

4. Use Idempotent Operations

Idempotent operations are operations that can be repeated without changing the outcome. In a distributed system, using idempotent operations can help ensure that the same operation is not performed twice, even if it is retried due to a failure. 

For example, if a service is trying to update a record in a database, it can check if the record already exists before performing the update operation. If the record already exists, the service can skip the update operation and return a success response.

5. Implement Retry and Timeout Mechanisms

In a distributed system, network failures and timeouts are common. Implementing retry and timeout mechanisms can help handle these failures gracefully. For example, if a service fails to respond to a request, the client can retry the request a few times before giving up. 

Similarly, if a service takes too long to respond, the client can timeout the request and handle the failure gracefully.

6. Use a Distributed Transaction Coordinator

distributed transaction coordinator is a service that manages distributed transactions in a microservices architecture. It provides a centralized mechanism for coordinating the work of all the services involved in a transaction.


The coordinator can ensure that all the services commit or abort the transaction in a coordinated manner, even in the event of failures.

Let's take a look at a code example that implements idempotent operations and retry mechanisms to handle failures in a distributed transaction.

public class PaymentService {

    @Autowired
    private RestTemplate restTemplate;

    @Value("${inventory.service.url}")
    private String inventoryServiceUrl;

    @Value("${retry.maxAttempts}")
    private int maxAttempts;

    @Value("${retry.backoff}")
    private int backoff;

    @Retryable(value = { HttpClientErrorException.class }, 
maxAttempts = "${retry.maxAttempts}",
backoff = @Backoff(delay = "${retry.backoff}"))
    public void chargePayment(Order order) throws Exception {
        try {
            // Check if payment already exists
            Payment payment = restTemplate.getForObject(
"http://payment-service/payments/{orderId}", 
Payment.class, order.getId());
            if (payment != null) {
                // Payment already exists, skip the operation
                return;
            }

            // Perform payment
            restTemplate.postForObject("http://payment-service/payments",
        order, Payment.class);

        } catch (HttpClientErrorException ex) {
            // Handle 4xx errors
            if (ex.getStatusCode() == HttpStatus.CONFLICT) {
                // Payment already exists, skip the operation
                return;
            }
            throw ex;
        } catch (HttpServerErrorException ex) {
            // Handle 5xx errors
            throw ex;
        }
    }

    @Recover
    public void recoverChargePayment(HttpClientErrorException ex,
   Order order) {
        // Handle retry failure
        // Log the error and throw an exception
        throw new RuntimeException("Failed to charge payment after " 
        + maxAttempts + " retries");
    }
}

Conclusion

That's all about how to manage transactions in Microservices and distributed systems. Managing distributed transactions in a microservices architecture is a complex task that requires careful planning and implementation. 

In this article, we explored some of the popular approaches and best practices to manage distributed transactions, including idempotent operations, retry and timeout mechanisms, and the use of a distributed transaction coordinator.

You have also see the code example that implements idempotent operations and retry mechanisms to handle failures in a distributed transaction. 

By following these approaches and best practices, you can effectively manage distributed transactions in your microservices architecture and ensure that your system is reliable and scalable.

Other System Design and Microservices Tutorials and Resources

{ ACID, değişikliklerin bir veritabanına nasıl uygulanacağını yöneten 4 adet prensip sunar. Bunlar, AtomicityConsistencyIsolation ve Durability prensipleridirBir kaç cümle ile açıklamak gerekirse;

Atomicity: En ksıa ifadesiyle ya hep, ya hiç. Arda arda çalışan transaction’lar için iki olası senaryo vardır. Ya tüm transaction’lar başarılı olmalı ya da bir tanesi bile başarısız olursa tümünün iptal edilmesi durumudur.

Consistency: Veritabanındaki datalarımızın tutarlı olması gerekir. Eğer bir transaction geçersiz bir veri üreterek sonuçlanmışsa, veritabanı veriyi en son güncel olan haline geri alır. Yani bir transaction, veritabanını ancak bir geçerli durumdan bir diğer geçerli duruma güncelleyebilir.

Isolation: Transaction’ların güvenli ve bağımsız bir şekilde işletilmesi prensibidir. Bu prensip sıralamayla ilgilenmez.Bir transaction, henüz tamamlanmamış bir başka transaction’ın verisini okuyamaz.

Durability: Commit edilerek tamamlanmış trasnaction’ların verisinin kararlı, dayanıklı ve sürekliliği garanti edilmiş bir ortamda (sabit disk gibi) saklanmasıdır. Donanım arızası gibi beklenmedik durumlarda transaction log ve alınan backup’lar da prensibe bağlılık adına önem arz etmektedir.

   [Suat KÖSE] yazısından alıntıdır}



Sharding stratejileri

Sharding Nedir?

    Veri tabanı sharding, büyük ölçekli veri tabanlarını daha küçük parçalara bölmek (shard) ve bu parçaları farklı fiziksel sunucularda veya veri tabanlarında depolamak anlamına gelir. Sharding, büyük veri hacimleri ve yüksek trafiğe sahip uygulamalarda performansı artırmak ve ölçeklenebilirliği sağlamak için kullanılır. Farklı sharding stratejileri, veri tabanını nasıl böleceğinizi ve verileri hangi kriterlere göre dağıtacağınızı belirlemenize yardımcı olur.
    Veritabanı parçalama, verilerin performansı artırmak ve büyük miktardaki verilerin tek bir veritabanı üzerindeki etkisini azaltmak için birden fazla veritabanı örneğine veya parçaya bölündüğü, veritabanlarının yatay ölçeklenmesi için kullanılan bir tekniktir.

Sharding'i bir örnek üzerinden açıklayalım:
Pizzayı farklı dilimler halinde alırsınız ve bu dilimleri arkadaşlarınızla paylaşırsınız. Parçalama olarak da bilinen veri bölümleme, Pizza dilimlerini paylaşma konseptiyle aynı şekilde çalışır.
Temel olarak, büyük bir veri setini daha küçük parçalara (mantıksal parçalar) böldüğümüz ve bu parçaları farklı makinelerde/veritabanı düğümlerinde (fiziksel parçalar) depoladığımız/dağıttığımız bir veritabanı mimarisi desenidir.
  • Her bir parça/bölüm bir " parça " olarak bilinir ve her parçanın orijinal veritabanıyla aynı veritabanı şeması vardır.
  • Verileri, her satırın yalnızca bir parçada görünecek şekilde dağıtıyoruz.
  • Bir uygulamanın  ölçeklenebilirliğini artırmak için iyi bir mekanizma .

Parçalama

Parçalama Yöntemleri


1. Anahtar Tabanlı Parçalama

Bu teknik , karma tabanlı parçalama olarak da bilinir . Burada, müşteri kimliği, müşteri e-postası, bir istemcinin IP adresi, posta kodu vb. gibi bir varlığın değerini alırız ve bu değeri karma işlevinin bir girdisi olarak kullanırız. Bu işlem , verileri depolamak için hangi parçayı kullanmamız gerektiğini belirlemek için kullanılan bir karma değeri üretir .

  • Verilerin doğru sırada ve tutarlı bir şekilde yerleştirildiğinden emin olmak için, hash fonksiyonuna girilen değerlerin hepsinin aynı sütundan (parça anahtarı) gelmesi gerektiğini aklımızda tutmamız gerekir.
  • Temel olarak, parça anahtarları birincil anahtar veya tek tek satırlar için benzersiz bir tanımlayıcı gibi davranır.

Örneğin:

3 adet veritabanı sunucunuz var ve her isteğin bir uygulama kimliği var ve her yeni uygulama kaydedildiğinde bu kimlik 1 artırılıyor.  

Verilerimizin hangi sunucuya yerleştirileceğini belirlemek için, bu uygulama id'leri 3 numaralı olanlara bir modüler işlem uygularız. Daha sonra kalan, verilerimizi depolayacağımız sunucuyu tanımlamak için kullanılır.

Anahtar Tabanlı Parçalama

Anahtar Tabanlı Parçalamanın Avantajları :

  • Öngörülebilir Veri Dağılımı:
    • Anahtar tabanlı bölümlendirme, verileri bölümler arasında dağıtmanın öngörülebilir bir yolunu sağlar.
    • Her farklı anahtar değeri belirli bir parçayla ilişkilendirilir ve bu sayede verilerin tekdüze ve tutarlı bir şekilde dağıtılması garanti altına alınır.
  • Optimize Edilmiş Aralık Sorguları:
    • Sorgular anahtar değer aralıklarını içeriyorsa, anahtar tabanlı parçalama bu aralık sorgularını verimli bir şekilde ele alacak şekilde optimize edilebilir.
    • Bu, özellikle ardışık anahtar değerleri aralığını kapsayan işlemlerle uğraşırken faydalıdır.

Anahtar Tabanlı Parçalamanın Dezavantajları :

  • Eşit Olmayan Veri Dağıtımı: Parçalama anahtarı iyi dağıtılmamışsa, parçalar arasında eşit olmayan veri dağıtımına neden olabilir
  • Belirli Anahtarlarla Sınırlı Ölçeklenebilirlik: Belirli anahtarlar yüksek trafiğe maruz kalırsa veya veri kümesi belirli anahtar aralıklarına doğru yoğun bir şekilde eğilirse, anahtar tabanlı parçalama işleminin ölçeklenebilirliği sınırlı olabilir.
  • Karmaşık Anahtar Seçimi: Etkili anahtar tabanlı parçalama için uygun bir parçalama anahtarı seçmek çok önemlidir.

2. Yatay veya Aralık Tabanlı Parçalama 

Bu yöntemde, verileri her kayıttaki belirli bir değerin aralığına göre farklı parçalara ayırarak böleriz. Diyelim ki çevrimiçi müşterilerinizin adları ve e-posta bilgileri içeren bir veritabanınız var. Bu bilgileri iki parçaya bölebilirsiniz.

  • Bir parçada, adı AP ile başlayan müşterilerin bilgilerini tutabilirsiniz
  • Başka bir bölümde ise diğer müşterilerin bilgileri tutuluyor. 

aralık tabanlı parçalama

Menzil Tabanlı Parçalamanın Avantajları:

  • Ölçeklenebilirlik: Yatay veya aralık tabanlı parçalama, verileri birden fazla parçaya dağıtarak kesintisiz ölçeklenebilirlik sağlar ve büyüyen veri kümelerine uyum sağlar.
  • Gelişmiş Performans: Verilerin parçalar arasında dağıtılması, paralellik yoluyla sorgu performansını artırır ve her parçanın işlediği daha küçük veri alt kümeleriyle daha hızlı işlemler sağlar.

Menzil Tabanlı Parçalamanın Dezavantajları:

  • Parçalar Arası Karmaşık Sorgulama: Birden fazla parçayı içeren sorguları koordine etmek zor olabilir.
  • Dengesiz Veri Dağıtımı: Kötü yönetilen veri dağıtımı, parçalar arasında dengesiz iş yüklerine yol açabilir.

3. Dikey Parçalama

Bu yöntemde, tablodan tüm sütunu ayırırız ve bu sütunları yeni ayrı tablolara koyarız. Veriler bir bölümden diğerine tamamen bağımsızdır. Ayrıca, her bölüm hem ayrı satırları hem de sütunları tutar. Bir varlığın farklı özelliklerini farklı makinelerdeki farklı parçalara ayırabiliriz.

Örneğin:

Twitter'da kullanıcıların bir profili, takipçi sayısı ve kendi gönderdiği bazı tweet'leri olabilir. Kullanıcı profillerini bir shard'a, takipçileri ikinci shard'a ve tweet'leri üçüncü bir shard'a yerleştirebiliriz.

dikey parçalama

Dikey Parçalamanın Avantajları:

  • Sorgu Performansı: Dikey bölümlendirme, her bölümün belirli bir sütun alt kümesine odaklanmasına izin vererek sorgu performansını iyileştirebilir. Bu özelleştirme, yalnızca kullanılabilir sütunların bir alt kümesini içeren sorguların verimliliğini artırır.
  • Basitleştirilmiş Sorgular: Belirli bir sütun kümesi gerektiren sorgular basitleştirilebilir, çünkü bunların yalnızca ilgili sütunları içeren bölümle etkileşime girmesi gerekir.

Dikey Parçalamanın Dezavantajları:

  • Sıcak Nokta Potansiyeli: Çok erişilen sütunlar içeriyorsa belirli parçalar sıcak nokta haline gelebilir ve bu da iş yüklerinin eşit olmayan şekilde dağılmasına yol açabilir.
  • Şema Değişikliklerindeki Zorluklar: Sütun ekleme veya çıkarma gibi şemada değişiklik yapmak, dikey olarak parçalanmış bir sistemde daha zorlayıcı olabilir. Değişiklikler birden fazla parçayı etkileyebilir ve dikkatli koordinasyon gerektirebilir.

4. Dizin Tabanlı Parçalama

Bu yöntemde, orijinal veritabanı için bir arama hizmeti veya arama tablosu oluşturur ve sürdürürüz. Temel olarak arama tablosu için bir parça anahtarı kullanırız ve veritabanında bulunan her varlık için  eşleme yaparız . Bu şekilde hangi veritabanı parçalarının hangi verileri tuttuğunu takip ederiz.

Dizin Tabanlı Parçalama

Arama tablosu, belirli verilerin nerede bulunabileceğine dair statik bir bilgi kümesi tutar. Yukarıdaki görüntüde, teslimat bölgesini bir parça anahtarı olarak kullandığımızı görebilirsiniz:

  • İlk olarak istemci uygulaması verinin bulunduğu veritabanı bölümünü (shard) bulmak için arama servisine sorgu gönderir.
  • Arama servisi parçayı döndürdüğünde o parçayı sorgular/günceller.  

Dizin Tabanlı Parçalamanın Avantajları:

  • Esnek Veri Dağıtımı: Dizin tabanlı bölümlendirme, merkezi dizinin verilerin bölüm konumlarına eşlenmesini dinamik olarak yönetebildiği ve güncelleyebildiği esnek veri dağıtımına olanak tanır.
  • Verimli Sorgu Yönlendirmesi: Sorgular, dizinde saklanan bilgiler kullanılarak uygun parçaya verimli bir şekilde yönlendirilebilir. Bu, iyileştirilmiş sorgu performansıyla sonuçlanır.
  • Dinamik Ölçeklenebilirlik : Sistem, uygulama mantığında değişiklik gerektirmeden, parçaları ekleyerek veya kaldırarak dinamik olarak ölçeklenebilir.

Dizin Tabanlı Parçalamanın Dezavantajları:

  • Merkezi Arıza Noktası: Merkezi dizin tek bir arıza noktasını temsil eder. Dizin kullanılamaz hale gelirse veya sorunlar yaşarsa, tüm sistemi bozabilir, veri erişimini ve sorgu yönlendirmesini etkileyebilir.
  • Artan Gecikme : Merkezi bir dizin üzerinden sorgu yönlendirme, diğer parçalama stratejilerine kıyasla potansiyel olarak artan gecikmeye yol açabilecek ek bir katman sunar.

Eşit veri dağıtımı için veritabanı bölümlendirmesini optimize etme yolları

İşte eşit veri dağıtımı için veritabanı bölümlendirmesini optimize etmenin bazı basit yolları:

  • Tutarlı Karma Değer Kullanın : Bu, kayıtları anahtar değerlerine göre farklı parçacıklara atayan bir karma işlevi kullanarak verilerin tüm parçacıklar arasında daha eşit bir şekilde dağıtılmasına yardımcı olur.
  • İyi Bir Parçalama Anahtarı Seçin : İyi dengelenmiş bir parçalama anahtarı seçmek çok önemlidir. Sıcak noktalar oluşturmayan bir anahtar, verilerin tüm sunuculara eşit şekilde dağılmasını sağlar.
  • Dikkatli Olun : Aralık tabanlı parçalama kullanıyorsanız, bir parçanın diğerlerinden daha fazla veriyle aşırı yüklenmemesi için aralıkların düzgün bir şekilde tanımlandığından emin olun.
  • Düzenli Olarak İzleyin ve Yeniden Dengeleyin : Veri dağılımını takip edin ve gerektiğinde veri arttıkça düzensiz yükleri önlemek için parçaları yeniden dengeleyin.
  • Parçalama Mantığını Otomatikleştirin : Verileri otomatik olarak dağıtan ve parçalar arasında dengeyi korumak için parçalamayı yöneten otomasyon araçlarını veya yerleşik veritabanı özelliklerini uygulayın.

Veritabanı parçalamaya alternatifler

Aşağıda veritabanı parçalanmasına bazı alternatifler listelenmiştir:

  1. Dikey Ölçekleme : Veritabanını bölmek yerine, daha fazla yükü idare etmek için daha fazla CPU, bellek veya depolama ekleyerek mevcut sunucunuzu yükseltebilirsiniz. Ancak bunun sınırlamaları vardır çünkü bir sunucuyu yalnızca belirli bir ölçüde ölçekleyebilirsiniz.
  2. Çoğaltma : Veritabanınızın kopyalarını birden fazla sunucuda oluşturabilirsiniz. Bu, yük dengelemeye yardımcı olur ve kullanılabilirliği garanti eder, ancak çoğaltmalar arasında senkronizasyon sorunlarına yol açabilir.
  3. Bölümleme : Birden fazla sunucuya bölmek yerine, bölümleme aynı sunucu içindeki verileri böler. Verileri daha küçük bölümlere bölerek büyük veri kümeleri için sorgu performansını iyileştirir.
  4. Önbelleğe Alma : Sık erişilen verileri bir önbellekte (Redis veya Memcached gibi) depolayarak, ana veritabanınızdaki yükü azaltır ve parçalamaya gerek kalmadan performansı artırırsınız.
  5. İçerik Dağıtım Ağları ( CDN'ler) : Okuma ağırlıklı iş yükleri için İçerik Dağıtım Ağı (CDN) kullanmak, veri erişiminin bir kısmını birincil veritabanınızdan kaldırarak parçalama ihtiyacını azaltabilir.

Sistem Tasarımında Parçalamanın Avantajları

Parçalama, sistem tasarımında pek çok avantaj sunar, örneğin:

  1. Performansı Artırır: Yükü birden fazla sunucuya dağıtarak her sunucunun daha az iş kaldırabilmesini sağlar, bu da daha hızlı yanıt süreleri ve genel olarak daha iyi performans anlamına gelir.
  2. Ölçeklenebilirlik : Parçalama, verileriniz büyüdükçe ölçeklemeyi kolaylaştırır. Sistemin performansını etkilemeden artan veri yükünü yönetmek için daha fazla sunucu ekleyebilirsiniz.
  3. Gelişmiş Kaynak Kullanımı: Veriler dağıtıldığında daha az sunucu kullanılır ve bu da bir sunucunun aşırı yüklenmesi olasılığını azaltır.
  4. Hata İzolasyonu : Bir parça (veya sunucu) arızalanırsa, tüm sistem çökmez, bu da daha iyi hata izolasyonuna yardımcı olur.
  5. Maliyet Verimliliği : Büyük ve pahalı bir sunucuya yatırım yapmak yerine daha küçük ve daha ucuz sunucular kullanabilirsiniz. Sistem büyüdükçe, parçalama maliyetleri kontrol altında tutmaya yardımcı olur.

Sistem Tasarımında Parçalamanın Dezavantajları

Parçalama, sistem tasarımında bazı dezavantajlara sahiptir, örneğin:

  1. Artan Karmaşıklık : Birden fazla parçayı yönetmek ve sürdürmek, tek bir veritabanıyla çalışmaktan daha karmaşıktır. Dikkatli planlama ve yönetim gerektirir.
  2. Yeniden Dengeleme Zorlukları : Veri dağıtımı eşitsiz hale gelirse, parçaların yeniden dengelenmesi (sunucular arasında veri taşıma) zor ve zaman alıcı olabilir.
  3. Parçalar Arası Sorgulamalar : Birden fazla parçadan veri gerektiren sorgular daha yavaş ve daha karmaşık olabilir ve bu da performansı etkileyebilir.
  4. Operasyonel Yük : Parçalama ile daha fazla izleme, yedekleme ve bakıma ihtiyaç duyacaksınız, bu da operasyonel yükü artıracaktır.
  5. Olası Veri Kaybı : Eğer bir parça arızalanırsa ve düzgün bir şekilde yedeklenmezse, o parçada depolanan verilerin kaybolma riski daha yüksektir.

Çözüm

Parçalama, uygulamanızın tek veritabanının büyük miktarda büyüyen veriyi idare edemediği/depolayamadığı durumlarda harika bir çözümdür. Parçalama, veritabanını ölçeklendirmeye ve uygulamanın performansını iyileştirmeye yardımcı olur. Ancak, sisteminize biraz karmaşıklık da ekler. Yukarıdaki yöntemler ve mimariler, her parçalama tekniğinin avantajlarını ve dezavantajlarını açıkça göstermiştir.