Bankacılıkta Transactional Yapı: Teoriden Pratiğe

Umut Akbulut
BilgeAdam Teknoloji
4 min readJun 24, 2024

Finansal Dünyanın Dinamikleri

Bankacılık sektörü, yüksek hacimli ve kritik öneme sahip işlemlerle dolu bir dünyadır. Bu dünyada, her işlem (transaction) hem güvenilir hem de tutarlı olmak zorundadır. Transactional yapının ne olduğu, nasıl kurgulanması gerektiği, hangi analiz yapılarına ve teknolojilere ihtiyaç duyulduğu gibi konuları detaylı bir şekilde inceleyelim. Ayrıca, örnek bir microservice akışı üzerinden Spring Boot, Lombok, Apache Kafka ve Saga Pattern kullanarak bir bankacılık uygulaması geliştireceğiz.

Transactional Yapı Nedir ve Nasıl Olmalı?

1. Transactional Yapının Tanımı

Transactional yapı, bir dizi işlemin tamamının başarılı bir şekilde gerçekleştirilmesini veya tamamının geri alınmasını sağlayan bir yapıdır. Bankacılıkta, bir işlem yalnızca tamamlandığında ve tüm adımlar başarılı olduğunda gerçekleşmiş sayılır. Aksi takdirde, işlem geri alınır (rollback).

2. İdeal Transactional Yapının Özellikleri

  • Atomiklik: Her işlem ya tamamen gerçekleştirilir ya da hiç gerçekleştirilmez.
  • Tutarlılık: İşlem, sistemin veri bütünlüğünü korur.
  • İzolasyon: İşlemler birbirinden bağımsız olarak yürütülür.
  • Dayanıklılık: Bir işlem tamamlandığında, sonuçları kalıcı olarak saklanır.

3. Analiz Yapısı

Transactional yapının doğru kurgulanması için detaylı bir analiz gereklidir. Bu analiz süreci şu adımları içerir:

  • İş Süreçlerinin Haritalanması: Bankacılık işlemlerinin adım adım haritalanması ve kritik noktaların belirlenmesi.
  • Veri Akışının İncelenmesi: Verilerin nereden gelip nereye gittiğinin detaylı bir şekilde analiz edilmesi.
  • Risk Analizi: İşlem sürecindeki olası risklerin ve bu risklerin nasıl yönetileceğinin belirlenmesi.

Mimari Yapı

1. Microservice Mimarisi

Microservice mimarisi, bankacılık uygulamalarında esneklik, ölçeklenebilirlik ve bağımsız geliştirme imkanı sağlar. Her microservice, belirli bir işlevi yerine getirir ve diğerlerinden bağımsız olarak çalışır.

2. İletişim ve Koordinasyon

Microservice’lerin iletişimi ve koordinasyonu için mesajlaşma sistemleri kullanılır. Apache Kafka, bu tür bir iletişimi sağlamak için ideal bir platformdur. Ayrıca, Saga Pattern ile dağıtık işlemler yönetilir.

3. Teknolojiler ve Kütüphaneler

  • Spring Boot: Microservice geliştirme için popüler bir framework.
  • Lombok: Java kodlarının daha temiz ve anlaşılır olmasını sağlayan bir kütüphane.
  • Apache Kafka: Yüksek hacimli veri akışlarını ve microservice iletişimini yönetmek için kullanılır.
  • Saga Pattern: Dağıtık sistemlerde transaction yönetimi için kullanılır.

Riskler ve Dikkat Edilmesi Gerekenler

1. Veri Tutarlılığı

Microservice mimarisinde, veri tutarlılığının sağlanması zordur. Bu nedenle, veri tutarlılığı mekanizmalarının (örneğin, Saga Pattern) doğru bir şekilde uygulanması gereklidir.

2. Hata Yönetimi

Dağıtık sistemlerde, her bir microservice’in arızalanma olasılığı vardır. Bu nedenle, hata yönetimi ve geri dönüş mekanizmaları (rollback) iyi tasarlanmalıdır.

3. Güvenlik

Bankacılık işlemleri son derece hassas verilere sahiptir. Bu nedenle, her microservice için güçlü kimlik doğrulama ve yetkilendirme mekanizmaları uygulanmalıdır.

Örnek Bir Microservice Akışı

Şimdi, örnek bir bankacılık microservice uygulaması geliştirerek tüm bu teorik bilgileri pratiğe dökelim.

1. Projenin Yapılandırılması

Spring Boot kullanarak projemizi oluşturuyoruz. Maven veya Gradle ile gerekli bağımlılıkları ekliyoruz.

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

2. Domain Modelleri ve Veritabanı Yapısı

Bankacılık işlemleri için domain modelleri oluşturuyoruz. Örneğin, Account ve Transaction modelleri.

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Account {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String accountNumber;
private Double balance;
}

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Transaction {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Long accountId;
private Double amount;
private String type;
}

3. Service ve Repository Katmanı

Hesap ve işlem servislerini oluşturuyoruz.

@Service
public class AccountService {
@Autowired
private AccountRepository accountRepository;

public Account createAccount(Account account) {
return accountRepository.save(account);
}

public Account getAccount(Long id) {
return accountRepository.findById(id).orElseThrow(() -> new RuntimeException("Account not found"));
}
}

@Service
public class TransactionService {
@Autowired
private TransactionRepository transactionRepository;

public Transaction createTransaction(Transaction transaction) {
return transactionRepository.save(transaction);
}
}

4. API Gateway ve İletişim

API Gateway ve iletişim için Kafka’yı kullanıyoruz. Kafka yapılandırmasını yapıyoruz.

@Configuration
public class KafkaConfig {

@Bean
public ProducerFactory<String, String> producerFactory() {
Map<String, Object> configProps = new HashMap<>();
configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
return new DefaultKafkaProducerFactory<>(configProps);
}

@Bean
public KafkaTemplate<String, String> kafkaTemplate() {
return new KafkaTemplate<>(producerFactory());
}
}

5. Saga Orchestrator

Saga Pattern ile dağıtık işlemleri yönetiyoruz. Örneğin, bir transfer işlemi senaryosu için.

@Service
public class TransferService {

@Autowired
private AccountService accountService;
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;

public void transfer(Long fromAccountId, Long toAccountId, Double amount) {
Account fromAccount = accountService.getAccount(fromAccountId);
Account toAccount = accountService.getAccount(toAccountId);

if (fromAccount.getBalance() >= amount) {
fromAccount.setBalance(fromAccount.getBalance() - amount);
toAccount.setBalance(toAccount.getBalance() + amount);

accountService.createAccount(fromAccount);
accountService.createAccount(toAccount);

kafkaTemplate.send("transfer-topic", "Transfer from " + fromAccountId + " to " + toAccountId + " of amount " + amount);
} else {
throw new RuntimeException("Insufficient balance");
}
}
}

6. API Katmanı

RESTful API endpoint’lerini oluşturuyoruz.

@RestController
@RequestMapping("/api/accounts")
public class AccountController {

@Autowired
private AccountService accountService;

@PostMapping
public Account createAccount(@RequestBody Account account) {
return accountService.createAccount(account);
}

@GetMapping("/{id}")
public Account getAccount(@PathVariable Long id) {
return accountService.getAccount(id);
}
}

@RestController
@RequestMapping("/api/transactions")
public class TransactionController {

@Autowired
private TransactionService transactionService;

@PostMapping
public Transaction createTransaction(@RequestBody Transaction transaction) {
return transactionService.createTransaction(transaction);
}
}

@RestController
@RequestMapping("/api/transfers")
public class TransferController {

@Autowired
private TransferService transferService;

@PostMapping
public void transfer(@RequestParam Long fromAccountId, @RequestParam Long toAccountId, @RequestParam Double amount) {
transferService.transfer(fromAccountId, toAccountId, amount);
}
}

7. Monitoring ve Logging

Prometheus ve Grafana ile microservice’lerimizi izleyip analiz ediyoruz.

# Prometheus configuration example
global:
scrape_interval: 15s

scrape_configs:
- job_name: 'spring-boot-app'
static_configs:
- targets: ['localhost:8080']

8. Sonuç ve Değerlendirme

Bu yazıda, bankacılıkta transactional yapının ne olduğu, nasıl kurgulanması gerektiği, hangi analiz ve mimari yapıların kullanılabileceği konularını ele aldık. Örnek bir microservice uygulaması geliştirerek, Spring Boot, Lombok, Apache Kafka ve Saga Pattern gibi güncel teknolojilerle bankacılık işlemlerini nasıl yönetebileceğimizi gördük.

Umarım, bu bilgiler ve örnek uygulama, bankacılık sektöründe microservice mimarisine geçiş yapmayı düşünenler için faydalı olur. Teknolojinin sunduğu yeniliklerle, daha esnek, ölçeklenebilir ve güvenilir bankacılık sistemleri kurmak mümkün. Bankacılığın geleceğine doğru adım atarken, bu teknolojileri kullanarak daha güçlü ve güvenilir sistemler geliştirebiliriz.

--

--

Umut Akbulut
BilgeAdam Teknoloji

"Tech leader & Software Architect. Passionate about digital transformation, microservices, and innovation in the finance and tech sectors."