Изучение хаос-инжиниринга: методы и примеры кода для устойчивых систем

В современном быстро развивающемся технологическом ландшафте обеспечение надежности и отказоустойчивости программных систем имеет первостепенное значение. Хаос-инжиниринг стал мощной практикой превентивного выявления уязвимостей и слабых мест в распределенных системах. В этой статье мы углубимся в различные методы Chaos Engineering и предоставим примеры кода, которые помогут вам эффективно их реализовать.

  1. Метод: внедрение задержки
    Описание: введение искусственных задержек в сетевом обмене данными для имитации реальных проблем с задержкой.
    Пример кода (Java):

    public class LatencyInjector {
    public void injectLatency(int delayMs) {
    try {
      Thread.sleep(delayMs);
    } catch (InterruptedException e) {
      // Handle interruption
    }
    }
    // Usage example
    public static void main(String[] args) {
    LatencyInjector injector = new LatencyInjector();
    injector.injectLatency(1000); // Introduce 1 second delay
    }
    }
  2. Метод: моделирование сбоев в сети
    Описание: моделирование сбоев и сбоев в сети для проверки поведения системы в неблагоприятных условиях.
    Пример кода (Python):

    import socket
    def simulate_network_failure():
    try:
        # Create a socket connection
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    
        # Set a short timeout for connection
        sock.settimeout(2)
    
        # Attempt to connect to a non-existent host
        sock.connect(('invalidhost', 1234))
    
        # Close the socket
        sock.close()
    except socket.error:
        # Handle socket error
        pass
    # Usage example
    simulate_network_failure()
  3. Метод: Исчерпание ресурсов
    Описание: Моделирование сценариев исчерпания ресурсов, таких как высокая загрузка ЦП или памяти, для понимания системных ограничений.
    Пример кода (Go):

    package main
    import (
    "fmt"
    "runtime"
    "time"
    )
    func simulateResourceExhaustion() {
    done := make(chan bool)
    go func() {
        for {
            go func() {
                for {
                    // Simulate resource-intensive task
                    var data []byte
                    for i := 0; i < 1000000; i++ {
                        data = append(data, byte(i))
                    }
                }
            }()
            time.Sleep(time.Millisecond * 10)
        }
    }()
    // Wait for termination signal
    <-done
    }
    // Usage example
    func main() {
    fmt.Println("Starting resource exhaustion simulation...")
    simulateResourceExhaustion()
    }
  4. Метод: манипулирование DNS
    Описание: проверка устойчивости системы путем манипулирования ответами DNS и наблюдения за тем, как система обрабатывает изменения.
    Пример кода (Node.js):

    const dns = require('dns');
    function manipulateDNS() {
    dns.resolve('example.com', (err, addresses) => {
    if (err) {
      // Handle DNS resolution error
    } else {
      // Modify the resolved addresses
      addresses.push('1.2.3.4');
      dns.setServers(addresses);
    
      // Perform subsequent operations
      // ...
    }
    });
    }
    // Usage example
    manipulateDNS();