SObjectizer-5.5の4幎間の開発。 この間にSObjectizerはどのように倉曎されたしたか

5.5ブランチ内のSObjectizerの最初のバヌゞョンは、4幎以䞊前-2014幎10月䞊旬にリリヌスされたした。 そしお今日、次のバヌゞョンが5.5.23ずいう番号でリリヌスされたした 。これは、おそらくSObjectizer-5.5の歎史を終わらせるでしょう。 私の意芋では、これは過去4幎間に䜕が行われたかを振り返っお芋る絶奜の機䌚です。

この蚘事では、最も重芁で重芁な倉曎ずむノベヌションを抜象的に分析しようずしたす远加されたもの、理由、SObjectizer自䜓たたはその䜿甚にどのように圱響したか。

おそらく誰かが考叀孊の芳点からそのような物語に興味を持぀でしょう。 そしおおそらく、誰かが、C ++甚の独自のアクタヌフレヌムワヌクの開発のような疑わしい冒険を阻止されるでしょう。

叀いC ++コンパむラの圹割に関する少し叙情的な䜙談


SObjectizer-5の歎史は2010幎半ばに始たりたした。 同時に、すぐにC ++ 0xに泚目したした。 すでに2011幎に、SObjectizer-5の最初のバヌゞョンが補品コヌドの蚘述に䜿甚され始めたした。 そのずき、通垞のC ++ 11をサポヌトするコンパむラがなかったこずは明らかです。

長い間、「modern C ++」のすべおの機胜を完党に䜿甚するこずはできたせんでした可倉長テンプレヌト、noexcept、constexprなど。これはSObjectizer APIに圱響を䞎えるだけでした。 そしお、それは非垞に長い間圱響を及がしたした。 したがっお、機胜の説明を読むずきに「なぜ以前に行われなかったのか」ずいう質問がある堎合、この質問に察する答えは「以前は䞍可胜だったから」である可胜性が最も高いです。

過去にSObjectizer-5.5で䜕が衚瀺および/たたは倉曎されたしたか


このセクションでは、SObjectizerに倧きな圱響を䞎えた倚くの機胜に぀いお説明したす。 このリストの順序はランダムであり、説明されおいる機胜の「重芁性」や「重み」ずは関係ありたせん。

so_5 :: rt名前空間の拒吊


どうした


最初に、5番目のSObjectizerでは、SObjectizerランタむムに関連するすべおがso_5 :: rt名前空間内で定矩されたした。 たずえば、so_5 :: rt :: environment_t、so_5 :: rt :: agent_t、so_5 :: rt :: message_tなどがありたした。 たずえば、SO-5.5.0の埓来のHelloWorldの䟋で芋るこずができるもの

#include <so_5/all.hpp> class a_hello_t : public so_5::rt::agent_t { public: a_hello_t( so_5::rt::environment_t & env ) : so_5::rt::agent_t( env ) {} void so_evt_start() override { std::cout << "Hello, world! This is SObjectizer v.5." << std::endl; so_environment().stop(); } void so_evt_finish() override { std::cout << "Bye! This was SObjectizer v.5." << std::endl; } }; int main() { try { so_5::launch( []( so_5::rt::environment_t & env ) { env.register_agent_as_coop( "coop", new a_hello_t( env ) ); } ); } catch( const std::exception & ex ) { std::cerr << "Error: " << ex.what() << std::endl; return 1; } return 0; } 

略語「rt」はランタむムを衚したす。 そしお、レコヌド "so_5 :: rt"は、 "so_5 ::ランタむム"よりもはるかに優れおおり、実甚的であるように思われたした。

しかし、倚くの人にずっお「rt」は「リアルタむム」に過ぎず、他には䜕もないこずが刀明したした。 たた、「ランタむム」の略語ずしお「rt」を䜿甚するず、感情が倧きく損なわれるため、RuNetでのSObjectizerのバヌゞョンのアナりンスが、「リアルタむム」以倖の「rt」の蚱可されない解釈をテヌマにホリバヌに倉わるこずがありたす。

結局、私たちはそれにうんざりしおいたす。 そしお、so_5 :: rt名前空間の準備を解陀したした。

䜕になったの


「so_5 :: rt」内で定矩されたすべおのものは、単に「so_5」に切り替わりたした。 その結果、同じHelloWorldは次のようになりたす。

 #include <so_5/all.hpp> class a_hello_t : public so_5::agent_t { public: a_hello_t( context_t ctx ) : so_5::agent_t( ctx ) {} void so_evt_start() override { std::cout << "Hello, world! This is SObjectizer v.5 (" << SO_5_VERSION << ")" << std::endl; so_environment().stop(); } void so_evt_finish() override { std::cout << "Bye! This was SObjectizer v.5." << std::endl; } }; int main() { try { so_5::launch( []( so_5::environment_t & env ) { env.register_agent_as_coop( "coop", env.make_agent<a_hello_t>() ); } ); } catch( const std::exception & ex ) { std::cerr << "Error: " << ex.what() << std::endl; return 1; } return 0; } 

しかし、「so_5 :: rt」の叀い名前は、通垞のstypedefsの䜿甚を通じお、ずにかく利甚可胜のたたでした。 したがっお、SO-5.5の最初のバヌゞョン甚に蚘述されたコヌドは、SO-5.5の最近のバヌゞョンでも機胜したす。

最埌に、so_5 :: rt名前空間はバヌゞョン5.6で削陀されたす。

どのような圱響がありたしたか


おそらく、SObjectizerのコヌドは読みやすくなりたした。 それでも、so_5 :: sendは、so_5 :: rt :: sendよりも適切に認識されたす。

さお、ここでは、SObjectizer開発者ず同様に、頭痛の皮が枛りたした。 䞀床にSObjectizerのアナりンスの呚りに空っぜのチャットず䞍必芁な掚論が倚すぎたした「なぜC ++のアクタヌが必芁なのか」ずいう質問から始たり、「゚ンティティに名前を付けるためにPascalCaseを䜿甚しないのはなぜか」で終わる。 1぀の可燃性のテヌマが少なくなり、良かった:)

簡玠化されたメッセヌゞ送信ずメッセヌゞハンドラヌの進化


どうした


SObjectizer-5.5の最初のバヌゞョンでも、通垞のメッセヌゞはdeliver_messageメ゜ッドを䜿甚しお送信されたしたが、これは受信者のmboxで呌び出す必芁がありたした。 保留䞭たたは定期的なメッセヌゞを送信するには、environment_t型のオブゞェクトでsingle_timer / schedule_timerを呌び出す必芁がありたした。 たた、別の゚ヌゞェントにすでに同期リク゚ストを送信するには、通垞、䞀連の操䜜党䜓が必芁でした。 ここで、たずえば、4幎前にどのように芋えたかstd :: make_uniqueはC ++ 11ではただ利甚できたせんでしたが、すでに䜿甚されおいたす

 //   . mbox->deliver_message(std::make_unique<my_message>(...)); //   . env.single_timer(std::make_unique<my_message>(...), mbox, std::chrono::seconds(2)); //   . auto timer_id = env.schedule_timer( std::make_unique<my_message>(...), mbox, std::chrono::seconds(2), std::chrono::seconds(5)); //         10 . auto reply = mbox->get_one<std::string>() .wait_for(std::chrono::seconds(10)) .sync_get(std::make_unique<my_message>(...)); 

さらに、SObjectizerのメッセヌゞハンドラヌの圢匏はバヌゞョン5.5に進化したした。 最初にSObjectizer-5を䜿甚する堎合、すべおのハンドラヌの圢匏は次のずおりです。

 void evt_handler(const so_5::event_data_t<Msg> & cmd); 

時間が経぀に぀れお、蚱可される圢匏にさらにいく぀かが远加されたした。

 //  ,  Msg --  ,   . ret_value evt_handler(const Msg & msg); ret_value evt_handler(Msg msg); //  ,     . ret_value evt_handler(); 

以来、新しいハンドラ圢匏が広く䜿甚されるようになりたした 垞に「const so_5 :: event_data_t <Msg>」をペむントするこずは、ただ楜しみです。 しかし、䞀方で、より単玔な圢匏はテンプレヌト゚ヌゞェントにずっお䜿いやすいものではありたせんでした。 䟋

 template<typename Msg_To_Process> class my_actor : public so_5::agent_t { void on_receive(const Msg_To_Process & msg) { // Oops! ... } }; 

このようなテンプレヌト゚ヌゞェントは、Msg_To_Processがメッセヌゞタむプであり、シグナルタむプではない堎合にのみ機胜したす。

䜕になったの


ブランチ5.5では、送信機胜のファミリヌが登堎し、倧幅に進化したした。 これを行うには、たず、可倉長テンプレヌトをサポヌトするコンパむラヌを自由に䜿甚する必芁がありたした。 そしお、第二に、䞀般的な可倉匕数テンプレヌトずsend-functionsの最初のバヌゞョンの䞡方で䜜業する十分な経隓を蓄積したす。 さらに、さたざたなコンテキストで通垞の゚ヌゞェント、アドホック゚ヌゞェント、テンプレヌトクラスによっお実装される゚ヌゞェント、および䞀般的な倖郚゚ヌゞェント。 mchainsでsend-functionsを䜿甚する堎合を含めたす以䞋で説明したす。

送信関数に加えお、゚ヌゞェント間の同期盞互䜜甚のために蚭蚈されたrequest_future / request_value関数が登堎したした。

その結果、メッセヌゞの送信は次のようになりたした。

 //   . so_5::send<my_message>(mbox, ...); //   . so_5::send_delayed<my_message>(env, mbox, std::chrono::seconds(2), ...); //   . auto timer_id = so_5::send_periodic<my_message>( env, mbox, std::chrono::seconds(2), std::chrono::seconds(5), ...); //         10 . auto reply =so_5::request_value<std::string, my_message>(mbox, std::chrono::seconds(10), ...); 

メッセヌゞハンドラの別の可胜な圢匏が远加されたした。 さらに、SObjectizerの次のメゞャヌリリヌスでメむンそしお、おそらく唯䞀のずしお残されるのは、この圢匏です。 これは次の圢匏です。

 ret_type evt_handler(so_5::mhood_t<Msg> cmd); 

Msgは、メッセヌゞタむプたたはシグナルタむプのいずれかです。

この圢匏は、通垞のクラスの圢匏の゚ヌゞェントずテンプレヌトクラスの圢匏の゚ヌゞェントの間の境界を曖昧にするだけではありたせん。 ただし、メッセヌゞ/シグナルの転送も簡玠化されたす送信機胜ファミリのおかげです。

 void my_agent::on_msg(mhood_t<Some_Msg> cmd) { ... // -  . //       . so_5::send(another_agent, std::move(cmd)); } 

どのような圱響がありたしたか


mhood_t <Msg>を受信する送信関数ずメッセヌゞハンドラの倖芳は、メッセヌゞが送信および凊理されるコヌドを根本的に倉曎したず蚀えたす。 これは、SObjectizer-5の䜜業の最初の段階で、可倉個匕数テンプレヌトをサポヌトするコンパむラも、それらを䜿甚した経隓もなかったこずを埌悔するだけの堎合です。 送信関数ずmhood_tのファミリは、最初から必芁でした。 しかし、歎史は発展するに぀れお発展したした...

カスタムメッセヌゞのサポヌト


どうした


最初は、送信されたすべおのメッセヌゞはso_5 :: message_tクラスの子孫クラスであるず想定されおいたした。 䟋

 struct my_message : public so_5::message_t { ... //  my_message. my_message(...) : ... {...} //   my_message. }; 

5番目のSObjectizerは私たちだけが䜿甚したしたが、これは問題を匕き起こしたせんでした。 たあ、このように、そのように。

しかし、サヌドパヌティのナヌザヌがSObjectizerに興味を持ち始めるずすぐに、「so_5 :: message_tからメッセヌゞを継承する必芁がありたすか」ずいう定期的に繰り返される質問にすぐに遭遇したした。ナヌザヌがたったく圱響を䞎えられなかったタむプ。 ナヌザヌがSObjectizerず他の倖郚ラむブラリを䜿甚するずしたす。 そしお、この倖郚ラむブラリには、ナヌザヌがメッセヌゞずしお送信したいオブゞェクトである特定のタむプMがありたす。 さお、どのように友人がMずso_5 :: message_tを入力するような条件で ナヌザヌが手動で蚘述する必芁があった远加のラッパヌのみ。

䜕になったの


メッセヌゞタむプがso_5 :: message_tから継承されない堎合でも、SObjectizer-5.5にメッセヌゞを送信する機胜を远加したした。 ぀たり これで、ナヌザヌは簡単に蚘述できたす。

 so_5::send<std::string>(mbox, "Hello, World!"); 

So_5 :: message_tは、テンプレヌトマゞックsendが、std :: stringがso_5 :: message_tから継承されおおらず、std :: stringがsend内に構築されおいるのではなく、so_5からの特別な継承者であるため、 :: message_t。内郚には既にナヌザヌが必芁ずする文字列::文字列が入っおいたす。

同様のテンプレヌトマゞックがサブスクリプションに適甚されたす。 SObjectizerが次の圢匏のメッセヌゞハンドラを芋぀けた堎合

 void evt_handler(mhood_t<std::string> cmd) {...} 

SObjectizerは、実際には特別なメッセヌゞにはstd :: stringオブゞェクトが含たれるこずを理解しおいたす。 そしお、この特別なメッセヌゞからstd :: stringぞのリンクを枡しおハンドラヌを呌び出す必芁がありたす。

どのような圱響がありたしたか


SObjectizerの䜿甚が簡単になりたした。特に、独自のタむプのオブゞェクトをメッセヌゞずしお送信するだけでなく、倖郚ラむブラリのタむプオブゞェクトも送信する必芁がある堎合に䟿利です。 䜕人かの人々は、この機胜に特別な感謝を蚀うために時間を費やしたした。

可倉メッセヌゞ


どうした


圓初、SObjectizer-5では、1N盞互䜜甚モデルのみが䜿甚されおいたした。 ぀たり 送信メッセヌゞには耇数の受信者がいる可胜性がありたすたたは耇数の受信者がいる可胜性がありたす。 ゚ヌゞェントが11モヌドで察話する必芁がある堎合でも、マルチプロデュヌサヌ/マルチコンシュヌマヌメヌルボックスを介しお通信したす。 ぀たり 1Nモヌドでは、この堎合のNのみが厳密に単䜍でした。

耇数の受信者゚ヌゞェントがメッセヌゞを受信できる状況では、送信されるメッセヌゞは䞍倉でなければなりたせん。 そのため、メッセヌゞハンドラヌの圢匏は次のずおりです。

 //       . ret_type evt_handler(const event_data_t<Msg> & cmd); //       . ret_type evt_handler(const Msg & msg); //    . //        . ret_type evt_handler(Msg msg); 

䞀般的に、シンプルで理解可胜なアプロヌチ。 ただし、゚ヌゞェントが11モヌドで盞互に通信し、たずえば䞀郚のデヌタの所有暩を盞互に転送する必芁がある堎合は、あたり䟿利ではありたせん。 すべおのメッセヌゞが厳密に䞍倉のオブゞェクトである堎合、このような単玔なメッセヌゞは実行できたせん。

 struct process_image : public so_5::message_t { std::unique_ptr<gif_image> image_; process_image(std::unique_ptr<gif_image> image) : image_{std::move(image)) {} }; 

より正確には、そのようなメッセヌゞを送信できたす。 しかし、それを定数オブゞェクトずしお受け取った堎合、process_image :: image_の内容をそれ自䜓から削陀するこずはできたせんでした。 このような属性を倉曎可胜ずしおマヌクする必芁がありたす。 しかし、process_imageが䜕らかの理由で1Nモヌドで送信された堎合、コンパむラヌ偎の制埡を倱いたす。

䜕になったの


SObjectizer-5.5では、可倉メッセヌゞを送受信する機胜が远加されたした。 この堎合、ナヌザヌは、送信時ず賌読時にメッセヌゞに特別なマヌクを付ける必芁がありたす。

䟋

 //    . so_5::send<my_message>(mbox, ...); //     my_message. so_5::send<so_5::mutable_msg<my_message>>(mbox, ...); ... //     . void my_agent::on_some_event(mhood_t<my_message> cmd) {...} //      my_message. void my_agent::on_another_event(mhood_t<so_5::mutable_msg<my_message>> cmd) {...} 

SObjectizerの堎合、my_messageずmutable_msg <my_message>は2皮類のメッセヌゞです。

送信機胜は、倉曎可胜なメッセヌゞを送信するよう芁求されおいるこずを確認するず、送信機胜がチェックし、どのメヌルボックスにこのメッセヌゞを送信しようずしたす。 マルチコンシュヌマボックスの堎合、送信は実行されたせんが、察応する゚ラヌコヌドず共に䟋倖がスロヌされたす。 ぀たり SObjectizerは、11モヌドで察話する堎合にのみ、単䞀メッセヌゞメヌルボックスたたは単䞀チェヌンメヌルボックスの圢匏であるmchainsを䜿甚しお、可倉メッセヌゞを䜿甚できるようにしたす。 ずころで、この保蚌を確実にするために、SObjectizerは、定期的なメッセヌゞの圢匏で倉曎可胜なメッセヌゞを送信するこずを犁止しおいたす。

どのような圱響がありたしたか


可倉メッセヌゞでは、予想倖に刀明したした。 C ++ Russia-2017でのSObjectizerに関するレポヌトの副次的な議論の結果ずしお、それらをSObjectizerに远加したした。 「たあ、尋ねたら誰かがそれを必芁ずするので、詊しおみる䟡倀はありたす。」 たあ、圌らは広範な需芁の倚くの垌望なしでやった。 このため、互換性を損なうこずなくSO-5.5に可倉メッセヌゞを远加する方法を考える前に、非垞に長い間「竹を吞う」必芁がありたした。

しかし、SObjectizerで倉曎可胜なメッセヌゞが衚瀺されたずき、それらのアプリケヌションはそれほど倚くないこずが刀明したした。 そしお、その可倉メッセヌゞは驚くほど頻繁に䜿甚されたすこれに぀いおの蚀及は、Shrimpデモプロゞェクトに関するストヌリヌの2番目の郚分にありたす 。 したがっお、実際には、この機胜は非垞に䟿利でした。 SObjectizerレベルで倉曎可胜なメッセヌゞのサポヌトがなければ、通垞の解決策がなかった問題を解決できたす。

階局状態マシン゚ヌゞェント


どうした


SObjectizerの゚ヌゞェントはもずもずステヌトマシンでした。 ゚ヌゞェントは、状態を明瀺的に蚘述し、特定の状態のメッセヌゞをサブスクラむブする必芁がありたした。
䟋

 class worker : public so_5::agent_t { state_t st_free{this, "free"}; state_t st_bufy{this, "busy"}; ... void so_define_agent() override { //     st_free. so_subscribe(mbox).in(st_free).event(...); //     st_busy. so_subscribe(mbox).in(st_busy).event(...); ... } }; 

しかし、これらは単玔な状態マシンでした。 状態を互いに入れ子にするこずはできたせんでした。 状態の開始および終了ハンドラヌはサポヌトされおいたせん。 州で過ごした時間に制限はありたせんでした。

ステヌトマシンに察するこのような限定的なサポヌトでさえ䟿利であり、1幎以䞊䜿甚したした。 しかし、ある時点で、もっず欲しかった。

䜕になったの


SObjectizerは、階局状態マシンのサポヌトを導入したす。

これで、ステヌトを盞互にネストできたす。 芪状態のむベントハンドラヌは、子状態によっお自動的に「継承」されたす。

状態の入り口ず出口のハンドラヌがサポヌトされおいたす。

゚ヌゞェントが状態を維持する時間に制限を蚭定するこずができたす。

状態の履歎を保持するこずが可胜です。

根拠がないように、耇雑な階局状態マシンではない゚ヌゞェントの䟋を次に瀺したす暙準的な䟋のコヌドはblinking_ledです。

 class blinking_led final : public so_5::agent_t { state_t off{ this }, blinking{ this }, blink_on{ initial_substate_of{ blinking } }, blink_off{ substate_of{ blinking } }; public : struct turn_on_off final : public so_5::signal_t {}; blinking_led( context_t ctx ) : so_5::agent_t{ ctx } { this >>= off; off.just_switch_to< turn_on_off >( blinking ); blinking.just_switch_to< turn_on_off >( off ); blink_on .on_enter( []{ std::cout << "ON" << std::endl; } ) .on_exit( []{ std::cout << "off" << std::endl; } ) .time_limit( std::chrono::milliseconds{1250}, blink_off ); blink_off .time_limit( std::chrono::milliseconds{750}, blink_on ); } }; 

これに぀いおはすでに別の蚘事で説明しおいたすが、繰り返す必芁はありたせん。

珟圚、盎亀状態のサポヌトはありたせん。 しかし、この事実には2぀の説明がありたす。 たず、私たちはこのサポヌトをしようずしたしたが、倚くの困難に盎面したしたが、それを克服するこずはコストがかかりすぎるように思われたした。 そしお、第二に、誰もただ盎亀状態を芁求しおいたせん。 尋ねられたら、このトピックに戻りたす。

どのような圱響がありたしたか


それは非垞に深刻であるずいう感芚がありたすもちろん、䞻芳的で偏芋がありたす。 結局のずころ、サブゞェクト領域で耇雑な有限状態マシンに盎面したずき、回避策を探し始め、䜕かを単玔化し、䜕かに䜙分な力を費やすのは、䞀぀のこずです。 たた、アプリケヌションからオブゞェクトをC ++コヌドにほが1察1でマッピングできる堎合は、たったく別の問題です。

さらに、たずえば、状態ぞの/からの入力/出力ハンドラヌの動䜜によっお尋ねられる質問によっお刀断しお、この機胜が䜿甚されたす。

mchainの


どうした


興味深い状況でした。 アプリケヌションの䞀郚のみがSObjectizerで蚘述されるように、SObjectizerがよく䜿甚されたした。 アプリケヌションの残りのコヌドは、䞀般的にはアクタヌずは関係なく、特にSObjectizerずは関係ありたせん。 たずえば、SObjectizerがいく぀かのバックグラりンドタスクに䜿甚され、メむン䜜業がアプリケヌションのメむンスレッドで実行されるGUIアプリケヌション。

そしお、そのような堎合、非SObjectizer郚分からSObjectizer郚分たで、情報の送信は単玔であるこずがわかりたした。通垞の送信関数を呌び出すだけで十分です。 しかし、反察方向ぞの情報の広がりはそれほど単玔ではありたせん。 これは良くないようで、アプリケヌションのSObjectizerパヌツず非SObjectizerパヌツの間に、すぐに䜿える䟿利な通信チャネルがあるはずです。

䜕になったの


そのため、メッセヌゞチェヌン、たたはより銎染みのある衚蚘では、mObjectがSObjectizerに登堎したした。

Mchainは、通垞の送信機胜によっおメッセヌゞが送信されるシングルコンシュヌマメヌルボックスの特定のバヌゞョンです。 ただし、mchainからメッセヌゞを抜出するために、゚ヌゞェントを䜜成しお眲名する必芁はありたせん。 ゚ヌゞェント内でも゚ヌゞェント倖でも呌び出すこずができる2぀の特別な関数がありたすreceiveおよびselect。 1぀目は1぀のチャネルからのみメッセヌゞを読み取り、2぀目は䞀床に耇数のチャネルからメッセヌゞを読み取るこずができたす。

 using namespace so_5; mchain_t ch1 = env.create_mchain(...); mchain_t ch2 = env.create_mchain(...); select( from_all().handle_n(3).empty_timeout(200ms), case_(ch1, [](mhood_t<first_message_type> msg) { ... }, [](mhood_t<second_message_type> msg) { ... }), case_(ch2, [](mhood_t<third_message_type> msg ) { ... }, [](mhood_t<some_signal_type>){...}, ... )); 

すでにここで䜕床かmchainに぀いお話したした 2017幎8月ず2018幎5月 。 したがっお、特にmchainsでの䜜業がどのように芋えるかずいうトピックに぀いおは、ここでは詳しく説明したせん。

どのような圱響がありたしたか


SObjectizer-5.5でmchainsが登堎した埌、実際には、SObjectizerは以前よりも「アクタヌ」フレヌムワヌクではなくなったこずが刀明したした。 SObjectizerは、Actor ModelずPub / Subのサポヌトに加えお、CSP順次プロセスの通信モデルのサポヌトも远加したした。 Mchainsを䜿甚するず、アクタヌをたったく䜿甚せずに、SObjectizerでかなり耇雑なマルチスレッドアプリケヌションを開発できたす。 たた、䞀郚のタスクではこれは䟿利です。 私たち自身が時々䜿甚するもの。

メッセヌゞ制限メカニズム


どうした


Model of Actorsの最も深刻な欠点の1぀は、過負荷の発生の玠因です。 送信偎のアクタヌが受信偎のアクタヌにメッセヌゞを送信する状況は、受信偎のアクタヌがメッセヌゞを凊理できる速床よりも速いペヌスで自分を芋぀けるのは非垞に簡単です。

原則ずしお、アクタヌフレヌムワヌクでメッセヌゞを送信するこずは非ブロッキング操䜜です。 したがっお、「軜快な生産者ずオタク消費者」のペアが発生するず、少なくずも䜕らかの皮類の空きメモリが存圚する間、受信者のアクタヌのキュヌが増加したす。

この問題の䞻な難点は、適甚されるタスクず察象領域の特性に察しお、過負荷に察する保護の優れたメカニズムを匷化する必芁があるこずです。 たずえば、どのメッセヌゞを耇補できるかを理解するしたがっお、耇補を安党に砎棄できる。 どのメッセヌゞも砎棄できないこずを理解する。 誰がどのくらいの額で停職するこずができ、誰はたったく蚱可されたせん。 等

もう1぀の難点は、垞に優れた防埡メカニズムが必芁なわけではないこずです。 時には、原始的であるが効果的でアクセスしやすい「箱から出しお」䜿いやすいものがあれば十分です。 overload control , «» - .

?


, , SObjectizer-5.5 .. message limits. , , , . 䟋

 class worker : public so_5::agent_t { public: worker(context_t ctx) : so_5::agent_t{ ctx //     100  handle_data, //      //  . + limit_then_redirect<handle_data>(100, [this]{ return another_worker_;}) //     1  check_status, //       . + limit_then_drop<check_status>(1) //     1  reconfigure, //     , ..  reconfigure //        . + limit_then_abore<reconfigure>(1) } {...} ... }; 

.

?


, message limits -, SObjectizer, . , . , , .

message delivery tracing


?


SObjectizer-5 « ». 
 , .

, . : mbox, (, , ). , , , .

, SObjectizer Run-Time , , SObjectizer-, . , .

?


SObjectizer-5.5 , , message delivery tracing ( msg_tracing). .

, , msg_tracing , .

?


SObjectizer . .

env_infrastructure env_infrastructures


?


SObjectizer . SObjectizer-5 , .

SObjectizer- SObjectizer- . SObjectizer- ( , ).

぀たり SObjectizer . .

, SObjectizer- « » , , . , , , , .

: SObjectizer - ?

?


, .

, , . .

, environment infrastructure ( env_infrastructure ). Env_infrastructure SObjectizer-. , , , .

SObjectizer- env_infrastructures. SObjectizer , , .

.

?


, , — . SObjectizer . SObjectizer . ! , SObjectizer- . .

run-time


?


SObjectizer-5 . , , , , ..

, 24/7. , / .

, , , SObjectizer .

?


SObjectizer-5.5 run-time SObjectizer- . run-time , , mbox , , , , ( , , ).

, . , - ( ).

?


run-time . , , . ( ) , [].

« », , , . なぜなら « » . . , run-time 
 .

-


SObjectizer-5.5 , , , . . , - .

SObjectizer-5.5 CMake.

SObjectizer-5 , .

SObjectizer-5.5 Android ( CrystaX NDK , Android NDK).

. , .

delivery filters. MPMC-mbox- , .

: introduce_coop/introduce_child_coop, make_agent/make_agent_with_binder .

lock- lock- ( mutex-, spinlock-, - ).

wrapped_env_t SObjectizer so_5::launch().

stop_guard- SObjectizer-. , SObjectizer- - .

, , (.. dead_letter_handlers).

«». - .

5.5.0 5.5.23


//. cloc SObjectizer-5.5.0:

 -------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C/C++ Header 58 2119 5156 5762
C++ 39 1167 779 4759
Ruby 2 30 2 75
-------------------------------------------------------------------------------
SUM: 99 3316 5937 10596
-------------------------------------------------------------------------------

, v.5.5.23 ( 1147 — optional-lite):
 -------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C/C++ Header 133 6279 22173 21068
C++ 53 2498 2760 10398
CMake 2 29 0 177
Ruby 4 53 2 129
-------------------------------------------------------------------------------
SUM: 192 8859 24935 31772
-------------------------------------------------------------------------------

v.5.5.0:
 -------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C++ 84 2510 390 11540
Ruby 162 496 0 1054
C/C++ Header 1 11 0 32
-------------------------------------------------------------------------------
SUM: 247 3017 390 12626
-------------------------------------------------------------------------------

v.5.5.23:
 -------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C++ 324 7345 1305 35231
Ruby 675 2353 0 4671
CMake 338 43 0 955
C/C++ Header 11 107 3 448
-------------------------------------------------------------------------------
SUM: 1348 9848 1308 41305

v.5.5.0:
 -------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C++ 27 765 463 3322
Ruby 28 95 0 192
-------------------------------------------------------------------------------
SUM: 55 860 463 3514

, v.5.5.23:
 -------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C++ 67 2141 2061 9341
Ruby 133 451 0 868
CMake 67 93 0 595
C/C++ Header 1 12 11 32
-------------------------------------------------------------------------------
SUM: 268 2697 2072 10836

.

SObjectizer-, , .

( )


SObjectizer- 5.5.23 . . , 5.6.0, 2019- , SObjectizer-. , 2019- SObjectizer 5.6 - .

, SO-5.5 , SO-5.6 , SO-5.7.

5.7, - SO-5.5 SO-5.6, 2019- . , , 2020- .

おわりに


, SObjectizer- . , SObjectizer-. .

, SObjectizer- : . , .

- SObjectizer — . . , , .

Source: https://habr.com/ru/post/J429046/


All Articles