Извините за слегка умозрительный характер этого вопроса.
Я пишу Cms, используя статический объект в памяти для хранения текущего состояния системы, и использую Event Sourcing для создания журнала событий, который я могу использовать для восстановления состояния объекта, а также для обеспечения отката и т. Д. (см. http://martinfowler.com/articles/lmax.html, если вы не знаете, о чем я)
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
}
}
...
}
Помимо возможности большого количества операций записи, если выполнение или восстановление занимает много времени, и возможности использования большого количества памяти, есть ли какие-либо ошибки в этом, особенно связанные с параллелизмом?