2011-01-29 4 views
3

저는 하루에 최대 5 억 건의 요청을 처리 할 수있는 HTTP 서비스를 설계하고 있습니다 (둘 이상의 독립 시스템에서 제공).짧은 고유 ID

각 요청마다 고유 ID를 생성하여 사용자에게 반환해야합니다. ID는 10 분 안에 100 % 고유해야합니다. (1 일이 선호되며, 세계적으로 고유 한 ID가 이상적입니다.) 해당 ID를 생성하려면 서버 - 서버 통신이 필요하지 않습니다.

바보 의사 세션 예 : 나는 UUID를 사용이 HTTP 서비스의 이전 세대에서

 
Client: GET /foo 

Server: Content-Type: text/xml 

     <root> 
      <id>ab9d1972-2844-11e0-86b2-000c29544403</id> 
      <other_data/> 
     </root> 

.

UUID에 만족하지만 한 가지 문제가 있습니다. 너무 깁니다. 그 수의 요청에서 디스크 공간에서 눈에 띄는이 여분의 크기는 로그 파일을 낭비합니다.

짧고 고유 한 식별자를 만드는 가장 좋은 방법은 무엇입니까? 보람있는 일을 만들기 위해서, 알고리즘은 UUID 길이의 절반 정도만 생성해야하며 하루 종일 고유합니다 (10 분이 더 짧아야 함).

이상적으로, 알고리즘은 일반 C로 제정신, 경량의 생산 품질 구현을 할 것이다 제안

업데이트 : GET 요청에 전달 될 때 생성 된 ID가 URI 인코딩 할 필요가 없습니다.

+0

게으른 질문 (미안하지만, 너무 늦은 수학입니다) : 이진수에서 ascii85로 인코딩 된 경우 UUID는 얼마입니까? –

+0

@Alexander : 자릿수는'ceil (log (max_val)/log (num_different_chars))'입니다. –

+0

ASCII85는 4 바이트를 5 문자로 인코딩합니다. 그러나, 그것은 * 정말로 * URI 또는 ​​인간 친화적 인 것이 아닙니다. (UUID는 128 비트 16 바이트는 20 문자 ASCII85입니다). –

답변

5

각 시스템에 고유 한 접두사를 지정하십시오. 각 기계에 카운터를 제공하십시오. ID를 생성하려면 카운터를 증가시키고 그 값을 접두어에 추가하십시오.

ID를 난독 처리하려면 암호화하십시오. 암호는 가역 변환이므로 고유 값에 적용하면 고유 한 값이 생성됩니다.

+2

아마도 각 ID를 세 부분으로 만들 수도 있습니다. ID 예측 공격을 제거하기 위해 machineid-counter-randomkey. –

+0

좋은 아이디어. 정말로 빠른 암호를 제안 해 주시겠습니까? –

+0

또한 ID가 자신의 방식대로 생성되는 경우 ID가 얼마나 짧을 수 있다고 생각하십니까? –

2

몇 가지 생각 :

  • 5 억 요청 하루. 정말?
  • UUID를 사용하십시오.
  • 필요한 경우 HTTP를 사용하지 마십시오 (더 중요한 오버 헤드이므로). UUID를 이진 형식으로 전송하십시오.
  • 서버가 실제로 ID를 반환하도록하려면 일정한 바이트가 필요합니다.
  • UDP 사용은 어떻습니까?

어쨌든, 당신은 무엇을하려고합니까?

+0

500M, 실제로 (타겟 상단 용량, 예상 실제로드는 100M과 비슷합니다). 불행히도 HTTP와 TCP/IP는 필수입니다. –

+0

도 500M/day는 c10k 한도 내에 있어야합니다. 무엇이 그렇게 놀랍습니까? –