문제

관리되는 시스템 수준의 순차적 번호 생성기가 있습니까? datetime.now.ticks는 내가 수행하는 작업이 종종 진드기 당 두 번 이상 발생하기 때문에 수행되지 않습니다.


요구 사항 설명 :

  • 프로세스 Agnostic- 이에 액세스 할 프로세스는 하나뿐입니다.
  • 성능은 중요합니다! 이것은 1k/sec에 도달 할 수있는 애드 서버의 인상을 로깅하는 데 사용됩니다.

다음 중 하나 여야합니다.

  • 모든 진드기를 재설정하는 4 바이트 순차 숫자
  • 12 바이트 순차적 숫자 - 기본적으로 4 바이트의 세분성을 DateTime에 추가합니다.
도움이 되었습니까?

해결책

이것을 위해 의도 된 것은 없지만 사용할 수 있습니다. System.diagnostics.performancecounter. 레지스트리를 사용할 수도 있지만 읽기/쓰기 액세스를 직렬화해야합니다. 프로세스가 발생합니다.

System.Diagnostics.PerformanceCounter pc 
    = new System.Diagnostics.PerformanceCounter("SeqCounter", "SeqInstance");
long myVal=pc.Increment();

편집하다

이것에 대해 더 많이 생각할수록 이것이 좋은 해결책이 될 수 있다고 생각합니다. 증분은 원자 연산을 통해 카운터를 1 씩 증가시켜 시스템의 모든 프로세스가 발생합니다.

편집하다

편집을 기반으로 성능 카운터를 사용하지 않는 것이 좋습니다. 성능 카운터는 여러 프로세스를 촉진하는 방법이었습니다. 내부 구현이 어떻게 코딩되는지 잘 모르겠습니다.

왜 정적 변수를 사용하여 증가 할 수 없습니까? 이것이 당신이 이것을 실수가되기를 원한다면 무언가를 잠쳐야 할 것입니다.

System.threading.interlocked.increment

참고 : 32 비트 시스템에서 긴 버전을 사용하면 스레드 안전하지 않습니다.


내가 사용한 구현 (ds)을 보여주기 위해 편집 :

public static class Int32Sequencer
{
    private static Int32 lastSequence = Int32.MinValue;
    private static Object lockObject = new Object();
    public static Int32 GetNextSequence()
    {
        lock (lockObject)
        {
            unchecked { lastSequence++; }
            return lastSequence;
        }
    }
}

다른 팁

가이드는 당신이 얻을만큼 가깝지만, 그것들은 "고유"이며 반드시 순차적 인 것은 아닙니다. 시스템 수준에서 여러 프로세스에서 순차적으로 순차적으로 원한다면 직접 굴러 가야 할 것입니다.

편집하다:

자, 새로운 요구 사항에서 다음과 같이 가정하겠습니다.

  1. 하나의 프로세스만이 작업을 수행하면됩니다
  2. 데이터베이스에 추가하고 있습니다

그래서 여기에 내가 추천 할 내용이 있습니다.

  1. 프로세스 시작시 DB를 마지막 (가장 큰) 값에 대해 쿼리하십시오 (0이없는 경우 0).
  2. 각 DB 행마다 간단하고 단순하고 증분을 사용하십시오. 높은 데이터 속도로 인해 배치에 삽입하려고합니다.

그렇게해야합니다. 간단하게 유지하십시오. 여기에는 자물쇠가없고, 스타트 업에서 약간 (무시할만한) 히트 및 DB의 순차적 숫자가 있습니다. 이 알고리즘은 하나의 프로세스 만 실행하는 한 프로세스 에너지가 있습니다.

가장 가까운 것은 안내라고 생각합니다. 당신이 알고 있다고 확신하는 것은 부분적으로 순차적이라고 확신합니다.

여기에는 SQL Server에 대한 세부 정보를 제공하는 기사가 있습니다.SQL Server의 순차적 인 Guid 이 기술은 Guid의 무작위성으로 인해 페이지 분할을 최소화하는 데 사용됩니다. 어쩌면이 링크는 당신에게 힌트 나 아이디어를 줄 것입니다.

나는 당신이 찾고있는 것에 대해 조금 더 알아야한다고 생각합니다. 질문을 조금 명확히 할 수 있습니까? 특히 서비스는 ...

  • 모든 프로세스, 하나의 프로세스 또는 특정 사용자에서 작업해야합니까?
  • 숫자가 독특하거나 순차적이어야합니까?

귀하의 질문에 따라 여러분이 찾고있는 몇 가지 다른 항목이있는 것 같습니다.

시스템의 모든 프로세스에서 순차적 인 숫자 그룹이 필요합니다.

Afaik, 그러한 서비스는 존재하지 않습니다. 글을 쉽게 작성하기 쉽지만 모든 프로세스에서 작동하도록하는 것은 까다로워집니다.

시스템의 모든 프로세스에서 고유 한 순차적 숫자 그룹이 필요합니다.

첫 번째 질문에 약간의 변형이 있습니다. 이러한 서비스는 구현할 수 없기 때문에 존재하지 않습니다. 내장 데이터 유형을 사용하여 고유 한 순차 숫자를 보장 할 수있는 방법은 없습니다. 단순히 값이 결국 오버플로되고 중복 번호로 남겨두기 때문입니다.

시스템에서 고유 한 가치를 얻는 방법이 필요합니다.

다른 몇몇 사용자가 언급했듯이 최선의 선택은 System.Guid 인스턴스입니다. Guid.NewGuid ()를 사용하여 새 것을 만들 수 있습니다. 거의 모든 목적을 위해 그들은 독특한 것으로 간주 될 수 있지만 순차적이지는 않습니다.

나는 단순히 안전을 위해 데이터베이스 옵션을 좋아합니다. 충분한 메모리가있는 서버간에 대역폭을 할당하여 몬스터 SQL 서버를 설치하십시오. 이와 유사한 시스템은 내가 일한 최초의 회사에서 구현되었으며 (내가 프로그래머가되기 전에) 매우 끔찍했습니다. 당신은 이것을 확장하기 위해 싸울 수 있습니다.

또 다른 옵션은 코드에 싱글 톤 기능을 구현하는 것입니다. 하나의 응용 프로그램 도메인 만 호출 할 수있게됩니다. 데이터베이스 트립을 수행하는 것보다 조금 더 빠를 수 있습니다. 그러나 어쨌든이 내용을 데이터베이스에 로그인하려면 ... 두 사람을 결합하는 것은 어떻습니까? 속도를 위해 싱글 톤을 실행 한 다음 리소스가 허용되면 데이터베이스에 쓰십시오.

다시 한 번, 순차적 요구 사항이 그렇게 강력하지 않다면,지도가 최선의 방법이 될 것입니다.

잠금없이 단일 순차적 인 시리즈를 얻을 방법이 없습니다. 다음 값 (성능 카운터, 정적 변수 등을 할당하는 데 사용하는 메커니즘은 중요하지 않습니다. 두 스레드가 동시에 다음 값이 필요할 때 하나는 다른 스레드를 기다려야합니다.

내가하는 첫 번째 일은 Daniel Schaffer가 게시 한 것과 같은 잠금 증분 함수를 반복적으로 부르는 많은 수의 스레드를 스폰 한 테스트 프로그램을 작성하는 것입니다. 그것은 당신이 당신의 응용 프로그램이 스래쉬를 시작하기 시작하는 임계 값을 찾을 수있게 해줄 것입니다 - 그것은 더 많은 시간을 기다리고 있습니다. Monitor.Enter 다른 일보다.

그것이 문제로 판명되면 - 그리고 당신이 말하는 볼륨이 실제라면, 그것은 각 스레드가 자체 순차적 카운터를 유지하도록해야합니다. 이랑 ThreadStaticAttribute. 그런 다음 스레드 ID와 카운터의 조합에서 고유 식별자를 생성 할 수 있습니다.

스레드 풀을 사용하지 않으면이 접근법이 작동하지 않습니다 (카운터가 소속 될 때 카운터가 죽기 때문에). 또한 응용 프로그램의 시작을 Compound ID의 일부로 만들어 스레드 카운터를 내구성있는 저장소에 쓸 필요가 없습니다. (이 작업을 수행하지 않은 경우 서버를 다시 시작하면 스레드가 다시 0에서 카운터를 생성하기 시작하고 응용 프로그램이 이전 인스턴스와 동일한 ID로 스레드를 생성하면 중복 식별자가 나타납니다.)

이것은 분명히 글을 쓰는 것이 사소하지 않기 때문에 (또는 더 중요한 것은 테스트), 먼저 필요하다는 것을 증명하는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top