Proyek OpenSource arataga adalah prototipe kerja dari server proxy socks5 + http / 1.1 yang produktif. Menerapkan arataga berdasarkan Asio , SObjectizer dan RESTinio . Arataga sudah disebutkan beberapa bulan yang lalu sebagai contoh yang baik tentang seperti apa kode sebenarnya di SObjectizer. Bagaimanapun, adalah satu hal untuk diceritakan tentang kekuatan SObjectizer dengan ilustrasi dari contoh mainan. Ini adalah hal lain untuk dapat menunjukkan hampir kode produksi.
Sejak publikasi pertama, arataga dapat didorong dengan beban yang lebih serius. Kami dapat mengatakan bahwa kami beruntung melakukan tes skala penuh pertama.
Tes ini mengungkapkan beberapa kemacetan, yang penghapusannya, menurut saya, dapat dikutip sebagai contoh yang baik dalam menggunakan kapabilitas SObjectizer dalam situasi "di sini bukan yang kami inginkan, dan ini perlu diperbaiki secepat mungkin. "
Secara khusus, hari ini kita akan berbicara tentang fakta bahwa interaksi agen satu sama lain hanya melalui pesan asinkron bukanlah dogma. Dan dispatcher SObjectizer memengaruhi keamanan pemrograman multi-threaded tidak kalah seriusnya dengan olahpesan ini.
Implementasi interaksi sendiri dengan DNS
Hambatan pertama yang terungkap dari uji lapangan adalah prosedur resolusi nama domain.
Penolakan dari Asio-shny async_resolve
Pada versi pertama arataga, untuk menghemat waktu, kami tidak mengimplementasikan interaksi dengan DNS melalui UDP. Sebagai gantinya, kami menggunakan alat untuk penyelesaian asinkron, yang tersedia di luar kotak di Asio.
Seperti yang saya pahami, Asio menggunakan thread kerja tambahan untuk menjalankan async_resolve, di mana ia membuat panggilan sinkron reguler ke OS untuk mengubah nama domain menjadi satu set alamat IP. Dan, jika salah satu panggilan seperti itu "melambat", semua panggilan berikutnya ke async_resolve akan ditangguhkan. Selain itu, jika kita perlu menyelesaikan beberapa nama sekaligus, maka kita tidak dapat melakukannya secara paralel. Penyelesaian akan dilakukan secara berurutan.
, IP- Asio- async_resolve " ". async_resolve ( , , 35 40 , ).
, : - . DNS .
DNS :
, , DNS- UDP-, a_nameserver_interactor_t
.
, arataga.
: (mbox) -- resolve_request_t
resolve_reply_t
. a_dns_resolver_t
, : , , async_resolve .
, -- , dns_resolver arataga. " ". mbox, resolve_request. resolve_request mbox, resolve_reply. , .
, arataga .
.
-, interactor::a_nameserver_interactor_t
, DNS- UDP. nameserver_interactor UDP- DNS-.
-, lookup_conductor::a_conductor_t
, resolve_request, , , , nameserver_interactor.
conductor :)
, conductor- .
conductor. IPv4, IPv6. , dns_resolver arataga: dns_resolver IP-, IPv4, IPv6 . resolve_request_t IPv4 , dns_resolver IPv4 . resolve_request IPv6 , dns_resolver IPv6 ( IPv6 IPv4 ).
Asio- async_resolver .
DNS- , nameserver_interactor.
nameserver_interactor DNS- , A, AAAA. UDP- ( A, AAAA), .
conductor nameserver_interactor - . , nameserver_interactor IP- (IPv4 IPv6). , .
conductor / IP-? , nameserver_interactor, ?
conductor , "- " : conductor- . IPv4, -- IPv6. resolve_request mbox-.
, resolve_request . - , IPv4, -- IPv6.
. .
-- , "" multi-consumer mbox-. mbox, mbox " ?" , , . , .
conductor , . , -- :
void
a_conductor_t::so_define_agent()
{
// We want to receive only requests for our IP-version.
so_set_delivery_filter(
m_incoming_requests_mbox,
[ip_ver = m_ip_version]( const resolve_request_t & req ) {
return ip_ver == req.m_ip_version;
} );
so_subscribe( m_incoming_requests_mbox )
.event( &a_conductor_t::on_resolve );
?
-- . - , DNS-. . , - - DNS, .
acl_handler-
arataga , arataga , . , .. arataga , .
, .
, arataga one_second_timer, acl_handler- : - , .
arataga : acl_handler one_second_timer. , , .
.., 15K acl_handler-, one_second_timer. CPU.
, 15K acl_handler- one_second_timer. acl_handler- , . one_second_timer acl_handler- .
, . .
, , acl_handler-, . .
?
( ). , acl_handler- , , .
.
-, one_second_timer , SObjectizer. . , - acl_handler-, - thread-safety. , mutex-. . acl_handler-, .. thread-safety, , .
-, acl_handler-, -- , one_second_timer. , . .
, , , .
/ / one_second_timer
one_second_timer , , : acl_handler one_second_timer, -- one_second_timer.
. - thread-safety.
. mbox -- ( mbox- -) + -.
, one_second_timer .
, one_second_timer , , .
timer_provider. , io_thread . on_timer io_thread timer_consumer. timer_consumer, , timer_provider-. .., timer_consumer , timer_provider- activate_consumer, -- deactivate_consumer. timer_provider timer_consumer-.
timer_provider , one_second_timer. timer_provider timer_consumer- on_timer.
timer_consumer- acl_handler-. acl_handler- ( timer_consumer) , acl_handler timer_provider-. acl_handler timer_provider-.
, io_thread timer_provider timer_consumer- . , . thread-safety.
, SObjectizer- , thread-safety. SObjectizer- , . , , . , .
timer_provider timer_consumer . , , , . .. .
acl_handler- (.. timer_consumer-) so_evt_finish ( ), acl_handler timer_provider-. timer_provider- timer_consumer- ( , ).
timer_provider? , , acl_handler?
: timer_provider acl_handler-a. SObjectizer , . .. timer_provider timer_consumer- .
?
, ACL arataga CPU 1.5 4- .
arataga SObjectizer RESTinio. SObjectizer-.
, , SObjectizer, . - , .
Sebagai kesimpulan, saya ingin mengatakan ini: meskipun kami tidak memiliki sumber daya untuk pengembangan lebih lanjut dari OpenSource kami , namun proyek tersebut tidak ditinggalkan. Jika seseorang menemukan kesalahan, kami memperbaikinya . Jika seseorang memiliki pertanyaan , kami mencoba membantu. Terkadang kami bahkan merilis pembaruan dengan perbaikan kecil .
Jadi, jika seseorang ragu apakah akan menggunakan SObjectizer / RESTinio / json-dto untuk bekerja atau tidak, buang dan coba. Jika terjadi kesulitan atau masalah, jangan ragu untuk menghubungi kami, kami tidak akan meninggalkan Anda tanpa bantuan.