|
| 1 | +export const pageTitle = 'Архитектура системы' |
| 2 | + |
| 3 | +# Архитектура Localzet Server |
| 4 | + |
| 5 | +Localzet Server представляет собой высокопроизводительный асинхронный event-driven сервер для PHP, построенный на принципах многопроцессорной обработки и неблокирующего I/O. |
| 6 | + |
| 7 | +## Концептуальная архитектура |
| 8 | + |
| 9 | +Localzet Server использует архитектуру **Master-Worker** с разделением ответственности между процессами: |
| 10 | + |
| 11 | +``` |
| 12 | +┌─────────────────────────────────────────────────────────────┐ |
| 13 | +│ Master Process │ |
| 14 | +│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ |
| 15 | +│ │ Init │ │ Monitor │ │ Signal │ │ |
| 16 | +│ │ System │ │ Workers │ │ Handler │ │ |
| 17 | +│ └──────────────┘ └──────────────┘ └──────────────┘ │ |
| 18 | +└─────────────────────────────────────────────────────────────┘ |
| 19 | + │ |
| 20 | + ┌─────────────┼─────────────┐ |
| 21 | + │ │ │ |
| 22 | + ┌──────▼─────┐ ┌────▼──────┐ ┌───▼──────┐ |
| 23 | + │ Worker 1 │ │ Worker 2 │ │ Worker N │ |
| 24 | + │ │ │ │ │ │ |
| 25 | + │ ┌──────┐ │ │ ┌──────┐ │ │ ┌──────┐ │ |
| 26 | + │ │ Event│ │ │ │ Event│ │ │ │ Event│ │ |
| 27 | + │ │ Loop │ │ │ │ Loop │ │ │ │ Loop │ │ |
| 28 | + │ └──────┘ │ │ └──────┘ │ │ └──────┘ │ |
| 29 | + │ │ │ │ │ │ |
| 30 | + │ ┌──────┐ │ │ ┌──────┐ │ │ ┌──────┐ │ |
| 31 | + │ │Socket│ │ │ │Socket│ │ │ │Socket│ │ |
| 32 | + │ │Accept│ │ │ │Accept│ │ │ │Accept│ │ |
| 33 | + │ └──────┘ │ │ └──────┘ │ │ └──────┘ │ |
| 34 | + └────────────┘ └───────────┘ └──────────┘ |
| 35 | +``` |
| 36 | + |
| 37 | +## Основные компоненты |
| 38 | + |
| 39 | +### 1. Master Process (Мастер-процесс) |
| 40 | + |
| 41 | +Мастер-процесс является координатором всей системы и выполняет следующие функции: |
| 42 | + |
| 43 | +- **Инициализация системы**: Проверка окружения, загрузка конфигурации, создание слушающих сокетов |
| 44 | +- **Управление процессами**: Создание и мониторинг дочерних процессов (workers) |
| 45 | +- **Обработка сигналов**: Управление жизненным циклом через POSIX сигналы |
| 46 | +- **Сбор статистики**: Агрегация метрик от всех worker процессов |
| 47 | + |
| 48 | +**Характеристики:** |
| 49 | +- Не обрабатывает клиентские запросы |
| 50 | +- Работает в режиме мониторинга |
| 51 | +- Поддерживает плавную перезагрузку без простоя сервиса |
| 52 | + |
| 53 | +### 2. Worker Processes (Рабочие процессы) |
| 54 | + |
| 55 | +Worker процессы — это дочерние процессы, которые фактически обрабатывают входящие соединения: |
| 56 | + |
| 57 | +- **Обработка соединений**: Принятие и обработка TCP/UDP соединений |
| 58 | +- **Event Loop**: Работа с событийным циклом для неблокирующего I/O |
| 59 | +- **Выполнение бизнес-логики**: Обработка запросов через протоколы прикладного уровня |
| 60 | +- **Управление памятью**: Изоляция памяти между процессами |
| 61 | + |
| 62 | +**Ключевые особенности:** |
| 63 | +- Полная изоляция памяти между процессами |
| 64 | +- Независимая работа событийных циклов |
| 65 | +- Автоматическое пересоздание при критических ошибках |
| 66 | + |
| 67 | +### 3. Event Loop (Событийный цикл) |
| 68 | + |
| 69 | +Event Loop — это ядро асинхронной обработки: |
| 70 | + |
| 71 | +``` |
| 72 | +┌─────────────────────────────────────┐ |
| 73 | +│ Event Loop │ |
| 74 | +│ │ |
| 75 | +│ ┌──────────┐ ┌──────────────┐ │ |
| 76 | +│ │ Timers │ │ Streams │ │ |
| 77 | +│ │ │ │ │ │ |
| 78 | +│ │ - Delay │ │ - Readable │ │ |
| 79 | +│ │ - Repeat │ │ - Writable │ │ |
| 80 | +│ └──────────┘ └──────────────┘ │ |
| 81 | +│ │ |
| 82 | +│ ┌──────────┐ ┌──────────────┐ │ |
| 83 | +│ │ Signals │ │ Suspension │ │ |
| 84 | +│ │ │ │ │ │ |
| 85 | +│ │ - SIGINT │ │ - Fiber │ │ |
| 86 | +│ │ - SIGTERM│ │ - Coroutine │ │ |
| 87 | +│ └──────────┘ └──────────────┘ │ |
| 88 | +│ │ |
| 89 | +└─────────────────────────────────────┘ |
| 90 | +``` |
| 91 | + |
| 92 | +**Поддерживаемые реализации:** |
| 93 | + |
| 94 | +1. **Linux Event Loop** (по умолчанию для Unix) |
| 95 | + - Использует libuv, libev или libevent при наличии |
| 96 | + - Fallback на stream_select() если расширения недоступны |
| 97 | + - Оптимальная производительность на Unix-системах |
| 98 | + |
| 99 | +2. **Windows Event Loop** |
| 100 | + - Адаптированная реализация для Windows |
| 101 | + - Использует stream_select() и Windows-специфичные API |
| 102 | + |
| 103 | +3. **Swoole Event Loop** |
| 104 | + - Использует встроенный событийный цикл Swoole |
| 105 | + - Максимальная производительность при наличии расширения |
| 106 | + |
| 107 | +4. **Swow Event Loop** |
| 108 | + - Современная реализация на базе Swow |
| 109 | + - Поддержка coroutines и fibers |
| 110 | + |
| 111 | +## Многоуровневая архитектура протоколов |
| 112 | + |
| 113 | +Localzet Server использует двухуровневую модель протоколов: |
| 114 | + |
| 115 | +### Транспортный уровень (Transport Layer) |
| 116 | + |
| 117 | +Отвечает за передачу данных по сети: |
| 118 | + |
| 119 | +- **TCP** — надежная потоковая передача данных |
| 120 | +- **UDP** — дейтаграммная передача без установки соединения |
| 121 | +- **Unix Socket** — локальная межпроцессная коммуникация |
| 122 | +- **SSL/TLS** — зашифрованная передача поверх TCP |
| 123 | + |
| 124 | +### Прикладной уровень (Application Layer) |
| 125 | + |
| 126 | +Определяет формат данных и правила их обработки: |
| 127 | + |
| 128 | +- **HTTP/HTTPS** — стандартный веб-протокол |
| 129 | +- **WebSocket** — двунаправленная коммуникация |
| 130 | +- **Text** — текстовый протокол с разделителем |
| 131 | +- **Frame** — фреймовая структура данных |
| 132 | +- **Custom** — пользовательские протоколы |
| 133 | + |
| 134 | +## Поток данных в системе |
| 135 | + |
| 136 | +``` |
| 137 | +Клиент |
| 138 | + │ |
| 139 | + │ TCP Connection |
| 140 | + ▼ |
| 141 | +┌─────────────────┐ |
| 142 | +│ Listening │ |
| 143 | +│ Socket │ |
| 144 | +└─────────────────┘ |
| 145 | + │ |
| 146 | + │ Accept Connection |
| 147 | + ▼ |
| 148 | +┌─────────────────┐ |
| 149 | +│ Event Loop │ |
| 150 | +│ (Epoll/Select) │ |
| 151 | +└─────────────────┘ |
| 152 | + │ |
| 153 | + │ Data Available |
| 154 | + ▼ |
| 155 | +┌─────────────────┐ |
| 156 | +│ Transport │ |
| 157 | +│ Protocol │ |
| 158 | +│ (TCP/UDP) │ |
| 159 | +└─────────────────┘ |
| 160 | + │ |
| 161 | + │ Raw Data |
| 162 | + ▼ |
| 163 | +┌─────────────────┐ |
| 164 | +│ Application │ |
| 165 | +│ Protocol │ |
| 166 | +│ (HTTP/WS/etc) │ |
| 167 | +└─────────────────┘ |
| 168 | + │ |
| 169 | + │ Decoded Data |
| 170 | + ▼ |
| 171 | +┌─────────────────┐ |
| 172 | +│ Business │ |
| 173 | +│ Logic │ |
| 174 | +│ (onMessage) │ |
| 175 | +└─────────────────┘ |
| 176 | + │ |
| 177 | + │ Response |
| 178 | + ▼ |
| 179 | +┌─────────────────┐ |
| 180 | +│ Protocol │ |
| 181 | +│ Encoding │ |
| 182 | +└─────────────────┘ |
| 183 | + │ |
| 184 | + │ Encoded Data |
| 185 | + ▼ |
| 186 | +┌─────────────────┐ |
| 187 | +│ Transport │ |
| 188 | +│ Sending │ |
| 189 | +└─────────────────┘ |
| 190 | + │ |
| 191 | + │ Send to Client |
| 192 | + ▼ |
| 193 | +Клиент |
| 194 | +``` |
| 195 | + |
| 196 | +## Модель памяти |
| 197 | + |
| 198 | +### Изоляция процессов |
| 199 | + |
| 200 | +Каждый worker процесс имеет полностью изолированную память: |
| 201 | + |
| 202 | +``` |
| 203 | +Master Process Worker 1 Worker 2 Worker 3 |
| 204 | +┌─────────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ |
| 205 | +│ Static Vars │ │Memory │ │Memory │ │Memory │ |
| 206 | +│ Config │ │Isolated │ │Isolated │ │Isolated │ |
| 207 | +│ Monitoring │ │ │ │ │ │ │ |
| 208 | +└─────────────┘ └──────────┘ └──────────┘ └──────────┘ |
| 209 | + │ │ │ │ |
| 210 | + └─────────────────────┴─────────────────┴─────────────────┘ |
| 211 | + Shared Socket (SO_REUSEPORT) |
| 212 | +``` |
| 213 | + |
| 214 | +### Управление соединениями |
| 215 | + |
| 216 | +Каждое соединение хранится в памяти соответствующего worker процесса: |
| 217 | + |
| 218 | +```php |
| 219 | +Worker Process Memory: |
| 220 | +├── $server->connections[id] → TcpConnection |
| 221 | +│ ├── $sendBuffer // Буфер отправки |
| 222 | +│ ├── $recvBuffer // Буфер приема |
| 223 | +│ ├── $protocol // Протокол прикладного уровня |
| 224 | +│ └── $context // Контекст соединения |
| 225 | +└── Static cache |
| 226 | + ├── Request cache // Кеш запросов |
| 227 | + └── Protocol cache // Кеш протоколов |
| 228 | +``` |
| 229 | + |
| 230 | +## Масштабируемость |
| 231 | + |
| 232 | +### Горизонтальное масштабирование |
| 233 | + |
| 234 | +- **Многопроцессорность**: Каждый CPU core может обслуживать отдельный процесс |
| 235 | +- **SO_REUSEPORT**: Распределение соединений между процессами на уровне ядра |
| 236 | +- **Load Balancing**: Автоматическая балансировка через kernel |
| 237 | + |
| 238 | +### Вертикальное масштабирование |
| 239 | + |
| 240 | +- **Event-driven I/O**: Обработка тысяч соединений в одном процессе |
| 241 | +- **Memory efficiency**: Минимальное потребление памяти на соединение |
| 242 | +- **CPU optimization**: Эффективное использование процессорного времени |
| 243 | + |
| 244 | +## Безопасность |
| 245 | + |
| 246 | +### Изоляция процессов |
| 247 | + |
| 248 | +- Каждый процесс работает независимо |
| 249 | +- Критическая ошибка в одном процессе не влияет на другие |
| 250 | +- Автоматическое восстановление после сбоев |
| 251 | + |
| 252 | +### Управление привилегиями |
| 253 | + |
| 254 | +- Возможность запуска worker процессов от непривилегированного пользователя |
| 255 | +- Drop privileges после привязки к портам |
| 256 | +- Изоляция от системных ресурсов |
| 257 | + |
| 258 | +### Валидация данных |
| 259 | + |
| 260 | +- Проверка всех входящих данных |
| 261 | +- Ограничение размера пакетов |
| 262 | +- Защита от переполнения буферов |
| 263 | + |
| 264 | +## Производительность |
| 265 | + |
| 266 | +### Ключевые оптимизации |
| 267 | + |
| 268 | +1. **Zero-copy операции** где возможно |
| 269 | +2. **Буферизация I/O** для минимизации системных вызовов |
| 270 | +3. **Кеширование** парсированных данных |
| 271 | +4. **Пул соединений** для повторного использования ресурсов |
| 272 | +5. **Оптимизация памяти** через эффективные структуры данных |
| 273 | + |
| 274 | +### Метрики производительности |
| 275 | + |
| 276 | +- **Пропускная способность**: До сотен тысяч запросов в секунду |
| 277 | +- **Латентность**: Микросекунды на обработку запроса |
| 278 | +- **Параллельность**: Десятки тысяч одновременных соединений на процесс |
| 279 | +- **Использование памяти**: Минимальные накладные расходы на соединение |
| 280 | + |
| 281 | +<Button |
| 282 | + href="/architecture/process-model" |
| 283 | + variant="text" |
| 284 | + arrow="right" |
| 285 | + children="Детали модели процессов" |
| 286 | +/> |
| 287 | + |
0 commit comments