Entwicklung des Arataga-Projekts: einige Umgestaltungen basierend auf den Ergebnissen von Feldtests

Das OpenSource-Projekt arataga ist ein funktionierender Prototyp eines produktiven Socks5 + http / 1.1-Proxyservers. Implementierte Arataga basierend auf Asio , SObjectizer und RESTinio . Arataga wurde bereits vor einigen Monaten als gutes Beispiel dafür erwähnt, wie echter Code in SObjectizer aussieht. Schließlich ist es eine Sache, anhand von Abbildungen aus Spielzeugbeispielen über die Stärken von SObjectizer zu berichten. Es ist etwas ganz anderes, fast Produktionscode anzeigen zu können.





Seit der ersten Veröffentlichung war es möglich, die Arataga unter einer ernsteren Last zu fahren. Wir können sagen, dass wir das Glück hatten, die ersten Tests in vollem Umfang durchzuführen.





Diese Tests ergaben einige Engpässe, deren Beseitigung meines Erachtens als gutes Beispiel für die Verwendung der Funktionen von SObjectizer in Situationen angeführt werden kann. "Hier ist nicht das, was wir möchten, und dies muss so schnell wie möglich behoben werden." ""





Insbesondere werden wir heute darüber sprechen, dass die Interaktion von Agenten untereinander nur durch asynchrone Nachrichten kein Dogma ist. Und dass SObjectizer-Dispatcher die Sicherheit der Multithread-Programmierung nicht weniger stark beeinflussen als dieses Messaging.





Eigene Implementierung der Interaktion mit DNS

Der erste Engpass, den die Feldtests ergaben, war das Verfahren zur Auflösung von Domänennamen.





Ablehnung von 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, . - , .





Abschließend möchte ich Folgendes sagen: Obwohl wir zwar nicht über die Ressourcen für die Weiterentwicklung unserer OpenSource verfügen , werden die Projekte dennoch nicht aufgegeben. Wenn jemand Fehler findet, beheben wir diese . Wenn jemand Fragen hat , versuchen wir zu helfen. Manchmal veröffentlichen wir sogar Updates mit geringfügigen Verbesserungen .





Wenn also jemand Zweifel hat, ob er SObjectizer / RESTinio / json-dto zur Arbeit bringen soll oder nicht, verwerfen Sie ihn und versuchen Sie es. Bei Schwierigkeiten oder Problemen können Sie sich gerne an uns wenden. Wir werden Sie nicht ohne Hilfe lassen.








All Articles