forked from mamchits/phantom
-
Notifications
You must be signed in to change notification settings - Fork 22
/
README.ru
105 lines (82 loc) · 6.46 KB
/
README.ru
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
1. Введение
Фантом (Phantom) — это i/o engine с набором модулей.
Модули выстроены в иерархию и предсталяют собой сущности несколько отличные
от привычных модулей известных HTTP серверов. В каждом из модулей реализованы
классы, экземпляры которых создаются по описанию из конфигурационного
файла. Вообще, конфигурационный файл для Фантома выглядит как декларативная
часть программы, написанной на неком языке с признаками объектной
ориентированности. Проще всего это пояснить минимальным примером:
#! /usr/bin/phantom run
setup_t module_setup = setup_module_t {
dir = "/usr/lib/phantom"
list = {
io_stream
io_stream_ipv4
io_stream_proto_echo
}
}
scheduler_t main_scheduler = scheduler_simple_t {
threads = 4
}
io_t echo_io = io_stream_ipv4_t {
proto_t echo_proto = proto_echo_t { }
proto = echo_proto
port = 9999
scheduler = main_scheduler
}
При разборе этого конфига будут созданы экземпляры классов, которые в программе
так и называются, наследование между которыми такое, как видно из конфига,
и ссылаться друг на друга они будут именно так. Т.е. io_stream_ipv4_t
действительно наследник io_stream_t, который в свою очередь наследник io_t,
а io_stream::proto_echo_t наследник io_stream::proto_t.
echo_io будет использовать для обработки запросов echo_proto, а созданными
им корутинами будет управлять main_scheduler.
Часть параметров для создания объектов берется из конфига, а часть
является умолчательными. Чтобы посмотреть их все, можно воспользоваться
командой 'phantom check <conffile>'.
Полный синтаксис конфига, соответствующий данному набору модулей, можно
увидеть по команде 'phantom syntax [modules]', где 'modules' — это '.so'
файлы модулей.
Например, для демо эхо сервера эта команда выглядит так:
'phantom syntax /usr/lib/phantom/mod_io_stream{,_ipv4,_proto_echo}.so'
2. Имеющиеся модули.
а) io_stream реализует TCP сервер (IPv4 и/или IPv6) с единственным пока
протоколом (если не считать демонстрационных) — HTTP. Простой пример
конфига: ./examples/io_stream_proto_http_handler_static.conf
Кроме handler_static, есть еще handler_proxy (обратный прокси) и
handler_fcgi. Оба эти модуля пригодны только в тех случаях, когда
и запросы, и ответы небольшие по размеру. Для других случаев аналогичные
механизмы должны быть устроены совсем по-другому. Кое-какие подробности ниже
в разделе про io_client.
б) io_benchmark предназначен для нагрузочного тестирования.
В данный момент реализовано тестирование по TCP (IPv4 и IPv6) по протоколу
HTTP. Простой пример конфига:
./examples/io_benchmark_method_stream_proto_http.conf
Рекомендуется использовать в комплекте с Яндекс танком
(https://github.com/yandex-load/yandex-tank).
в) io_client — это механизм для асинхронных вызовов по tcp или локально с
с постоянными соединениями и балансировкой. В представленном пакете
используется в io_stream::proto_http::handler_proxy и в
io_stream::proto_http::handler_fcgi. В них асинхронность io_client
не задействована никак, однако она есть и может быть использована
в других местах. Функциональность io_client::proto_fcgi реализована частично
и он нуждается в доработке.
г) SSL транспорт есть для io_stream и io_benchmark::method_stream.
Базируется на библиотеке OpenSSL. Для нагрузочного тестирования HTTPS
сервисов его функциональности достаточно, а для полноценного HTTPS сервера
кое-чего не хватает (OCSP stapling, например).
3. Использование.
Разрабатывается и используется в компании Яндекс.
4. Сборка и установка.
В дистрибутивах, базирующихся на Debian, сборка бинарных пакетов
производится естественным образом. В других после 'make all'
собранные бинарники возможно будут обнаружены в директориях
./bin и ./lib/phantom . Версии G++, с которыми ожидаема успешная
компиляция: 4.6 и более свежие. Основная архитектура — x86_64.
i386 тоже поддержиается. Можно пробовать ARM. Остальные скорее всего будут
поддерживаться при надобности.
5. Особенности реализации.
Пишется на C++ без использования каких-либо популярных и «стандартных» C++
библиотек. В связи с этим включает в себя небольшой набор «велосипедов»,
которые размещаются в директории ./pd (phantom dev) и, возможно, имеют смысл
сами по себе.