Développement du projet Arataga: quelques refactorisations basées sur les résultats d'essais terrain

Le projet OpenSource arataga est un prototype fonctionnel d'un serveur proxy socks5 + http / 1.1 productif. Implémentation d'arataga basée sur Asio , SObjectizer et RESTinio . Arataga a déjà été mentionné il y a plusieurs mois comme un bon exemple de ce à quoi ressemble le vrai code dans SObjectizer. Après tout, c'est une chose à raconter sur les atouts de SObjectizer avec des illustrations tirées d'exemples de jouets. C'en est une autre de pouvoir afficher presque du code de production.





Depuis la première publication, il est possible de conduire l'arataga sous une charge plus sérieuse. On peut dire que nous avons eu la chance de réaliser les premiers tests grandeur nature.





Ces tests ont révélé quelques goulots d'étranglement, dont l'élimination, me semble-t-il, peut être citée comme de bons exemples d'utilisation des capacités de SObjectizer dans des situations «ce n'est pas ce que nous voudrions, et cela doit être corrigé le plus tôt possible. "





En particulier, nous parlerons aujourd'hui du fait que l'interaction des agents entre eux uniquement à travers des messages asynchrones n'est pas un dogme. Et que les répartiteurs SObjectizer n'influencent pas moins sérieusement la sécurité de la programmation multithread que cette messagerie.





Propre implémentation de l'interaction avec DNS

Le premier goulot d'étranglement révélé par les tests sur le terrain était la procédure de résolution de nom de domaine.





Refus d'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, . - , .





En conclusion, je veux dire ceci: malgré le fait que si nous n'avons pas les ressources pour le développement ultérieur de notre OpenSource , les projets ne sont néanmoins pas abandonnés. Si quelqu'un trouve des erreurs, nous les corrigeons . Si quelqu'un a des questions , nous essayons de l'aider. Parfois, nous publions même des mises à jour avec des améliorations mineures .





Donc, si quelqu'un a des doutes sur l'opportunité de faire fonctionner SObjectizer / RESTinio / json-dto, alors jetez-le et essayez. En cas de difficultés ou de problèmes, n'hésitez pas à nous contacter, nous ne vous laisserons pas sans aide.








All Articles