2011-03-11 8 views
0

분산 에이전트 시스템이 전역 변수의 값을 수정, 상기 분산 은행 응용 프로그램을 고려 충돌 후 에이전트 프로그램을 다시 시작 "균형"

그래서, 에이전트의 요청이 대기하고 말한다. 요청은 특정 에이전트를 대신하여 값이 전역 변수에 추가되는 형식입니다. 에이전트의 코드는 다음 분명히 요청을 다시 처리하지 말아야 포인트 B에 충돌, 그렇지 않으면 변수가 동일한 두 번 수정 될,

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 
    } 

자 : 그래서, 에이전트에 대한 코드의 형식은 의뢰. 이를 방지하기 위해, 우리는 따라서 코드가 원자 수 :

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 
} 
}  

을 나는이 질문에 대한 답을 찾고 있어요 : '자동으로'원자 적으로 실행해야 할 코드의 포인트를 확인하는 방법

  1. ?
  2. 실행 중에 코드가 충돌하는 경우 "트랜잭션 및 변수 값 기록"에 어느 정도 도움이됩니까? 추락 한 상담원의 문제를 해결하기위한 다른 접근 방법이 있습니까?
  3. 다시 말하지만 많은 수의 변수가있는 큰 응용 프로그램에서는 로깅을 확장 할 수 없습니다. 이 경우 우리는 처음부터 다시 실행하는 대신 무엇을 할 수 있습니까?
  4. 일반적으로 함께 작동하는 에이전트의 경우 이러한 원자 블록을 식별 할 수 있습니다. 한 에이전트가 실패하면 다른 에이전트가 다시 시작될 때까지 기다려야합니까? 소프트웨어 테스팅은 잠재적 인 사례를 식별하는 데 어떻게 도움이 될 수 있습니까? 에이전트가 충돌하면 일관성없는 프로그램 상태가 관찰됩니다.
  5. 원자 블록을보다 세분화하여 성능 병목 현상을 줄이는 방법은 무엇입니까?

답변

0

Q> 코드에서 자동으로 실행해야하는 코드를 식별하는 방법은 무엇입니까?
A> 언제든지 서로 다른 컨텍스트에서 공유되는 상태 정보가있을 수 있습니다 (반드시 모든 당사자가 적어도 하나 이상을 가질 수있는 뮤 테이터이어야 함). 서로 다른 상담원이 공유하는 balance이 있습니다.

Q> 실행 중에 코드가 충돌하는 경우 "트랜잭션 및 변수 값 기록"에 도움이됩니까? 추락 한 상담원의 문제를 해결하기위한 다른 접근 방법이 있습니까?
A> 도움이되지만 비용이 많이 든다. X 항목을 롤백하고 시나리오를 재생해야합니다. 더 나은 방법은 모든 트랜잭션을 수행하거나 effective automatic rollback scenario을 가져 오는 것입니다.

Q> 다시 말하면 많은 변수가있는 큰 응용 프로그램에서는 로깅을 확장 할 수 없습니다. 이 경우 우리는 처음부터 다시 실행하는 대신 무엇을 할 수 있습니까?
A> 경우에 따라 일관성을 완화 할 수 있습니다. 예를 들어, CopyOnWriteArrayList은 동시 쓰기 숨김을 수행하고 새 판독기가 사용 가능 해지면 데이터를 전환합니다. 쓰기가 실패하면 안전하게 데이터를 삭제할 수 있습니다. compare and swap도 있습니다. 또한 이전 질문에 대한 링크를 참조하십시오.

Q> 일반적으로 함께 작동하는 에이전트의 경우 이러한 원자 블록을 식별 할 수 있습니다.
A> 첫 번째 질문을보십시오.

Q> 하나의 에이전트가 실패하면 다른 에이전트가 다시 시작될 때까지 기다려야합니까?
A> 정책/API의 대부분은 중요한 섹션 실행에 대해 maximum timeouts을 정의합니다. 그렇지 않으면 시스템이 영구 교착 상태가 될 위험이 있습니다.

Q> 소프트웨어 테스팅은 잠재적 인 사례를 식별하는 데 어떻게 도움이 될 수 있으며, 에이전트가 충돌 할 경우 일관성없는 프로그램 상태가 관찰됩니다.
A> 공정한 정도입니다. 그러나 동시 코드를 테스트 할 때는 코드 자체를 작성하는 기술이 필요합니다.

Q> 성능 병목 현상을 줄이기 위해 원자 블록을보다 세밀하게 만드는 방법은 무엇입니까?
A> 당신이 직접 질문에 대답했습니다 :) 하나의 원자 적 연산이 10 개의 다른 공유 상태 변수를 수정해야하는 경우, 외부 계약을 푸시하려고 시도 할 때 따로 할 수있는 것이 많기 때문에 더 많이 수정해야합니다. 이것은 데이터베이스가 NoSQL 스토어처럼 확장 가능하지 않은 이유입니다. 외부 키에 따라 수정하거나 트리거를 실행해야 할 수도 있습니다. 또는 불변성을 촉진 시키십시오.

자바 프로그래머라면 this book을 읽는 것이 좋습니다. 나는 다른 언어들에 대해서도 좋은 대응이 있다고 확신한다.

+0

자세한 답변을 보내 주셔서 감사합니다. 나는 당신이 제안한 것들을 읽을 것이다 :) – user655617