SlideShare ist ein Scribd-Unternehmen logo
1 von 48
Downloaden Sie, um offline zu lesen
What is SObjectizer-5.7?
(at version 5.7.0)
SObjectizer Team, Jan 2020
SObjectizer is a framework for building robust multithreaded
applications.
It is based on async message exchange and uses a mixture of
high-level abstractions:
● Actor-Model
● Publish-Subscribe
● Communicating Sequential Processes
SObjectizer Team, Jan 2020
SObjectizer’s main ideas and principles were formulated in the
middle of 1990s, during the development of SCADA Objectizer
project in Development Bureau of System Programming in
Homyel, Belarus (1996-2000).
SCADA Objectizer’s ideas were reused in the new project
SObjectizer-4 in 2002.
Evolution of SObjectizer-4 was stopped in 2010 and the
development of SObjectizer-5 started.
SObjectizer Team, Jan 2020
SObjectizer was an in-house project of Intervale*
for the long
time.
Since 2013 SObjectizer is an independent project which a
totally separated from Intervale.
Since 2016 the SObjectizer's development and support is
performed by stiffstream**
.
*
www.intervale.ru
**
stiffstream.com SObjectizer Team, Jan 2020
SObjectizer was used for:
● SMS/USSD traffic service;
● financial transaction handling;
● software parameters monitoring;
● automatic control of the theatre's scenery*
;
● machine learning;
● prototyping of distributed data-acquisition software;
● components of DMP in an advertising platform;
● components of an online game.
*
https://habr.com/en/post/452464/ SObjectizer Team, Jan 2020
SObjectizer can be used for the development of a large,
distributed and highly loaded software systems.
SObjectizer can also be used for small utilities and
quick-and-dirty prototypes.
The whole application can be built upon SObjectizer.
Or SObjectizer can be used only for a small part of an
application developed on the top of Qt, wxWidgets, ACE, Boost,
etc.
SObjectizer Team, Jan 2020
What distinguishes SObjectizer?
SObjectizer Team, Jan 2020
Maturity
SObjectizer is based on ideas that have been put forward in
1995-2000.
And SObjectizer itself is being developed since 2002.
SObjectizer-5 is continuously evolved since 2010.
SObjectizer Team, Jan 2020
Stability
From the very beginning SObjectizer was used for
business-critical applications, and some of them are still being
used in production.
Breaking changes in SObjectizer are rare and we approach to
them very carefully.
For example, branch 5.5 respects compatibility for more that
four years.
SObjectizer Team, Jan 2020
Cross-platform
SObjectizer runs on Windows, Linux, FreeBSD, macOS and
Android.
SObjectizer Team, Jan 2020
Easy-to-use
SObjectizer provides easy to understand and easy to use API
with a lot of examples in the SObjectizer's distributive and a
plenty of information in the project's Wiki*
.
https://github.com/Stiffstream/sobjectizer/wiki SObjectizer Team, Jan 2020
Free
SObjectizer is distributed under BSD-3-CLAUSE license, so it
can be used in development of proprietary commercial software
for free.
SObjectizer Team, Jan 2020
It's not dead!
SObjectizer is one of a few live and evolving OpenSource actor
frameworks for C++.
There are more that 30 releases on SObjectizer-5 since it was
open-sourced in May 2013.
SObjectizer Team, Jan 2020
It evolves
SObjectizer-5.7 has much more features than the first public
release of SObjectizer-5 had in 2013.
During the evolution, SObjectizer incorporated several features
that can be called game-changers...
SObjectizer Team, Jan 2020
Some of new features since 2013:
● agents as hierarchical state machines;
● mutability for messages;
● message chains;
● environment infrastructures;
● enveloped messages;
● dead-letter handlers;
● message-tracing;
● stop-guards;
● run-time monitoring;
● unit-testing of agents;
● ...
SObjectizer Team, Jan 2020
Let's dig into some details!
SObjectizer Team, Jan 2020
Using SObjectizer-5.7 a programmer must define
messages/signals and implement agents for processing them.
Agents are created by the programmer and are bound to
dispatchers. Dispatchers are responsible for message
dispatching and providing of working thread on which agents
handle messages.
SObjectizer Team, Jan 2020
A programmer can create as many agents as needed.
Agent is a lightweight entity.
There could be thousands, millions and hundreds of millions of
agents.
Number of agents is limited only by amount of RAM and the
common sense of a programmer.
SObjectizer Team, Jan 2020
A traditional "Hello, World" example. This is the main agent:
#include <so_5/all.hpp>
class hello_actor final : public so_5::agent_t {
public:
using so_5::agent_t::agent_t;
void so_evt_start() override {
std::cout << "Hello, World!" << std::endl;
// Finish work of example.
so_deregister_agent_coop_normally();
}
};
SObjectizer Team, Jan 2020
And this is the main() function:
int main() {
// Launch SObjectizer.
so_5::launch([](so_5::environment_t & env) {
// Add a hello_actor instance in a new cooperation.
env.register_agent_as_coop( env.make_agent<hello_actor>() );
});
return 0;
}
SObjectizer Team, Jan 2020
Let's see an example of timers and Publish/Subscribe.
There will be a producer agent that will distribute new values on a
periodic basis.
And there will be a couple of consumers on that data.
SObjectizer Team, Jan 2020
Define a message with new data:
#include <so_5/all.hpp>
using namespace std::literals;
// This message will be published to a multi-consumer message box on a periodic basis.
struct acquired_value {
std::chrono::steady_clock::time_point acquired_at_;
int value_;
};
SObjectizer Team, Jan 2020
Agent-producer (fields and the constructor):
class producer final : public so_5::agent_t {
const so_5::mbox_t board_; // The destination for acquired_value.
so_5::timer_id_t timer_;
int counter_{};
// This signal will be sent by the timer.
struct acquisition_time final : public so_5::signal_t {};
public:
producer(context_t ctx, so_5::mbox_t board)
: so_5::agent_t{std::move(ctx)}, board_{std::move(board)}
{}
SObjectizer Team, Jan 2020
Agent-producer (the main methods):
void so_define_agent() override {
// A subscription to periodic signal.
so_subscribe_self().event( [this](mhood_t<acquisition_time>) {
// Publish the next value for all consumers.
so_5::send<acquired_value>(
board_, std::chrono::steady_clock::now(), ++counter_);
} );
}
void so_evt_start() override {
// Agent will periodically recive acquisition_time signal
// without initial delay and with period of 750ms.
timer_ = so_5::send_periodic<acquisition_time>(*this, 0ms, 750ms);
}
};
SObjectizer Team, Jan 2020
Agent-consumer:
class consumer final : public so_5::agent_t {
const so_5::mbox_t board_;
const std::string name_;
void on_value(mhood_t<acquired_value> cmd) {
std::cout << name_ << ": " << cmd->value_ << std::endl;
}
public:
consumer(context_t ctx, so_5::mbox_t board, std::string name)
: so_5::agent_t{std::move(ctx)}, board_{std::move(board)}, name_{std::move(name)}
{}
void so_define_agent() override { so_subscribe(board_).event(&consumer::on_value); }
};
SObjectizer Team, Jan 2020
The main() function:
int main() {
so_5::launch([](so_5::environment_t & env) {
auto board = env.create_mbox();
env.introduce_coop([board](so_5::coop_t & coop) {
coop.make_agent<producer>(board);
coop.make_agent<consumer>(board, "first"s);
coop.make_agent<consumer>(board, "second"s);
});
std::this_thread::sleep_for(4s);
env.stop();
});
return 0;
}
SObjectizer Team, Jan 2020
All agents in the example above works on the same default
dispatcher.
Let's bind them to different dispatchers...
SObjectizer Team, Jan 2020
so_5::launch([](so_5::environment_t & env) {
auto board = env.create_mbox();
env.introduce_coop([&](so_5::coop_t & coop) {
// A separate dispatcher for producer.
coop.make_agent_with_binder<producer>(
so_5::disp::one_thread::make_dispatcher(env).binder(), board);
// And a separate dispatcher for consumers.
auto disp = so_5::disp::active_obj::make_dispatcher(env);
coop.make_agent_with_binder<consumer>(disp.binder(), board, "first"s);
coop.make_agent_with_binder<consumer>(disp.binder(), board, "second"s);
});
...
});
SObjectizer Team, Jan 2020
SObjectizer has several ready-to-use dispatchers:
● one_thread. All agents work on a single working thread;
● active_obj. Every agent works on a single dedicated working thread;
● active_group. A single dedicated working thread is allocated for a group of
agents;
● thread_pool. A working thread is selected from thread pool. Agents can be moved
from one working thread to another. But an agent can’t work on two threads at the
same time;
● adv_thread_pool. A working thread is selected from thread pool. Agents can be
moved from one working thread to another. Moreover an agent can work on
several threads at the same time (if the agent’s event handlers are marked as
thread safe);
● prio_one_thread (strictly_ordered and quoted_round_robin). One working
thread and dispatching with respect to agent’s priorities;
● prio_dedicated_threads::one_per_prio. One working thread per a priority.
SObjectizer Team, Jan 2020
A programmer can create any number of dispatchers needed. This
allows to bind agents to different context in such a way that the impact
of one agent on another will be minimal. For example:
● one one_thread dispatcher for AMQP-client agent;
● one thread_pool dispatcher for handling requests from AMQP-queues;
● one active_obj dispatcher for DBMS-related agents;
● yet another active_obj dispatcher for agents whose work with HSMs
connected to the computer;
● and yet another thread_pool dispatcher for agents for managing all the
stuff described above.
SObjectizer Team, Jan 2020
SObjectizer even allows writing an application without actors...
SObjectizer Team, Jan 2020
You can write a multithreaded application using only plain
std::thread and SObjectizer's mchains.
mchain in SObjectizer is an analog of CSP-channel.
Let's see a ping-pong between worker threads via mchains...
SObjectizer Team, Jan 2020
Ping-pong on plain threads and mchains (1)
#include <so_5/all.hpp>
struct ping {
int counter_;
};
struct pong {
int counter_;
};
SObjectizer Team, Jan 2020
Ping-pong on plain threads and mchains (2)
void pinger_proc(so_5::mchain_t self_ch, so_5::mchain_t ping_ch) {
so_5::send<ping>(ping_ch, 1000); // The initial "ping".
// Read all message until channel will be closed.
so_5::receive( so_5::from(self_ch).handle_all(),
[&](so_5::mhood_t<pong> cmd) {
if(cmd->counter_ > 0)
so_5::send<ping>(ping_ch, cmd->counter_ - 1);
else {
// Channels have to be closed to break `receive` calls.
so_5::close_drop_content(self_ch);
so_5::close_drop_content(ping_ch);
}
});
}
SObjectizer Team, Jan 2020
Ping-pong on plain threads and mchains (3)
void ponger_proc(so_5::mchain_t self_ch, so_5::mchain_t pong_ch) {
int pings_received{};
// Read all message until channel will be closed.
so_5::receive( so_5::from(self_ch).handle_all(),
[&](so_5::mhood_t<ping> cmd) {
++pings_received;
so_5::send<pong>(pong_ch, cmd->counter_);
});
std::cout << "pings received: " << pings_received << std::endl;
}
SObjectizer Team, Jan 2020
Ping-pong on plain threads and mchains (4)
int main() {
so_5::wrapped_env_t sobj;
auto pinger_ch = so_5::create_mchain(sobj);
auto ponger_ch = so_5::create_mchain(sobj);
std::thread pinger{pinger_proc, pinger_ch, ponger_ch};
std::thread ponger{ponger_proc, ponger_ch, pinger_ch};
ponger.join();
pinger.join();
return 0;
}
SObjectizer Team, Jan 2020
SObjectizer-5.7 provides a select() function that can be
compared with Go's select statement.
SObjectizer's select() allows doing non-blocking send to a
mchain with waiting of an incoming message from another
mchain(s).
Let's see how famous Go's example* with the calculation of
Fibonacci numbers in different goroutines can look like in
SObjectizer.
https://tour.golang.org/concurrency/5 SObjectizer Team, Jan 2020
Calculation of Fibonacci numbers in different threads (1)
#include <so_5/all.hpp>
#include <chrono>
using namespace std;
using namespace std::chrono_literals;
using namespace so_5;
struct quit {};
SObjectizer Team, Jan 2020
Calculation of Fibonacci numbers in different threads (2)
void fibonacci( mchain_t values_ch, mchain_t quit_ch ) {
int x = 0, y = 1;
mchain_select_result_t r;
do {
r = select( from_all().handle_n(1),
send_case( values_ch, message_holder_t<int>::make(x),
[&x, &y] {
auto old_x = x;
x = y; y = old_x + y;
} ),
receive_case( quit_ch, [](quit){} ) );
} while( r.was_sent() && !r.was_handled() ); // Continue while nothing received.
}
SObjectizer Team, Jan 2020
Calculation of Fibonacci numbers in different threads (3)
int main() {
wrapped_env_t sobj;
thread fibonacci_thr;
auto thr_joiner = auto_join( fibonacci_thr ); // Automatically join thread at exit.
auto values_ch = create_mchain( sobj, 1s, 1, // Limit the capacity of Fibonacci numbers chain.
mchain_props::memory_usage_t::preallocated, mchain_props::overflow_reaction_t::abort_app );
auto quit_ch = create_mchain( sobj );
fibonacci_thr = thread{ fibonacci, values_ch, quit_ch }; // A separate thread for the calculation.
receive( from( values_ch ).handle_n( 10 ), []( int v ) { cout << v << endl; } );
send< quit >( quit_ch );
}
SObjectizer Team, Jan 2020
SObjectizer is not a silver bullet
SObjectizer Team, Jan 2020
SObjectizer supports several concurrency models.
SObjectizer makes the development of complex multithreaded
applications easier.
It's proved by 18 years of usage "in production".
But SObjectizer doesn't solve all the problems...
SObjectizer Team, Jan 2020
SObjectizer is responsible for:
● in-process message dispatching;
● providing working thread for message processing;
● SObjectizer Run-Time’s parameters tuning;
● collecting of run-time stats (if enabled);
● message delivery process tracing (if enabled).
SObjectizer Team, Jan 2020
And SObjectizer-5 doesn't support development of distributed
application just "out of box".
Additional libraries and tools should be used for that.
SObjectizer Team, Jan 2020
Some more info about
SObjectizer-5.7.0
SObjectizer Team, Jan 2020
SObjectizer-5.7 is developed using C++17.
Supported compilers and platforms:
● Visual Studio 2019, GCC 7.1-9.2, clang 6.0-9.0
● Windows, Linux, FreeBSD and MacOS.
Support of other platforms is possible in the case when
SObjectizer’s developers will have an access to those platforms.
SObjectizer Team, Jan 2020
Version 5.7.0 is ~31 KLOC of SObjectizer core.
Plus ~41 KLOC of tests.
Plus ~8 KLOC of samples.
Plus SObjectizer’s core documentation*.
Plus articles and presentations** (some of them in Russian).
*
https://github.com/Stiffstream/sobjectizer/wiki
**
http://sourceforge.net/p/sobjectizer/wiki/Articles/ SObjectizer Team, Jan 2020
Useful references:
Project’s home: https://github.com/Stiffstream/sobjectizer
Documentation: https://github.com/Stiffstream/sobjectizer/wiki
Google-group: https://groups.google.com/forum/#!forum/sobjectizer
Support: https://stiffstream.com

Weitere ähnliche Inhalte

Was ist angesagt?

Qt Framework Events Signals Threads
Qt Framework Events Signals ThreadsQt Framework Events Signals Threads
Qt Framework Events Signals ThreadsNeera Mital
 
Using hilt in a modularized project
Using hilt in a modularized projectUsing hilt in a modularized project
Using hilt in a modularized projectFabio Collini
 
Advanced Dagger talk from 360andev
Advanced Dagger talk from 360andevAdvanced Dagger talk from 360andev
Advanced Dagger talk from 360andevMike Nakhimovich
 
Advanced Javascript
Advanced JavascriptAdvanced Javascript
Advanced JavascriptAdieu
 
Java 8 - Completable Future
Java 8 - Completable FutureJava 8 - Completable Future
Java 8 - Completable FutureSajad jafari
 
ScalaMatsuri 2016 ドワンゴアカウントシステムを支えるScala技術
ScalaMatsuri 2016 ドワンゴアカウントシステムを支えるScala技術ScalaMatsuri 2016 ドワンゴアカウントシステムを支えるScala技術
ScalaMatsuri 2016 ドワンゴアカウントシステムを支えるScala技術Seitaro Yuuki
 
QVariant, QObject — Qt's not just for GUI development
QVariant, QObject — Qt's not just for GUI developmentQVariant, QObject — Qt's not just for GUI development
QVariant, QObject — Qt's not just for GUI developmentICS
 
Lockless Producer Consumer Threads: Asynchronous Communications Made Easy
Lockless Producer Consumer Threads: Asynchronous Communications Made EasyLockless Producer Consumer Threads: Asynchronous Communications Made Easy
Lockless Producer Consumer Threads: Asynchronous Communications Made EasyICS
 
Functors, Applicatives and Monads In Scala
Functors, Applicatives and Monads In ScalaFunctors, Applicatives and Monads In Scala
Functors, Applicatives and Monads In ScalaKnoldus Inc.
 
Qt multi threads
Qt multi threadsQt multi threads
Qt multi threadsYnon Perek
 
ADG Poznań - Kotlin for Android developers
ADG Poznań - Kotlin for Android developersADG Poznań - Kotlin for Android developers
ADG Poznań - Kotlin for Android developersBartosz Kosarzycki
 
20 cool features that is in PHP 7, we missed in PHP 5. Let walkthrough with t...
20 cool features that is in PHP 7, we missed in PHP 5. Let walkthrough with t...20 cool features that is in PHP 7, we missed in PHP 5. Let walkthrough with t...
20 cool features that is in PHP 7, we missed in PHP 5. Let walkthrough with t...DrupalMumbai
 
Fun with QML
Fun with QMLFun with QML
Fun with QMLICS
 
Sword fighting with Dagger GDG-NYC Jan 2016
 Sword fighting with Dagger GDG-NYC Jan 2016 Sword fighting with Dagger GDG-NYC Jan 2016
Sword fighting with Dagger GDG-NYC Jan 2016Mike Nakhimovich
 
Object Design - Part 1
Object Design - Part 1Object Design - Part 1
Object Design - Part 1Dhaval Dalal
 
Behavioral Reflection
Behavioral ReflectionBehavioral Reflection
Behavioral ReflectionMarcus Denker
 

Was ist angesagt? (20)

C++ Functions
C++ FunctionsC++ Functions
C++ Functions
 
Qt Framework Events Signals Threads
Qt Framework Events Signals ThreadsQt Framework Events Signals Threads
Qt Framework Events Signals Threads
 
RMI (Remote Method Invocation)
RMI (Remote Method Invocation)RMI (Remote Method Invocation)
RMI (Remote Method Invocation)
 
Using hilt in a modularized project
Using hilt in a modularized projectUsing hilt in a modularized project
Using hilt in a modularized project
 
Advanced Dagger talk from 360andev
Advanced Dagger talk from 360andevAdvanced Dagger talk from 360andev
Advanced Dagger talk from 360andev
 
Advanced Javascript
Advanced JavascriptAdvanced Javascript
Advanced Javascript
 
Android Thread
Android ThreadAndroid Thread
Android Thread
 
Java 8 - Completable Future
Java 8 - Completable FutureJava 8 - Completable Future
Java 8 - Completable Future
 
ScalaMatsuri 2016 ドワンゴアカウントシステムを支えるScala技術
ScalaMatsuri 2016 ドワンゴアカウントシステムを支えるScala技術ScalaMatsuri 2016 ドワンゴアカウントシステムを支えるScala技術
ScalaMatsuri 2016 ドワンゴアカウントシステムを支えるScala技術
 
QVariant, QObject — Qt's not just for GUI development
QVariant, QObject — Qt's not just for GUI developmentQVariant, QObject — Qt's not just for GUI development
QVariant, QObject — Qt's not just for GUI development
 
Lockless Producer Consumer Threads: Asynchronous Communications Made Easy
Lockless Producer Consumer Threads: Asynchronous Communications Made EasyLockless Producer Consumer Threads: Asynchronous Communications Made Easy
Lockless Producer Consumer Threads: Asynchronous Communications Made Easy
 
Functors, Applicatives and Monads In Scala
Functors, Applicatives and Monads In ScalaFunctors, Applicatives and Monads In Scala
Functors, Applicatives and Monads In Scala
 
Qt multi threads
Qt multi threadsQt multi threads
Qt multi threads
 
ADG Poznań - Kotlin for Android developers
ADG Poznań - Kotlin for Android developersADG Poznań - Kotlin for Android developers
ADG Poznań - Kotlin for Android developers
 
Java concurrency
Java concurrencyJava concurrency
Java concurrency
 
20 cool features that is in PHP 7, we missed in PHP 5. Let walkthrough with t...
20 cool features that is in PHP 7, we missed in PHP 5. Let walkthrough with t...20 cool features that is in PHP 7, we missed in PHP 5. Let walkthrough with t...
20 cool features that is in PHP 7, we missed in PHP 5. Let walkthrough with t...
 
Fun with QML
Fun with QMLFun with QML
Fun with QML
 
Sword fighting with Dagger GDG-NYC Jan 2016
 Sword fighting with Dagger GDG-NYC Jan 2016 Sword fighting with Dagger GDG-NYC Jan 2016
Sword fighting with Dagger GDG-NYC Jan 2016
 
Object Design - Part 1
Object Design - Part 1Object Design - Part 1
Object Design - Part 1
 
Behavioral Reflection
Behavioral ReflectionBehavioral Reflection
Behavioral Reflection
 

Ähnlich wie Build robust multithreaded apps with SObjectizer framework

What is SObjectizer 5.6 (at v.5.6.0)
What is SObjectizer 5.6 (at v.5.6.0)What is SObjectizer 5.6 (at v.5.6.0)
What is SObjectizer 5.6 (at v.5.6.0)Yauheni Akhotnikau
 
Dive into SObjectizer 5.5. Eighth Part: Dispatchers
Dive into SObjectizer 5.5. Eighth Part: DispatchersDive into SObjectizer 5.5. Eighth Part: Dispatchers
Dive into SObjectizer 5.5. Eighth Part: DispatchersYauheni Akhotnikau
 
Dive into SObjectizer 5.5. Introductory part
Dive into SObjectizer 5.5. Introductory partDive into SObjectizer 5.5. Introductory part
Dive into SObjectizer 5.5. Introductory partYauheni Akhotnikau
 
ROS Based Programming and Visualization of Quadrotor Helicopters
ROS Based Programming and Visualization of Quadrotor HelicoptersROS Based Programming and Visualization of Quadrotor Helicopters
ROS Based Programming and Visualization of Quadrotor HelicoptersAtılay Mayadağ
 
Get started with meteor | designveloper software agency meteor prime partner
Get started with meteor | designveloper software agency   meteor prime partnerGet started with meteor | designveloper software agency   meteor prime partner
Get started with meteor | designveloper software agency meteor prime partnerDesignveloper
 
Android task manager project presentation
Android task manager project presentationAndroid task manager project presentation
Android task manager project presentationAkhilesh Jaiswal
 
DSDP Mobile Tools for Java Webinar
DSDP Mobile Tools for Java WebinarDSDP Mobile Tools for Java Webinar
DSDP Mobile Tools for Java Webinargustavoeliano
 
Dive into SObjectizer 5.5. Seventh part: Message Limits
Dive into SObjectizer 5.5. Seventh part: Message LimitsDive into SObjectizer 5.5. Seventh part: Message Limits
Dive into SObjectizer 5.5. Seventh part: Message LimitsYauheni Akhotnikau
 
Full Stack React Workshop [CSSC x GDSC]
Full Stack React Workshop [CSSC x GDSC]Full Stack React Workshop [CSSC x GDSC]
Full Stack React Workshop [CSSC x GDSC]GDSC UofT Mississauga
 
Basic iOS Training with SWIFT - Part 1
Basic iOS Training with SWIFT - Part 1Basic iOS Training with SWIFT - Part 1
Basic iOS Training with SWIFT - Part 1Manoj Ellappan
 
Nyc mule soft_meetup_13_march_2021
Nyc mule soft_meetup_13_march_2021Nyc mule soft_meetup_13_march_2021
Nyc mule soft_meetup_13_march_2021NeerajKumar1965
 
project_proposal_osrf
project_proposal_osrfproject_proposal_osrf
project_proposal_osrfom1234567890
 
Built to Scale: The Mozilla Release Engineering toolbox
Built to Scale: The Mozilla Release Engineering toolboxBuilt to Scale: The Mozilla Release Engineering toolbox
Built to Scale: The Mozilla Release Engineering toolboxKim Moir
 

Ähnlich wie Build robust multithreaded apps with SObjectizer framework (20)

What is SObjectizer 5.6 (at v.5.6.0)
What is SObjectizer 5.6 (at v.5.6.0)What is SObjectizer 5.6 (at v.5.6.0)
What is SObjectizer 5.6 (at v.5.6.0)
 
What is SObjectizer 5.5
What is SObjectizer 5.5What is SObjectizer 5.5
What is SObjectizer 5.5
 
Dive into SObjectizer 5.5. Eighth Part: Dispatchers
Dive into SObjectizer 5.5. Eighth Part: DispatchersDive into SObjectizer 5.5. Eighth Part: Dispatchers
Dive into SObjectizer 5.5. Eighth Part: Dispatchers
 
Dive into SObjectizer 5.5. Introductory part
Dive into SObjectizer 5.5. Introductory partDive into SObjectizer 5.5. Introductory part
Dive into SObjectizer 5.5. Introductory part
 
ROS Based Programming and Visualization of Quadrotor Helicopters
ROS Based Programming and Visualization of Quadrotor HelicoptersROS Based Programming and Visualization of Quadrotor Helicopters
ROS Based Programming and Visualization of Quadrotor Helicopters
 
Get started with meteor | designveloper software agency meteor prime partner
Get started with meteor | designveloper software agency   meteor prime partnerGet started with meteor | designveloper software agency   meteor prime partner
Get started with meteor | designveloper software agency meteor prime partner
 
Db2 cloud provisioning
Db2 cloud provisioningDb2 cloud provisioning
Db2 cloud provisioning
 
Android task manager project presentation
Android task manager project presentationAndroid task manager project presentation
Android task manager project presentation
 
DSDP Mobile Tools for Java Webinar
DSDP Mobile Tools for Java WebinarDSDP Mobile Tools for Java Webinar
DSDP Mobile Tools for Java Webinar
 
Dive into SObjectizer 5.5. Seventh part: Message Limits
Dive into SObjectizer 5.5. Seventh part: Message LimitsDive into SObjectizer 5.5. Seventh part: Message Limits
Dive into SObjectizer 5.5. Seventh part: Message Limits
 
Android crash course
Android crash courseAndroid crash course
Android crash course
 
Meteor
MeteorMeteor
Meteor
 
Full Stack React Workshop [CSSC x GDSC]
Full Stack React Workshop [CSSC x GDSC]Full Stack React Workshop [CSSC x GDSC]
Full Stack React Workshop [CSSC x GDSC]
 
Spring boot
Spring bootSpring boot
Spring boot
 
Basic iOS Training with SWIFT - Part 1
Basic iOS Training with SWIFT - Part 1Basic iOS Training with SWIFT - Part 1
Basic iOS Training with SWIFT - Part 1
 
Sst hackathon express
Sst hackathon expressSst hackathon express
Sst hackathon express
 
Nyc mule soft_meetup_13_march_2021
Nyc mule soft_meetup_13_march_2021Nyc mule soft_meetup_13_march_2021
Nyc mule soft_meetup_13_march_2021
 
project_proposal_osrf
project_proposal_osrfproject_proposal_osrf
project_proposal_osrf
 
Meteor
MeteorMeteor
Meteor
 
Built to Scale: The Mozilla Release Engineering toolbox
Built to Scale: The Mozilla Release Engineering toolboxBuilt to Scale: The Mozilla Release Engineering toolbox
Built to Scale: The Mozilla Release Engineering toolbox
 

Mehr von Yauheni Akhotnikau

arataga. SObjectizer and RESTinio in action: a real-world example
arataga. SObjectizer and RESTinio in action: a real-world examplearataga. SObjectizer and RESTinio in action: a real-world example
arataga. SObjectizer and RESTinio in action: a real-world exampleYauheni Akhotnikau
 
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...Yauheni Akhotnikau
 
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...Shrimp: A Rather Practical Example Of Application Development With RESTinio a...
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...Yauheni Akhotnikau
 
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...Yauheni Akhotnikau
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Yauheni Akhotnikau
 
25 Years of C++ History Flashed in Front of My Eyes
25 Years of C++ History Flashed in Front of My Eyes25 Years of C++ History Flashed in Front of My Eyes
25 Years of C++ History Flashed in Front of My EyesYauheni Akhotnikau
 
GECon 2017: C++ - a Monster that no one likes but that will outlast them all
GECon 2017: C++ - a Monster that no one likes but that will outlast them allGECon 2017: C++ - a Monster that no one likes but that will outlast them all
GECon 2017: C++ - a Monster that no one likes but that will outlast them allYauheni Akhotnikau
 
Dive into SObjectizer 5.5. Tenth part: Mutable Messages
Dive into SObjectizer 5.5. Tenth part: Mutable MessagesDive into SObjectizer 5.5. Tenth part: Mutable Messages
Dive into SObjectizer 5.5. Tenth part: Mutable MessagesYauheni Akhotnikau
 
Actor Model and C++: what, why and how?
Actor Model and C++: what, why and how?Actor Model and C++: what, why and how?
Actor Model and C++: what, why and how?Yauheni Akhotnikau
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Yauheni Akhotnikau
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Yauheni Akhotnikau
 
Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?Yauheni Akhotnikau
 
Dive into SObjectizer 5.5. Ninth Part: Message Chains
Dive into SObjectizer 5.5. Ninth Part: Message ChainsDive into SObjectizer 5.5. Ninth Part: Message Chains
Dive into SObjectizer 5.5. Ninth Part: Message ChainsYauheni Akhotnikau
 
What's new in SObjectizer 5.5.9
What's new in SObjectizer 5.5.9What's new in SObjectizer 5.5.9
What's new in SObjectizer 5.5.9Yauheni Akhotnikau
 
Dive into SObjectizer-5.5. Sixth part: Synchronous Interaction
Dive into SObjectizer-5.5. Sixth part: Synchronous InteractionDive into SObjectizer-5.5. Sixth part: Synchronous Interaction
Dive into SObjectizer-5.5. Sixth part: Synchronous InteractionYauheni Akhotnikau
 
Dive into SObjectizer 5.5. Fifth part: Timers
Dive into SObjectizer 5.5. Fifth part: TimersDive into SObjectizer 5.5. Fifth part: Timers
Dive into SObjectizer 5.5. Fifth part: TimersYauheni Akhotnikau
 
What’s new in SObjectizer 5.5.8
What’s new in SObjectizer 5.5.8What’s new in SObjectizer 5.5.8
What’s new in SObjectizer 5.5.8Yauheni Akhotnikau
 
Dive into SObjectizer 5.5. Fourth part. Exception
Dive into SObjectizer 5.5. Fourth part. ExceptionDive into SObjectizer 5.5. Fourth part. Exception
Dive into SObjectizer 5.5. Fourth part. ExceptionYauheni Akhotnikau
 
Dive into SObjectizer 5.5. Third part. Coops
Dive into SObjectizer 5.5. Third part. CoopsDive into SObjectizer 5.5. Third part. Coops
Dive into SObjectizer 5.5. Third part. CoopsYauheni Akhotnikau
 
Погружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная частьПогружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная частьYauheni Akhotnikau
 

Mehr von Yauheni Akhotnikau (20)

arataga. SObjectizer and RESTinio in action: a real-world example
arataga. SObjectizer and RESTinio in action: a real-world examplearataga. SObjectizer and RESTinio in action: a real-world example
arataga. SObjectizer and RESTinio in action: a real-world example
 
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
[C++ CoreHard Autumn 2018] Actors vs CSP vs Task...
 
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...Shrimp: A Rather Practical Example Of Application Development With RESTinio a...
Shrimp: A Rather Practical Example Of Application Development With RESTinio a...
 
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...
Акторы в C++: взгляд старого практикующего актородела (St. Petersburg C++ Use...
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?
 
25 Years of C++ History Flashed in Front of My Eyes
25 Years of C++ History Flashed in Front of My Eyes25 Years of C++ History Flashed in Front of My Eyes
25 Years of C++ History Flashed in Front of My Eyes
 
GECon 2017: C++ - a Monster that no one likes but that will outlast them all
GECon 2017: C++ - a Monster that no one likes but that will outlast them allGECon 2017: C++ - a Monster that no one likes but that will outlast them all
GECon 2017: C++ - a Monster that no one likes but that will outlast them all
 
Dive into SObjectizer 5.5. Tenth part: Mutable Messages
Dive into SObjectizer 5.5. Tenth part: Mutable MessagesDive into SObjectizer 5.5. Tenth part: Mutable Messages
Dive into SObjectizer 5.5. Tenth part: Mutable Messages
 
Actor Model and C++: what, why and how?
Actor Model and C++: what, why and how?Actor Model and C++: what, why and how?
Actor Model and C++: what, why and how?
 
Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++Шишки, набитые за 15 лет использования акторов в C++
Шишки, набитые за 15 лет использования акторов в C++
 
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?Для чего мы делали свой акторный фреймворк и что из этого вышло?
Для чего мы делали свой акторный фреймворк и что из этого вышло?
 
Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?Модель акторов и C++ что, зачем и как?
Модель акторов и C++ что, зачем и как?
 
Dive into SObjectizer 5.5. Ninth Part: Message Chains
Dive into SObjectizer 5.5. Ninth Part: Message ChainsDive into SObjectizer 5.5. Ninth Part: Message Chains
Dive into SObjectizer 5.5. Ninth Part: Message Chains
 
What's new in SObjectizer 5.5.9
What's new in SObjectizer 5.5.9What's new in SObjectizer 5.5.9
What's new in SObjectizer 5.5.9
 
Dive into SObjectizer-5.5. Sixth part: Synchronous Interaction
Dive into SObjectizer-5.5. Sixth part: Synchronous InteractionDive into SObjectizer-5.5. Sixth part: Synchronous Interaction
Dive into SObjectizer-5.5. Sixth part: Synchronous Interaction
 
Dive into SObjectizer 5.5. Fifth part: Timers
Dive into SObjectizer 5.5. Fifth part: TimersDive into SObjectizer 5.5. Fifth part: Timers
Dive into SObjectizer 5.5. Fifth part: Timers
 
What’s new in SObjectizer 5.5.8
What’s new in SObjectizer 5.5.8What’s new in SObjectizer 5.5.8
What’s new in SObjectizer 5.5.8
 
Dive into SObjectizer 5.5. Fourth part. Exception
Dive into SObjectizer 5.5. Fourth part. ExceptionDive into SObjectizer 5.5. Fourth part. Exception
Dive into SObjectizer 5.5. Fourth part. Exception
 
Dive into SObjectizer 5.5. Third part. Coops
Dive into SObjectizer 5.5. Third part. CoopsDive into SObjectizer 5.5. Third part. Coops
Dive into SObjectizer 5.5. Third part. Coops
 
Погружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная частьПогружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная часть
 

Kürzlich hochgeladen

CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️anilsa9823
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...OnePlan Solutions
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantAxelRicardoTrocheRiq
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...panagenda
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVshikhaohhpro
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...OnePlan Solutions
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionSolGuruz
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsAndolasoft Inc
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendArshad QA
 

Kürzlich hochgeladen (20)

Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online  ☂️
CALL ON ➥8923113531 🔝Call Girls Kakori Lucknow best sexual service Online ☂️
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...Advancing Engineering with AI through the Next Generation of Strategic Projec...
Advancing Engineering with AI through the Next Generation of Strategic Projec...
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service Consultant
 
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 
Diamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with PrecisionDiamond Application Development Crafting Solutions with Precision
Diamond Application Development Crafting Solutions with Precision
 
How To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.jsHow To Use Server-Side Rendering with Nuxt.js
How To Use Server-Side Rendering with Nuxt.js
 
Test Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and BackendTest Automation Strategy for Frontend and Backend
Test Automation Strategy for Frontend and Backend
 

Build robust multithreaded apps with SObjectizer framework

  • 1. What is SObjectizer-5.7? (at version 5.7.0) SObjectizer Team, Jan 2020
  • 2. SObjectizer is a framework for building robust multithreaded applications. It is based on async message exchange and uses a mixture of high-level abstractions: ● Actor-Model ● Publish-Subscribe ● Communicating Sequential Processes SObjectizer Team, Jan 2020
  • 3. SObjectizer’s main ideas and principles were formulated in the middle of 1990s, during the development of SCADA Objectizer project in Development Bureau of System Programming in Homyel, Belarus (1996-2000). SCADA Objectizer’s ideas were reused in the new project SObjectizer-4 in 2002. Evolution of SObjectizer-4 was stopped in 2010 and the development of SObjectizer-5 started. SObjectizer Team, Jan 2020
  • 4. SObjectizer was an in-house project of Intervale* for the long time. Since 2013 SObjectizer is an independent project which a totally separated from Intervale. Since 2016 the SObjectizer's development and support is performed by stiffstream** . * www.intervale.ru ** stiffstream.com SObjectizer Team, Jan 2020
  • 5. SObjectizer was used for: ● SMS/USSD traffic service; ● financial transaction handling; ● software parameters monitoring; ● automatic control of the theatre's scenery* ; ● machine learning; ● prototyping of distributed data-acquisition software; ● components of DMP in an advertising platform; ● components of an online game. * https://habr.com/en/post/452464/ SObjectizer Team, Jan 2020
  • 6. SObjectizer can be used for the development of a large, distributed and highly loaded software systems. SObjectizer can also be used for small utilities and quick-and-dirty prototypes. The whole application can be built upon SObjectizer. Or SObjectizer can be used only for a small part of an application developed on the top of Qt, wxWidgets, ACE, Boost, etc. SObjectizer Team, Jan 2020
  • 8. Maturity SObjectizer is based on ideas that have been put forward in 1995-2000. And SObjectizer itself is being developed since 2002. SObjectizer-5 is continuously evolved since 2010. SObjectizer Team, Jan 2020
  • 9. Stability From the very beginning SObjectizer was used for business-critical applications, and some of them are still being used in production. Breaking changes in SObjectizer are rare and we approach to them very carefully. For example, branch 5.5 respects compatibility for more that four years. SObjectizer Team, Jan 2020
  • 10. Cross-platform SObjectizer runs on Windows, Linux, FreeBSD, macOS and Android. SObjectizer Team, Jan 2020
  • 11. Easy-to-use SObjectizer provides easy to understand and easy to use API with a lot of examples in the SObjectizer's distributive and a plenty of information in the project's Wiki* . https://github.com/Stiffstream/sobjectizer/wiki SObjectizer Team, Jan 2020
  • 12. Free SObjectizer is distributed under BSD-3-CLAUSE license, so it can be used in development of proprietary commercial software for free. SObjectizer Team, Jan 2020
  • 13. It's not dead! SObjectizer is one of a few live and evolving OpenSource actor frameworks for C++. There are more that 30 releases on SObjectizer-5 since it was open-sourced in May 2013. SObjectizer Team, Jan 2020
  • 14. It evolves SObjectizer-5.7 has much more features than the first public release of SObjectizer-5 had in 2013. During the evolution, SObjectizer incorporated several features that can be called game-changers... SObjectizer Team, Jan 2020
  • 15. Some of new features since 2013: ● agents as hierarchical state machines; ● mutability for messages; ● message chains; ● environment infrastructures; ● enveloped messages; ● dead-letter handlers; ● message-tracing; ● stop-guards; ● run-time monitoring; ● unit-testing of agents; ● ... SObjectizer Team, Jan 2020
  • 16. Let's dig into some details! SObjectizer Team, Jan 2020
  • 17. Using SObjectizer-5.7 a programmer must define messages/signals and implement agents for processing them. Agents are created by the programmer and are bound to dispatchers. Dispatchers are responsible for message dispatching and providing of working thread on which agents handle messages. SObjectizer Team, Jan 2020
  • 18. A programmer can create as many agents as needed. Agent is a lightweight entity. There could be thousands, millions and hundreds of millions of agents. Number of agents is limited only by amount of RAM and the common sense of a programmer. SObjectizer Team, Jan 2020
  • 19. A traditional "Hello, World" example. This is the main agent: #include <so_5/all.hpp> class hello_actor final : public so_5::agent_t { public: using so_5::agent_t::agent_t; void so_evt_start() override { std::cout << "Hello, World!" << std::endl; // Finish work of example. so_deregister_agent_coop_normally(); } }; SObjectizer Team, Jan 2020
  • 20. And this is the main() function: int main() { // Launch SObjectizer. so_5::launch([](so_5::environment_t & env) { // Add a hello_actor instance in a new cooperation. env.register_agent_as_coop( env.make_agent<hello_actor>() ); }); return 0; } SObjectizer Team, Jan 2020
  • 21. Let's see an example of timers and Publish/Subscribe. There will be a producer agent that will distribute new values on a periodic basis. And there will be a couple of consumers on that data. SObjectizer Team, Jan 2020
  • 22. Define a message with new data: #include <so_5/all.hpp> using namespace std::literals; // This message will be published to a multi-consumer message box on a periodic basis. struct acquired_value { std::chrono::steady_clock::time_point acquired_at_; int value_; }; SObjectizer Team, Jan 2020
  • 23. Agent-producer (fields and the constructor): class producer final : public so_5::agent_t { const so_5::mbox_t board_; // The destination for acquired_value. so_5::timer_id_t timer_; int counter_{}; // This signal will be sent by the timer. struct acquisition_time final : public so_5::signal_t {}; public: producer(context_t ctx, so_5::mbox_t board) : so_5::agent_t{std::move(ctx)}, board_{std::move(board)} {} SObjectizer Team, Jan 2020
  • 24. Agent-producer (the main methods): void so_define_agent() override { // A subscription to periodic signal. so_subscribe_self().event( [this](mhood_t<acquisition_time>) { // Publish the next value for all consumers. so_5::send<acquired_value>( board_, std::chrono::steady_clock::now(), ++counter_); } ); } void so_evt_start() override { // Agent will periodically recive acquisition_time signal // without initial delay and with period of 750ms. timer_ = so_5::send_periodic<acquisition_time>(*this, 0ms, 750ms); } }; SObjectizer Team, Jan 2020
  • 25. Agent-consumer: class consumer final : public so_5::agent_t { const so_5::mbox_t board_; const std::string name_; void on_value(mhood_t<acquired_value> cmd) { std::cout << name_ << ": " << cmd->value_ << std::endl; } public: consumer(context_t ctx, so_5::mbox_t board, std::string name) : so_5::agent_t{std::move(ctx)}, board_{std::move(board)}, name_{std::move(name)} {} void so_define_agent() override { so_subscribe(board_).event(&consumer::on_value); } }; SObjectizer Team, Jan 2020
  • 26. The main() function: int main() { so_5::launch([](so_5::environment_t & env) { auto board = env.create_mbox(); env.introduce_coop([board](so_5::coop_t & coop) { coop.make_agent<producer>(board); coop.make_agent<consumer>(board, "first"s); coop.make_agent<consumer>(board, "second"s); }); std::this_thread::sleep_for(4s); env.stop(); }); return 0; } SObjectizer Team, Jan 2020
  • 27. All agents in the example above works on the same default dispatcher. Let's bind them to different dispatchers... SObjectizer Team, Jan 2020
  • 28. so_5::launch([](so_5::environment_t & env) { auto board = env.create_mbox(); env.introduce_coop([&](so_5::coop_t & coop) { // A separate dispatcher for producer. coop.make_agent_with_binder<producer>( so_5::disp::one_thread::make_dispatcher(env).binder(), board); // And a separate dispatcher for consumers. auto disp = so_5::disp::active_obj::make_dispatcher(env); coop.make_agent_with_binder<consumer>(disp.binder(), board, "first"s); coop.make_agent_with_binder<consumer>(disp.binder(), board, "second"s); }); ... }); SObjectizer Team, Jan 2020
  • 29. SObjectizer has several ready-to-use dispatchers: ● one_thread. All agents work on a single working thread; ● active_obj. Every agent works on a single dedicated working thread; ● active_group. A single dedicated working thread is allocated for a group of agents; ● thread_pool. A working thread is selected from thread pool. Agents can be moved from one working thread to another. But an agent can’t work on two threads at the same time; ● adv_thread_pool. A working thread is selected from thread pool. Agents can be moved from one working thread to another. Moreover an agent can work on several threads at the same time (if the agent’s event handlers are marked as thread safe); ● prio_one_thread (strictly_ordered and quoted_round_robin). One working thread and dispatching with respect to agent’s priorities; ● prio_dedicated_threads::one_per_prio. One working thread per a priority. SObjectizer Team, Jan 2020
  • 30. A programmer can create any number of dispatchers needed. This allows to bind agents to different context in such a way that the impact of one agent on another will be minimal. For example: ● one one_thread dispatcher for AMQP-client agent; ● one thread_pool dispatcher for handling requests from AMQP-queues; ● one active_obj dispatcher for DBMS-related agents; ● yet another active_obj dispatcher for agents whose work with HSMs connected to the computer; ● and yet another thread_pool dispatcher for agents for managing all the stuff described above. SObjectizer Team, Jan 2020
  • 31. SObjectizer even allows writing an application without actors... SObjectizer Team, Jan 2020
  • 32. You can write a multithreaded application using only plain std::thread and SObjectizer's mchains. mchain in SObjectizer is an analog of CSP-channel. Let's see a ping-pong between worker threads via mchains... SObjectizer Team, Jan 2020
  • 33. Ping-pong on plain threads and mchains (1) #include <so_5/all.hpp> struct ping { int counter_; }; struct pong { int counter_; }; SObjectizer Team, Jan 2020
  • 34. Ping-pong on plain threads and mchains (2) void pinger_proc(so_5::mchain_t self_ch, so_5::mchain_t ping_ch) { so_5::send<ping>(ping_ch, 1000); // The initial "ping". // Read all message until channel will be closed. so_5::receive( so_5::from(self_ch).handle_all(), [&](so_5::mhood_t<pong> cmd) { if(cmd->counter_ > 0) so_5::send<ping>(ping_ch, cmd->counter_ - 1); else { // Channels have to be closed to break `receive` calls. so_5::close_drop_content(self_ch); so_5::close_drop_content(ping_ch); } }); } SObjectizer Team, Jan 2020
  • 35. Ping-pong on plain threads and mchains (3) void ponger_proc(so_5::mchain_t self_ch, so_5::mchain_t pong_ch) { int pings_received{}; // Read all message until channel will be closed. so_5::receive( so_5::from(self_ch).handle_all(), [&](so_5::mhood_t<ping> cmd) { ++pings_received; so_5::send<pong>(pong_ch, cmd->counter_); }); std::cout << "pings received: " << pings_received << std::endl; } SObjectizer Team, Jan 2020
  • 36. Ping-pong on plain threads and mchains (4) int main() { so_5::wrapped_env_t sobj; auto pinger_ch = so_5::create_mchain(sobj); auto ponger_ch = so_5::create_mchain(sobj); std::thread pinger{pinger_proc, pinger_ch, ponger_ch}; std::thread ponger{ponger_proc, ponger_ch, pinger_ch}; ponger.join(); pinger.join(); return 0; } SObjectizer Team, Jan 2020
  • 37. SObjectizer-5.7 provides a select() function that can be compared with Go's select statement. SObjectizer's select() allows doing non-blocking send to a mchain with waiting of an incoming message from another mchain(s). Let's see how famous Go's example* with the calculation of Fibonacci numbers in different goroutines can look like in SObjectizer. https://tour.golang.org/concurrency/5 SObjectizer Team, Jan 2020
  • 38. Calculation of Fibonacci numbers in different threads (1) #include <so_5/all.hpp> #include <chrono> using namespace std; using namespace std::chrono_literals; using namespace so_5; struct quit {}; SObjectizer Team, Jan 2020
  • 39. Calculation of Fibonacci numbers in different threads (2) void fibonacci( mchain_t values_ch, mchain_t quit_ch ) { int x = 0, y = 1; mchain_select_result_t r; do { r = select( from_all().handle_n(1), send_case( values_ch, message_holder_t<int>::make(x), [&x, &y] { auto old_x = x; x = y; y = old_x + y; } ), receive_case( quit_ch, [](quit){} ) ); } while( r.was_sent() && !r.was_handled() ); // Continue while nothing received. } SObjectizer Team, Jan 2020
  • 40. Calculation of Fibonacci numbers in different threads (3) int main() { wrapped_env_t sobj; thread fibonacci_thr; auto thr_joiner = auto_join( fibonacci_thr ); // Automatically join thread at exit. auto values_ch = create_mchain( sobj, 1s, 1, // Limit the capacity of Fibonacci numbers chain. mchain_props::memory_usage_t::preallocated, mchain_props::overflow_reaction_t::abort_app ); auto quit_ch = create_mchain( sobj ); fibonacci_thr = thread{ fibonacci, values_ch, quit_ch }; // A separate thread for the calculation. receive( from( values_ch ).handle_n( 10 ), []( int v ) { cout << v << endl; } ); send< quit >( quit_ch ); } SObjectizer Team, Jan 2020
  • 41. SObjectizer is not a silver bullet SObjectizer Team, Jan 2020
  • 42. SObjectizer supports several concurrency models. SObjectizer makes the development of complex multithreaded applications easier. It's proved by 18 years of usage "in production". But SObjectizer doesn't solve all the problems... SObjectizer Team, Jan 2020
  • 43. SObjectizer is responsible for: ● in-process message dispatching; ● providing working thread for message processing; ● SObjectizer Run-Time’s parameters tuning; ● collecting of run-time stats (if enabled); ● message delivery process tracing (if enabled). SObjectizer Team, Jan 2020
  • 44. And SObjectizer-5 doesn't support development of distributed application just "out of box". Additional libraries and tools should be used for that. SObjectizer Team, Jan 2020
  • 45. Some more info about SObjectizer-5.7.0 SObjectizer Team, Jan 2020
  • 46. SObjectizer-5.7 is developed using C++17. Supported compilers and platforms: ● Visual Studio 2019, GCC 7.1-9.2, clang 6.0-9.0 ● Windows, Linux, FreeBSD and MacOS. Support of other platforms is possible in the case when SObjectizer’s developers will have an access to those platforms. SObjectizer Team, Jan 2020
  • 47. Version 5.7.0 is ~31 KLOC of SObjectizer core. Plus ~41 KLOC of tests. Plus ~8 KLOC of samples. Plus SObjectizer’s core documentation*. Plus articles and presentations** (some of them in Russian). * https://github.com/Stiffstream/sobjectizer/wiki ** http://sourceforge.net/p/sobjectizer/wiki/Articles/ SObjectizer Team, Jan 2020
  • 48. Useful references: Project’s home: https://github.com/Stiffstream/sobjectizer Documentation: https://github.com/Stiffstream/sobjectizer/wiki Google-group: https://groups.google.com/forum/#!forum/sobjectizer Support: https://stiffstream.com