Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing 代理程序崩溃后重新启动_Testing_Logging_Distributed_Verification_Atomicity - Fatal编程技术网

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程序员,我绝对推荐你阅读。我相信其他语言也有很好的对应词。

    谢谢你的详细回答。我会读你建议的内容:)