문제

다음 시나리오에서:

데이터베이스 1개 웹 서버 4개

웹 서버는 데이터베이스에 대한 고유 ID를 어떻게 생성하여 고유합니까?예, 자동 증가를 사용할 수 있지만 크롤링/추측이 너무 쉽습니다.따라서 자동 증가는 현재 옵션이 아닙니다.

도움이 되었습니까?

해결책

UUID를 사용하십시오 (http://www.ietf.org/rfc/rfc4122.txt). 충돌은 가능하지 않으며 새로운 UUID를 재생하여 발생할 때 처리 될 수 있거나 각 서버 (예 : MAC 주소)에 대한 고유 한 ID를 연결하여 방지 할 수 있습니다.

StringBuilder sb = new StringBuilder(UUID.randomUUID());
InetAddress address = InetAddress.getLocalHost();
String uid = sb.append(NetworkInterface.getByInetAddress(address).getHardwareAddress());

다른 팁

UUID를 사용할 수 있습니다.

import java.util.UUID;        

UUID uuid = UUID.randomUUID();
System.out.println(uuid.toString());

충돌이 정말로 걱정된다면 키를 사전 생성하여 고유 한 색인으로 데이터베이스 테이블에 저장할 수 있습니다. 그런 다음 다운 타임 중에 테이블을 채우는주기적인 작업을하고 중고 키를 한 번에 한 번 제거하십시오.

어떤 DB 시스템을 사용하고 있습니까? 앱은 어떤 서버가 요청을하는지 알고 있습니까? DB가 키를 결정하게하거나 코드로 설정하도록 하시겠습니까?

키를 요청한 서버를 나타내는 접두사 또는 두 번째 필드가있는 자동 증가를 사용하는 것만 큼 간단 할 수 있습니다.

자동 증가나 시퀀스가 ​​왜 허용되지 않는지 잘 모르겠습니다.내부 ID가 "추측 가능"하지 않기를 원하십니까?뭐, 이것이 계좌 번호이고 누군가가 유효한 계좌 번호를 추측하는 것을 원하지 않습니까?

글쎄요, 이미 언급한 UUID 외에도 두 가지 분명한 가능성이 떠오릅니다.

  1. 시퀀스를 사용한 다음 난수를 생성하고 두 개의 서로 다른 시퀀스 번호가 동일한 최종 번호를 제공할 수 없도록 알고리즘을 사용하여 둘의 조합에서 계좌 번호를 생성합니다.예를 들어 간단한 알고리즘은 다음과 같습니다.다음 시퀀스 번호를 가져와서 12345678을 곱하고 0에서 12345678-1 사이의 난수를 생성한 다음 두 개를 더합니다.

  2. 마지막으로 할당된 번호를 보유하는 하나의 레코드가 있는 데이터베이스 테이블을 만드세요.새 번호가 필요할 때마다 이 레코드를 잠그고 이전 값을 사용하여 다음 값을 생성하고 레코드를 업데이트하세요.숫자가 항상 증가하는 한 중복이 발생하지 않는다는 것이 보장됩니다.

서버 식별자를 식별자의 일부로 사용하는 체계가 있는 경우 해당 식별자를 단순히 구성 파일 어딘가에 저장된 숫자로 사용하지 않는 것이 좋습니다.저는 현재 누군가 각 서버에 레코드 ID에 내장된 "서버 ID"를 제공하고 서버 ID는 수동으로 할당되는 작은 정수라는 밝은 아이디어를 가진 시스템을 작업 중입니다.서버가 3대뿐인 프로덕션에서는 그다지 어렵지 않습니다.그러나 새로운 서버가 계속해서 등장하고 중단되고 테스트 구성 파일이 끊임없이 뒤섞이는 개발 및 테스트에서는 관리하기가 어렵습니다.서버 ID 기간을 사용하는 것은 피하고 싶지만, 사용하려면 일부 중앙 서버에서 자동으로 할당하거나 IP에서 파생시키거나 안전한 방법을 사용하세요.

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