Tim의 제안은 적당하지만 사용자 지정 서비스 호스트가 필요하지 않습니다. 가장 중요한 점은 데이터가 업데이트 된 후 어느 시점에서 영구 저장소에 데이터 내용을 쓰는 것입니다. POST를 받으면 메모리 내 데이터 표현을 업데이트 한 다음 파일 시스템의 XML 파일에 내용을 씁니다.
public void DoPost()
{
UpdateData();
SaveDataToFilesystem();
}
다시 시작할 때 파일이 있으면이를 읽습니다.
동시성을 처리하려면 Update()
및 Save()
메서드에서 데이터를 잠글 수밖에 없습니다.
시스템에 부하가 많은 경우 "파일 시스템에 쓰기"를 최대 10 초마다 연기하십시오.
public void DoPost()
{
UpdateData();
QueueWriteToFilesystem();
}
private MyInternalDataType data;
private DateTime lastWrite = new DateTime(1970,1,1); // init value
private void QueueWriteToFilesystem()
{
ThreadPool.QueueUserWorkItem(MaybeWrite);
}
private int delayInMilliseconds = 1000 * 10; // 10 seconds
private void MaybeWrite()
{
System.Threading.Thread.Sleep(delayInMilliseconds);
lock (data)
{
var delta = System.DateTime.Now - lastWrite;
if (delta < new System.TimeSpan(0, 0, 0, 0, delayInMilliseconds))
{
// less than 10s since last write
// do nothing
return;
}
ActuallySaveToFilesystem();
lastWrite = System.DateTime.Now;
}
}
정말 높은 동시성를 들어, 모든 요청과 새로운 작업 항목을 대기 싶지 않을 것이다. 대신에 쓰기 전용 스레드를 사용하는 것이 좋습니다.
public void DoPost()
{
UpdateData();
lastUpdate = System.DateTime.Now;
}
private void DedicatedWriter()
{
do
{
System.Threading.Thread.Sleep(delayInMilliseconds);
lock (data)
{
var delta = lastUpdate - lastWrite;
if (delta < new System.TimeSpan(0, 0, 0, 0, 200))
{
// small amount of time since prior write;
// do nothing
return;
}
ActuallySaveToFilesystem();
lastWrite = System.DateTime.Now;
}
} while (true);
}
또한 AutoResetEvents를 사용하여 작성자 스레드가 깨우기 위해 신호를 보낼 수 있습니다.
사용자 지정 서비스 호스트를 구현하고 호스트의 OnClosing 이벤트에서 서버의 파일에 목록을 저장하는 방법을 살펴보십시오. 또는 데이터베이스에 저장할 수도 있습니다. 그런 다음 호스트의 OnOpening에서 db의 파일이나 데이터를 읽을 수 있습니다. – Tim