aratagaプロジェクトの開発:フィールドテストの結果に基づくいくつかのリファクタリング

オープンソースプロジェクトaratagaは、生産的なsocks5 + http /1.1プロキシサーバーの実用的なプロトタイプです。基づいて実装arataga ASIOSObjectizerRESTinioAratagaは、SObjectizerで実際のコードがどのように表示されるを示す良い例として数か月すでに言及されています。結局のところ、おもちゃの例からのイラストでSObjectizerの長所を伝えることは1つのことです。ほぼ本番コードを表示できるのはまったく別のことです。





最初の出版以来、より深刻な負荷の下でアラタガを運転することが可能になりました。最初の本格的なテストを実施できたのは幸運だったと言えます。





これらのテストにより、いくつかのボトルネックが明らかになりました。その解消は、「これは私たちが望んでいることではなく、できるだけ早く修正する必要がある」状況でSObjectizerの機能を使用する良い例として引用できます。 「」





特に、今日は、非同期メッセージのみを介したエージェントの相互作用が教義ではないという事実について説明します。そして、そのSObjectizerディスパッチャは、このメッセージングと同じくらい深刻にマルチスレッドプログラミングの安全性に影響を与えます。





DNSとの相互作用の独自の実装

フィールドテストで明らかになった最初のボトルネックは、ドメイン名の解決手順でした。





Asioからの拒否-shnyasync_resolve

aratagaの最初のバージョンでは、時間を節約するために、UDPを介したDNSとの対話を実装しませんでした。代わりに、非同期解決用のツールを使用しました。これらのツールは、Asioですぐに使用できます。





私が理解しているように、Asioは追加の作業スレッドを使用してasync_resolveを実行します。このスレッドで、OSを定期的に同期呼び出しして、ドメイン名をIPアドレスのセットに変換します。そして、そのような呼び出しの1つが「遅くなる」と、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, . - , .





結論として、私はこれを言いたいと思います。OpenSourceをさらに開発するためのリソースがないにもかかわらず、プロジェクトが放棄されることはありません。誰かが間違い見つけた場合、私たちはそれらを修正します誰かが質問をするならば、我々は助けようとします。マイナーな改善を加えたアップデートをリリースすることもあります





したがって、誰かがSObjectizer / RESTinio / json-dtoを機能させるかどうかについて疑問がある場合は、それらを破棄して試してください。問題や問題が発生した場合は、お気軽にお問い合わせください。サポートなしでお任せすることはありません。








All Articles