Desenvolvimento do projeto arataga: algumas refatorações baseadas nos resultados dos testes de campo

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 foi mencionado 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.








All Articles