Testing 代理程序崩溃后重新启动
考虑一个分布式银行应用程序,其中分布式代理机器修改全局变量的值:比如“余额” 因此,代理的请求排队。请求的形式为代表特定代理向全局变量添加值。因此,代理代码的格式如下:Testing 代理程序崩溃后重新启动,testing,logging,distributed,verification,atomicity,Testing,Logging,Distributed,Verification,Atomicity,考虑一个分布式银行应用程序,其中分布式代理机器修改全局变量的值:比如“余额” 因此,代理的请求排队。请求的形式为代表特定代理向全局变量添加值。因此,代理代码的格式如下: agent { look_queue(); // take a look at the leftmost request on queue without dequeuing lock_global_variable(balance,agent_machine_id); ///
agent
{
look_queue(); // take a look at the leftmost request on queue without dequeuing
lock_global_variable(balance,agent_machine_id);
///////////////////// **POINT A**
modify(balance,value);
unlock_global_variable(balance,agent_machine_id);
/////////////////// **POINT B**
dequeue(); // once transaction is complete, request can be dequeued
}
现在,如果代理的代码在B点崩溃,那么显然不应该再次处理该请求,否则该变量将为同一请求修改两次。为了避免这种情况,我们可以使代码原子化,因此:
agent
{
look_queue(); // take a look at the leftmost request on queue without dequeuing
*atomic*
{
lock_global_variable(balance,agent_machine_id);
modify(balance,value);
unlock_global_variable(balance,agent_machine_id);
dequeue(); // once transaction is complete, request can be dequeued
}
}
我正在寻找这些问题的答案:
Q>
如何识别代码中需要自动执行的点?A>
任何时候,当在不同上下文中共享任何有状态的内容时(不一定所有各方都需要是变种人,至少需要一个)。在您的情况下,不同代理之间共享余额
Q>
如果代码在执行过程中崩溃,“记录事务和变量值”有多大帮助?还有其他方法可以解决崩溃代理的问题吗?
A>
它可能会有所帮助,但附带的成本很高。您需要回滚X个条目、重播场景等。更好的方法是要么使其成为事务性的,要么使其具有事务性
Q>
同样,日志记录对于具有大量变量的大型应用程序是不可扩展的。在这种情况下,我们能做些什么?而不是从头开始执行?
A>
在某些情况下,您可以放松一致性。例如,当数据可用时,并发写回并为新读卡器打开数据。如果写入失败,它可以安全地丢弃该数据。还有。另请参见上一个问题的链接
Q>
一般来说,如果代理一起工作,如何识别这样的原子块。
A>
查看您的第一个问题
Q>
如果一个代理失败,其他代理必须等待它重新启动?
A>
大多数策略/API都是为关键部分的执行而定义的,否则可能会导致系统陷入永久性死锁
Q>
软件测试如何帮助我们识别潜在的情况,即如果代理崩溃,会观察到不一致的程序状态。
A>
它可以达到相当的程度。然而,测试并发代码需要与编写代码本身一样多的技能,如果不是更多的话
Q>
如何使原子块更细粒度,以减少性能瓶颈?
A>
您自己已经回答了这个问题:)如果一个原子操作需要修改10个不同的共享状态变量,那么除了尝试向下推外部契约,使其需要修改更多之外,您无能为力。这就是为什么数据库不像NoSQL存储那样具有可伸缩性的原因——它们可能需要根据外键进行修改、执行触发器等,或者尝试提高不变性
如果你是Java程序员,我绝对推荐你阅读。我相信其他语言也有很好的对应词。谢谢你的详细回答。我会读你建议的内容:)