长版本: 我是erlang的新手,并考虑将其用于可扩展的体系结构。 我发现这个平台的许多支持者都鼓吹其可靠性和容错性。 然而,我很难理解在这个系统中如何实现容错,在这个系统中消息在瞬态存储器中排队。 我明白,可以安排一个主pipe层级来重生死亡的进程,但是我一直没有find关于重新进行的进程的影响的讨论。 飞行中的消息和部分完成的工作在垂死的节点上丢失了什么? 当消费者stream程死亡时,所有的生产者是否都会自动转发消息? 如果不是的话,这怎么可以被认为是容错? 如果是这样,什么阻止了一个被处理的消息 – 但不是很确认 – 被转发,因此被不适当地重新处理? (我认识到这些问题并不是erlang所特有的,在任何分布式处理系统中都会出现类似的问题,但是erlang的爱好者似乎声称这个平台使得这一切都变得“容易” 假设消息被重新传输,我可以很容易的想象一个情况,即一个复杂的消息传递链的下游影响可能在故障后变得非常混乱。 如果没有某种沉重的分布式事务系统,我不明白如何在不重复每一个过程的情况下保持一致性和正确性。 我的应用程序代码是否必须始终强制执行约束以防止事务被多次执行? 简洁版本: 分布式erlang进程是否受到重复消息的影响? 如果是这样,重复保护(即幂等)应用责任,或者erlang / OTP以某种方式帮助我们呢?
我目前正试图开始与阿卡,我面临一个奇怪的问题。 我的演员有以下代码: class AkkaWorkerFT extends Actor { def receive = { case Work(n, c) if n < 0 => throw new Exception("Negative number") case Work(n, c) => self reply n.isProbablePrime(c); } } 这就是我开始工作的方式: val workers = Vector.fill(nrOfWorkers)(actorOf[AkkaWorkerFT].start()); val router = Routing.loadBalancerActor(SmallestMailboxFirstIterator(workers)).start() 这就是我如何closures一切: futures.foreach( _.await ) router ! Broadcast(PoisonPill) router ! PoisonPill 现在会发生什么,如果我发送工作人员消息与n> 0(没有例外抛出),一切工作正常,应用程序正常closures。 但是,只要我发送一条消息导致exception,应用程序就不会终止,因为仍然有一个actor正在运行,但我无法弄清楚它来自哪里。 如果有帮助,这是所讨论的线程的堆栈: […]
我们正在编译一个embedded式C / C ++应用程序,这个应用程序是在一个被电离辐射轰炸的环境中的屏蔽设备中部署的。 我们正在使用GCC和ARM交叉编译。 部署时,我们的应用程序会生成一些错误的数据,并且会更频繁地崩溃。 硬件是为这个环境devise的,我们的应用程序已经在这个平台上运行了好几年。 我们可以对代码进行修改,还是可以通过编译时的改进来识别/纠正由于单个事件造成的软错误和内存损坏? 有没有其他开发者成功地减less了软件错误对长时间运行的应用程序的有害影响?