- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Akka(Java 库,v2.3.9)的新手。我正在尝试关注 supervisor hierarchy best practices ,但由于这是我的第一个 Akka 应用程序,我在某处遇到了心理障碍。
在我的第一个 Akka 应用程序(实际上是一个旨在跨多个应用程序重用的库)中,来自外部世界的输入表现为 Process
传递给 Actor 的消息。使用我的应用程序的开发人员将提供一个基于文本的配置文件,最终配置发送哪些参与者 Process
实例,哪些没有。换句话说,假设这些是我的 Actor 类:
// Groovy pseudo-code
class Process {
private final Input input
Process(Input input) {
super()
this.input = deepClone(input)
}
Input getInput() {
deepClone(this.input)
}
}
class StormTrooper extends UntypedActor {
@Override
void onReceive(Object message) {
if(message instanceof Process) {
// Process the message like a Storm Trooper would.
}
}
}
class DarthVader extends UntypedActor {
@Override
void onReceive(Object message) {
if(message instanceof Process) {
// Process the message like Darth Vader would.
}
}
}
class Emperor extends UntypedActor {
@Override
void onReceive(Object message) {
if(message instanceof Process) {
// Process the message like the Emperor would.
}
}
}
// myapp-config.json -> where the actors are configured, along with other
// app-specific configs
{
"fizzbuzz": "true",
"isYosemite": "false",
"borderColor": "red",
"processors": [
"StormTrooper",
"Emperor"
]
}
正如你在配置文件中看到的,只有StormTrooper
和 Emperor
被选中接收Process
消息。这最终导致零 (0) DarthVader
正在创建的 Actor 。这也是我的意图,这将导致 Set<ActorRef>
可供填充有 StormTrooper
的应用程序使用和 Emperor
像这样:
class SomeApp {
SomeAppConfig config
static void main(String[] args) {
String configFileUrl = args[0] // Nevermind this horrible code
// Pretend here that configFileUrl is a valid path to
// myapp-config.json.
SomeApp app = new SomeApp(configFileUrl)
app.run()
}
SomeApp(String url) {
super()
config = new SomeAppConfig(url)
}
void run() {
// Since the config file only specifies StormTrooper and
// Emperor as viable processors, the set only contains instances of
// these ActorRef types.
Set<ActorRef> processors = config.loadProcessors()
ActorSystem actorSystem = config.getActorSystem()
while(true) {
Input input = scanForInput()
Process process = new Process(input)
// Notify each config-driven processor about the
// new input we've received that they need to process.
processors.each {
it.tell(process, Props.self()) // This isn't correct btw
}
}
}
}
因此,正如您(希望)看到的那样,我们拥有处理 UntypedActor
的所有这些参与者(实际上,有数十个 Process
impl)消息(反过来,从某些来源捕获 Input
)。至于哪些 Actor 还活着/在线来处理这些 Process
消息完全由配置驱动。最后,每次应用程序收到 Input
, 它被注入(inject)一个 Process
消息,然后Process
消息被发送到所有已配置/Activity 的 Actor 。
有了这个作为给定的背景故事/设置,我无法确定“ Actor /主管层次结构”需要是什么。在我的用例中,似乎所有参与者都是真正平等的,他们之间没有监督结构。 StormTrooper
只收到 Process
如果该类型的参与者被配置为存在,则消息。其他 actor 子类也一样。
我是不是完全遗漏了什么?如果所有参与者都是平等的并且层次结构本质上是“扁平”/水平的,我该如何定义监督层次结构(用于容错目的)?
最佳答案
如果您只想为每个 Actor 实例化一个实例 - 您可能需要 SenatorPalpatine
来监督这三个实例。如果您可能有多个 StormTrooper
- 您可能希望让 JangoFett
actor 负责创建(并可能杀死)他们,一些 router也是不错的选择(它会自动监督他们)。这也将使您能够在失败时重新启动所有士兵(OneForAllStrategy
),能够广播,保存一些常见的统计信息等。
带有路由器的示例(伪 Scala):
//application.conf
akka.actor.deployment {
/palpatine/vader {
router = broadcast-pool
nr-of-instances = 1
}
/palpatine/troopers {
router = broadcast-pool
nr-of-instances = 10
}
}
class Palpatine extends Actor {
import context._
val troopers = actorOf(FromConfig.props(Props[Trooper],
"troopers").withSupervisorStrategy(strategy) //`strategy` is strategy for troopers
val vader = actorOf(FromConfig.props(Props[Vader]), "vader")
override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1) //stategy for Palpatine's children (routers itself)
val strategy = OneForOneStrategy(maxNrOfRetries = 100, withinTimeRange = 1) //stategy for troopers
def receive = {
case p@Process => troopers ! p; vader ! p
case t@Terminted => println(t)
}
}
根据标准 akka-config 创建广播池.我还展示了您可以分别为它们定制监督策略。
如果您希望某些 actor 出于某种原因忽略消息 - 只需在 actor 内部实现此逻辑,例如:
class Vader extends Actor {
def receive {
case p@Process => ...
case Ignore => context.become(ignore) //changes message handler to `ignore`
}
def ignore = {
case x => println("Ignored message " + x)
case UnIgnore => context.become(process)//changes message handler back
}
}
这将动态配置忽略/取消忽略(否则它只是一个简单的if
)。您可以根据某些配置向参与者发送 Ignore
消息:
val listOfIgnorantPathes = readFromSomeConfig()
context.actorSelection(listOfIgnoredPathes) ! Ignore
如果你想从配置中控制异构广播,你也可以像 trooper 的路由器一样为 palpatine 创建广播器(只需使用组而不是池):
akka.actor.deployment {
... //vader, troopers configuration
/palpatine/broadcaster {
router = broadcast-group
routees.paths = ["/palpatine/vader", "/palpatine/troopers"]
}
}
class Palpatine extends Actor {
... //vader, troopers definitions
val broadcaster = actorOf(FromConfig.props(), "broadcaster")
def receive = {
case p@Process => broadcaster ! p
}
}
只需将 vader 从 routees.paths
中排除,使他不会收到 Process
消息。
附言Actor 永远不会孤单 - 总是有 Guardian Actor(参见 The Top-Level Supervisors ),它会在出现异常时关闭整个系统。因此,无论哪种方式,SenatorPalpatine
都可能成为您的救星。
附言2 context.actorSelection("palpatine/*")
实际上允许您向所有 child 发送消息(作为广播池和组的替代方法),因此您不需要在其中设置一组。
关于java - 如何确定 Akka actor/supervisor 层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29774075/
我已经使用 Gunicorn + Nginx + Supervisor 部署了一个 Flask 应用程序。它不起作用。在线搜索发现了几个类似问题的报告,但没有一个有适合我们情况的解释或解决问题的修复程
一、简介 Supervisor 是一款 Python 开发的进程管理系统,允许用户监视和控制 Linux 上的进程,能将一个普通命令行进程变为后台守护进程,异常退出时能自动重启 详细介绍查阅:Supe
一, 简介 Dockerfile 运行只支持一条命令,当在Docker里要运行多条命令,用supervisor来管理就比较合适了。 Supervisor是一个 Python 开发的 client
我正在使用 Gunicorn 和 Nginx 与主管一起运行 django 项目。一切正常,但是当我对代码进行一些更改时,主管无法识别它,但它仍然读取旧代码。你能帮我么。我试图重新启动 supervi
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我使用 erlang 作为服务之间的桥梁,我想知道人们对处理断开的连接有什么建议? 我正在从本地文件获取输入并将它们通过管道传输到 AMQP,可以想象 AMQP 代理可能会崩溃。对于这种情况,我想继续
我在哪里可以找到有关如何将动态子进程添加到现有主管的示例( simple_one_for_one 重启策略)? 最佳答案 我做了一些研究,以下是我所拥有的。 首先,这是一个主管的示例回调模块: -mo
我可以为不同的 django-celery 项目使用不同的 supervisor.conf 文件吗? 我在项目本身中为他们两个创建了单独的主管,但主管只与一个一起工作。有什么办法可以分别为它们保存配置
我已经看到了将SupervisorJob传递给CoroutineScope的教程,以避免在子例程之一失败时所有协程作业被取消。 在run3中,我认为将SupervisorJob传递给launch可以获
如何为使用系统上下文创建的两个参与者设置两个不同的主管策略: val exporter = system.actorOf(Props[DataExporter], name = "dataExport
以下是每 2 秒运行 supervisorctl status 的状态预览: [root@docker] ~ # supervisorctl status nginx
编辑:显然脚本确实运行了,但它只是没有启动我的浏览器。仍然不知道为什么。 我正在尝试使用 supervisor 来运行命令/脚本,但我似乎无法让它工作。 我得到了 Pi_Video_looper 的想
我必须运行 laravel 命令 php artisan queue:work --daemon 来运行存储在 Beanstalkd 队列中的作业。 我遇到了两种可能的解决方案: 使用 Supervi
如果我从 apt-get 安装 supervisor 我得到版本 3.0b2-1 如果我运行 sudo service supervisor status 我得到 is running(旧的测试版工作
我正在尝试在主管 (http://supervisord.org/) 的监督下运行流程。 我有两个运行几乎相同环境的环境(Ubuntu 12.04 LTS)。 目前的问题是我尝试在Supervisor
我正在尝试进行自动部署,包括 supervisord 和默认设置路径混淆。 我发现的每个部署方案都使用 /etc/supervisor/supervisor.conf 和 /etc/superviso
Supervisor执行的命令中如何导出环境变量?我第一次尝试: command="export SITE=domain1; python manage.py command" 但主管报告“找不到命令
Docker容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务。 但我们经常需要在一个机器上开启多个服务,这可以有很多方法,最简单的就是把多个启动命令放到
我已经安装并配置了 supervisor。 ps -ax 显示 10 个进程,例如:php/home/vagrant/Sites/mysite/artisan queue:work --tries=1
有人可以解释 Elixir 中的 Supervisor 和 DynamicSupervisor 之间的区别吗? 最佳答案 A DynamicSupervisor is a supervisor des
我是一名优秀的程序员,十分优秀!