Disposability - The Twelve Factor App Methodology

Michael Di Prisco - Feb 15 - - Dev Community

Welcome back to our journey through the Twelve Factors in Software Development. In this segment, we'll explore Factor 9: Disposability. This factor introduces the concept of treating processes as disposable entities and highlights how it contributes to the resilience and reliability of your application.

Disposability: Maximize Robustness with Quick Startup and Shutdown

The Disposability factor encourages the design of applications that can start and stop quickly. Treating processes as disposable entities means that individual components of your application can be easily and rapidly replaced, contributing to fault tolerance and responsiveness.

Why It Matters

In cloud-native environments, the ability to quickly start and stop processes is crucial for maintaining high availability and responding to dynamic workloads. Disposable processes contribute to easier scaling, resilience to failures, and efficient resource utilization.

How to Implement

Design your application with the understanding that processes may need to start and stop frequently. Ensure that startup times are minimal and that processes can gracefully shut down when needed. This is particularly relevant in containerized environments and orchestration systems like Kubernetes.

Example in Action

Consider a scenario where your application needs to process messages from a queue. Instead of having a long-lived process, design your application to spin up short-lived worker processes to handle each message. This approach ensures that resources are efficiently used, and failures are isolated.

// Listen for messages in a queue
queue.on('message', (message) => {
  // Start a transaction you can rollback
  startTransaction(message);

  // Process
  processMessage(message);

  // Commit
  commitTransaction(message);
});

process.on('SIGTERM', async () => {
  console.log('Received SIGTERM. Rolling back transaction and closing connections.');
  await rollbackTransaction(message);
  await bringMessageBackInQueue(message);
  await closeConnection();
  process.exit(0);
});
Enter fullscreen mode Exit fullscreen mode

By embracing the Disposability factor, your application becomes more robust, resilient, and capable of handling varying workloads and failures gracefully.

Stay tuned for Factor 10: Dev/Prod Parity, where we'll explore the importance of maintaining similarity between development and production environments for a smoother development and deployment process.

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .