![](https://csdnimg.cn/release/download_crawler_static/12464458/bg11.jpg)
Akka Scala Documentation, Release 2.4.14
• If one actor depends on another actor for carrying out its duty, it should watch that other actor’s liveness
and act upon receiving a termination notice. This is different from supervision, as the watching party has
no influence on the supervisor strategy, and it should be noted that a functional dependency alone is not a
criterion for deciding where to place a certain child actor in the hierarchy.
There are of course always exceptions to these rules, but no matter whether you follow the rules or break them,
you should always have a reason.
2.2.2 Configuration Container
The actor system as a collaborating ensemble of actors is the natural unit for managing shared facilities like
scheduling services, configuration, logging, etc. Several actor systems with different configuration may co-exist
within the same JVM without problems, there is no global shared state within Akka itself. Couple this with the
transparent communication between actor systems—within one node or across a network connection—to see that
actor systems themselves can be used as building blocks in a functional hierarchy.
2.2.3 Actor Best Practices
1. Actors should be like nice co-workers: do their job efficiently without bothering everyone else needlessly
and avoid hogging resources. Translated to programming this means to process events and generate re-
sponses (or more requests) in an event-driven manner. Actors should not block (i.e. passively wait while
occupying a Thread) on some external entity—which might be a lock, a network socket, etc.—unless it is
unavoidable; in the latter case see below.
2. Do not pass mutable objects between actors. In order to ensure that, prefer immutable messages. If the
encapsulation of actors is broken by exposing their mutable state to the outside, you are back in normal Java
concurrency land with all the drawbacks.
3. Actors are made to be containers for behavior and state, embracing this means to not routinely send behavior
within messages (which may be tempting using Scala closures). One of the risks is to accidentally share
mutable state between actors, and this violation of the actor model unfortunately breaks all the properties
which make programming in actors such a nice experience.
4. Top-level actors are the innermost part of your Error Kernel, so create them sparingly and prefer truly
hierarchical systems. This has benefits with respect to fault-handling (both considering the granularity of
configuration and the performance) and it also reduces the strain on the guardian actor, which is a single
point of contention if over-used.
2.2.4 Blocking Needs Careful Management
In some cases it is unavoidable to do blocking operations, i.e. to put a thread to sleep for an indeterminate
time, waiting for an external event to occur. Examples are legacy RDBMS drivers or messaging APIs, and the
underlying reason is typically that (network) I/O occurs under the covers. When facing this, you may be tempted
to just wrap the blocking call inside a Future and work with that instead, but this strategy is too simple: you are
quite likely to find bottlenecks or run out of memory or threads when the application runs under increased load.
The non-exhaustive list of adequate solutions to the “blocking problem” includes the following suggestions:
• Do the blocking call within an actor (or a set of actors managed by a router [Java, Scala]), making sure to
configure a thread pool which is either dedicated for this purpose or sufficiently sized.
• Do the blocking call within a Future, ensuring an upper bound on the number of such calls at any point in
time (submitting an unbounded number of tasks of this nature will exhaust your memory or thread limits).
• Do the blocking call within a Future, providing a thread pool with an upper limit on the number of threads
which is appropriate for the hardware on which the application runs.
• Dedicate a single thread to manage a set of blocking resources (e.g. a NIO selector driving multiple chan-
nels) and dispatch events as they occur as actor messages.
2.2. Actor Systems 13