O projeto OpenSource arataga é um protótipo funcional de um servidor proxy socks5 + http / 1.1 produtivo. Arataga implementado baseado em Asio , SObjectizer e RESTinio . Arataga já foi mencionado há vários meses como um bom exemplo de como é o código real no SObjectizer. Afinal, é uma coisa a dizer sobre os pontos fortes do SObjectizer com ilustrações de exemplos de brinquedos. Outra é ser capaz de mostrar quase o código de produção.
Desde a primeira publicação, foi possível conduzir o arataga sob uma carga mais séria. Podemos dizer que tivemos a sorte de realizar os primeiros testes em escala real.
Esses testes revelaram alguns gargalos, a eliminação dos quais, me pareceu, podem ser citados como bons exemplos do uso das capacidades do SObjectizer em situações "aqui não é o que gostaríamos, e isso precisa ser corrigido o mais rápido possível. "
Em particular, hoje falaremos sobre o fato de que a interação dos agentes entre si apenas por meio de mensagens assíncronas não é um dogma. E os despachantes do SObjectizer influenciam a segurança da programação multithread não menos seriamente do que esta mensagem.
Implementação própria de interação com DNS
O primeiro gargalo que os testes de campo revelaram foi o procedimento de resolução de nomes de domínio.
Recusa de Asio-shny async_resolve
arataga DNS UDP. , Asio .
, Asio async_resolve , IP-. , "", async_resolve. , , . .
, 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, . - , .
Para concluir, quero dizer o seguinte: apesar de não termos os recursos para o futuro desenvolvimento do nosso OpenSource , os projetos não são abandonados. Se alguém encontrar erros, nós os consertamos . Se alguém tiver dúvidas , tentamos ajudar. Às vezes, até lançamos atualizações com pequenas melhorias .
Portanto, se alguém tiver dúvidas sobre se deve ou não levar o SObjectizer / RESTinio / json-dto para o trabalho, descarte-os e tente. Em caso de dificuldades ou problemas, não hesite em contactar-nos, não o deixaremos sem ajuda.