> For the complete documentation index, see [llms.txt](https://mominur.gitbook.io/mominur-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mominur.gitbook.io/mominur-notes/system-design/reliability.md).

# Reliability

একটি **Software** তৈরি করার সময়, **Reliability** অন্যতম গুরুত্বপূর্ণ বিষয়। একটি সিস্টেম যত বেশি **Reliable**, তত বেশি এটি **consistent performance** দিতে পারবে, কম **downtime** থাকবে, এবং ব্যবহারকারীরা তত বেশি এটি ব্যবহার করতে স্বাচ্ছন্দ্যবোধ করবে।

Reliability মানে হচ্ছে, একটি **System** নির্দিষ্ট সময়ের মধ্যে নির্দিষ্ট কাজ নির্ভুলভাবে করবে, ব্যর্থতার সম্ভাবনা কম থাকবে এবং ব্যবহারকারীদের সঠিক **output** দেবে। এটি নির্ধারণ করে যে, একটি **System** কতটুকু স্থিতিশীল এবং নির্ভরযোগ্য।

***

### **Reliability কেন গুরুত্বপূর্ণ?**

একটি **Software System** যদি **reliable** না হয়, তাহলে অনেক সমস্যা দেখা দিতে পারে, যেমন:\
**User Frustration:** ব্যবহারকারীরা **bug** বা **downtime** নিয়ে বিরক্ত হবে।\
**Data Loss:** সিস্টেম Crash হলে **important data** হারিয়ে যেতে পারে।\
**Financial Loss:** **E-commerce** বা **banking system** এ **downtime** হলে প্রতিষ্ঠান অর্থনৈতিকভাবে ক্ষতিগ্রস্ত হতে পারে।\
**Security Issues:** **Unreliable system** এ **security vulnerabilities** থাকতে পারে, যা **hacker** দের জন্য সুবিধাজনক।

***

### **System Design এ Reliability বাড়ানোর উপায়**

#### **১. Fault Tolerance**

একটি **System** কখনোই ১০০% নির্ভুল হবে না। কিন্তু যদি এটি **fault-tolerant** হয়, তাহলে **hardware failure, network issues বা software bugs** থাকলেও এটি কাজ চালিয়ে যাবে।

**Example:** ধরুন, আপনি একটি **web application** বানাচ্ছেন, যেখানে **database** যদি কোনো কারণে কাজ করা বন্ধ করে দেয়, তাহলে **backup database** থেকে তথ্য নিতে পারলে সিস্টেম **reliable** হবে।

**Implementation in Python:**

{% code lineNumbers="true" %}

```python
import random

def get_data_from_primary():
    """Primary Database থেকে Data আনার চেষ্টা"""
    if random.choice([True, False]):  
        raise Exception("Primary DB Down!")
    return "Data from Primary DB"

def get_data_from_backup():
    """Backup Database থেকে Data আনার চেষ্টা"""
    return "Data from Backup DB"

def fetch_data():
    """Fault-Tolerant Data Fetching"""
    try:
        return get_data_from_primary()
    except:
        return get_data_from_backup()

print(fetch_data())
```

{% endcode %}

এই **code snippet** দেখায়, যদি **primary database** কাজ না করে, তাহলে **backup database** থেকে তথ্য আনা হবে। এভাবে **redundancy** যোগ করে **reliability** নিশ্চিত করা যায়।

***

#### **২. Redundancy and Replication**

একটি **System** কে **reliable** করার জন্য **redundancy** থাকা জরুরি। যদি একটি **server** ব্যর্থ হয়, তাহলে আরেকটি **backup server** চালু থাকবে।

**Example:**

* **Google Drive, Dropbox**: একাধিক সার্ভারে ডাটা সংরক্ষণ করে, যাতে কোনো **server** ব্যর্থ হলেও ব্যবহারকারী তার ডাটা হারায় না।
* **RAID (Redundant Array of Independent Disks)**: একাধিক **hard disk** ব্যবহার করে **data loss** প্রতিরোধ করে।

***

#### **৩. Monitoring and Logging**

একটি **System** যদি **self-monitoring** হয়, তাহলে এটি আগেই সম্ভাব্য সমস্যাগুলো ধরতে পারবে এবং **downtime** এড়াতে পারবে।

**Example:**

* **Application Logs:** যখন **error** ঘটে, তা **log file** এ সংরক্ষণ করা হয়, যা **developer** দের সমস্যার **root cause** খুঁজতে সাহায্য করে।
* **Health Checks:** সার্ভারের **CPU usage, memory usage, response time** পর্যবেক্ষণ করা হয়।

**Python Logging Example:**

{% code lineNumbers="true" %}

```python
import logging

logging.basicConfig(filename="app.log", level=logging.INFO)

def process_data(data):
    try:
        result = data / 2
        logging.info("Processing successful.")
        return result
    except Exception as e:
        logging.error(f"Error: {e}")

print(process_data(10))
print(process_data(0))  # Error log হবে
```

{% endcode %}

এই **script** এ **errors** গুলো **log file** এ সংরক্ষণ হয়, যা **system reliability** বাড়াতে সাহায্য করে।

***

#### **৪. Graceful Degradation**

যদি কোনো **feature** ব্যর্থ হয়, তাহলে পুরো **system** যেন বন্ধ না হয়ে যায়, সেটাই হচ্ছে **graceful degradation**।

**Example:**

* **E-commerce Website:** যদি **payment system** কাজ না করে, তাহলে যেন কমপক্ষে **product browsing** চালু থাকে।
* **Streaming Service:** যদি **HD streaming** সম্ভব না হয়, তাহলে যেন **low-quality streaming** চালু থাকে।

***

#### **৫. Auto-Scaling**

একটি **System** যদি **dynamically scale** হতে পারে, তাহলে এটি **high traffic** সামলাতে পারবে এবং **crash** করবে না।

**Example:**

* **Netflix, YouTube:** বেশি মানুষ **video stream** করলে সার্ভার **auto-scale** হয়, যাতে **server overload** না হয়।
* **AWS, Google Cloud:** যদি বেশি **traffic** আসে, তাহলে নতুন **server instance** তৈরি হয়।

***

**Reliability** হলো একটি **System** এর **backbone**। এটি নিশ্চিত করে যে, **software system** নির্ভরযোগ্য, ব্যবহারকারীদের জন্য উপযোগী এবং যেকোনো ধরনের **failure** প্রতিরোধ করতে সক্ষম। আপনি যদি একটি **highly reliable system** তৈরি করতে চান, তাহলে অবশ্যই এই বিষয়গুলোকে গুরুত্ব দিতে হবে।
