长版:
我是erlang的新手,并考虑将其用于可扩展的架构.我发现该平台的许多支持者都在宣传其可靠性和容错性.
但是,我很难准确理解在这个消息在瞬态内存中排队的系统中如何实现容错.我知道可以安排一个主管层级来重新生成已故的流程,但我一直无法找到很多关于重生工作对正在进行的工作的影响的讨论.在飞行中的消息和在垂死节点上丢失的部分完成的工作的工件会发生什么?
当消费者进程死亡时,所有生成器是否会自动重新传输未被确认的消息?如果没有,这怎么可以被认为是容错的?如果是这样的话,是什么阻止了被处理的消息 - 但不是很确认 - 被重新传输,因此不适当地重新处理?
(我认识到这些问题不是erlang独有的;在任何分布式处理系统中都会出现类似的问题.但是erlang爱好者似乎声称平台让这一切变得"简单"......?)
假设重新传输消息,我可以很容易地想象出一个复杂的消息链的下游影响在发生故障后可能变得非常混乱的情况.如果没有某种繁重的分布式事务系统,我不明白如何在不解决每个进程中的重复的情况下保持一致性和正确性.我的应用程序代码是否必须始终强制执行约束以防止事务被多次执行?
精简版:
分布式erlang进程是否受重复消息的影响?如果是这样,是重复保护(即,幂等)应用程序的责任,还是erlang/OTP以某种方式帮助我们?
我正在使用ruby中的文本编辑器,我需要支持使用用户提供的正则表达式模式的"查找"功能.这是一个简单(熟悉)的用例:
Joe User正在编辑文本文件,并将光标定位在文件中间的某个位置.他想从当前光标位置向后搜索与任意正则表达式匹配的最近子字符串.
我认为这个问题相当于将用户的模式应用于文件中光标位置之前的整个字符串.当然,我可以从文件的开头循环遍历所有匹配并使用最后一个匹配,但这看起来非常低效......最好搜索"从右到左",但我还没有找到办法这与ruby Regexp.你能帮我吗?
我遇到了一个棘手的问题,我似乎无法解决java泛型问题.这有点复杂,但我想不出更简单的场景来说明问题......这里有:
我有一个需要Context的Processor类.有不同类型的Context; 大多数处理器只需要任何抽象的Context,但其他处理器需要特定的子类.像这样:
abstract class AbstractProcessor<C extends Context> {
public abstract void process(C context);
}
class BasicProcessor extends AbstractProcessor<Context> {
@Override
public void process(Context context) {
// ... //
}
}
class SpecificProcessor extends AbstractProcessor<SpecificContext> {
@Override
public void process(SpecificContext context) {
// ... //
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,很酷:处理器可以声明他们需要的Context类型,他们可以假设正确的类型将被传递到process()而不需要强制转换.
现在,我有一个Dispatcher类,它拥有字符串到处理器的映射:
class Dispatcher<C extends Context> {
Map<String, AbstractProcessor<? super C>> processorMap = new HashMap<String, AbstractProcessor<? super C>>();
public void registerProcessor(String name, AbstractProcessor<? super C> processor) {
processorMap.put(name, processor);
}
public void dispatch(String …Run Code Online (Sandbox Code Playgroud) abstraction ×1
erlang ×1
generics ×1
java ×1
messaging ×1
regex ×1
reliability ×1
reverse ×1
ruby ×1
transactions ×1