Desarrollo del proyecto arataga: un par de refactorizaciones basadas en los resultados de las pruebas de campo

El proyecto de c贸digo abierto arataga es un prototipo funcional de un servidor proxy productivo socks5 + http / 1.1. Implement茅 arataga basado en Asio , SObjectizer y RESTinio . Arataga ya se mencion贸 hace varios meses como un buen ejemplo de c贸mo se ve el c贸digo real en SObjectizer. Despu茅s de todo, una cosa es contar los puntos fuertes de SObjectizer con ilustraciones de ejemplos de juguetes. Otra muy distinta es poder mostrar casi c贸digo de producci贸n.





Desde la primera publicaci贸n, ha sido posible conducir el arataga bajo una carga m谩s seria. Podemos decir que tuvimos la suerte de realizar las primeras pruebas a gran escala.





Estas pruebas revelaron un par de cuellos de botella, cuya eliminaci贸n, me pareci贸, se puede citar como buenos ejemplos del uso de las capacidades de SObjectizer en situaciones "aqu铆 no es lo que nos gustar铆a, y esto debe solucionarse lo antes posible. "





En particular, hoy hablaremos sobre el hecho de que la interacci贸n de los agentes entre s铆 solo a trav茅s de mensajes asincr贸nicos no es un dogma. Y que los despachadores de SObjectizer influyen en la seguridad de la programaci贸n multiproceso no menos seriamente que este mensaje.





Implementaci贸n propia de interacci贸n con DNS

El primer cuello de botella que revelaron las pruebas de campo fue el procedimiento de resoluci贸n de nombres de dominio.





Rechazo 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, . - , .





En conclusi贸n, quiero decir esto: a pesar de que, aunque no tenemos los recursos para el desarrollo posterior de nuestro OpenSource , los proyectos no se abandonan. Si alguien encuentra errores, los arreglamos . Si alguien tiene preguntas , tratamos de ayudar. A veces incluso publicamos actualizaciones con peque帽as mejoras .





Por lo tanto, si alguien tiene dudas sobre si debe utilizar SObjectizer / RESTinio / json-dto para que funcione, des茅chelos e intente. En caso de dificultades o problemas, no dude en contactarnos, no lo dejaremos sin ayuda.








All Articles