이 질문의 약간의 투기성에 대한 사과.메모리 내 이벤트 소싱 알고리즘 - 맞습니까? 그것은 threadsafe입니까?
시스템의 현재 상태를 유지하기 위해 메모리 내 정적 개체를 사용하여 Cms를 작성하고 이벤트 소싱을 사용하여 개체 상태를 다시 작성하고 롤백을 제공하는 데 사용할 수있는 이벤트 로그를 만듭니다. 등의 실행 또는 재 구축 시간이 오래 걸리는 경우 쌓아 쓰기의 많은의 가능성에서 제외
public class Cms
{
private static object WriteLock = new object();
public static Cms Read { get; set; }
static Cms Write { get; set; }
static Cms()
{
Read = RebuildFromActionLog();
Write = RebuildFromActionLog();
}
public static void Update(Action action)
{
lock (WriteLock)
{
try
{
action.Apply(Write);
}
catch(Exception ex)
{
Write = RebuildFromActionLog(); //ditch the potentially messed up Write model
throw;
}
LogAction(action); //the action was a keeper, so keep it
Read = Write; //ditch the current read only model - it will continue to be used by any requests that have grabbed it
Write = RebuildFromActionLog(); //get a new model ready for the next write
}
}
...
}
(더 내가 약에 누구인지 모를 경우 http://martinfowler.com/articles/lmax.html를 참조), 많은 메모리의 가능성 사용할 수있는 버그가 있습니까? 특히 동시성 관련 버그가 있습니까?
starvetion 모드로 쓰레드가 없습니까? 잠금 장치 {} 블록을 사용하면 많은 시간이 걸리는 작업을 수행하지 않아야합니다. 또한, 하나의 스레드가 alock을 획득했고 해당 catch 블록이 예외를 발생시킨 경우이를 catch {} 블록에 던집니다. 그럼 자물쇠가 풀려날 것이라고 생각합니까 ?? – Zenwalker
흠 어쩌면 이것은 동시 목록 또는 무언가로서 더 좋을 것이고, 그곳에 작업 큐를 올려 놓을 것입니다. 좋은 지적입니다! 나는 예외가 안전하다고 생각한다 : http://stackoverflow.com/questions/639493/in-c-how-can-i-safely-exit-a-lock-with-a-try-catch-block-inside – mcintyre321
그는 잡기에서 던지고있다, 자물쇠는 결코 풀어 놓이지 않는다 나는 짐작한다. 내가 틀렸다면 나를 바로 잡습니다. 또한 스레드가 예외를 throw하면 응용 프로그램이 중단됩니다. – Zenwalker