두 명의 사용자가 같은 사용자 이름으로 같은 순간에 등록하지 못하게하는 방법은 무엇입니까?


11

수백만 명의 사용자가 동시에 등록하고 있으므로 등록을 직렬화 할 수 없습니다. 병렬 등록이 필요합니다.

데이터베이스에 사용자 이름 'user1'이 포함되지 않았다고 가정 해 봅시다. 두 명의 사용자가 동시에 'user1'로 등록을 시도하면 승인됩니다. 그러나 나중에 문제가 발생합니다. 이런 일은 일어나지 않아야합니다.

논리적 인 해결책을 찾고 있습니다. 구체적이지 않습니다. 이것을 해결하는 아이디어.


사전에 Workplace에 게시 하려는 시도 에 대한 설명이 있으면 인터뷰 질문
gnat

4
합법적 인 소프트웨어 아키텍처 문제입니다. 좋은 면접 질문 만하는 문제는 아닙니다.
Karl Bielefeldt

7
수백만 명의 사용자가 동시에 등록합니까? 정말? 동시에 수백만 명의 사용자가 등록하는 경우 수십억 명의 등록 된 사용자를 처리하는 것과 같이 더 큰 문제가 있습니다. 그리고 아마도 그것을 처리하는 서버를 감당할 돈이있을 것입니다.
gnasher729

2
@AddzyK 이것은 미래에 논리적 인 해결책을 원한다는 가상의 문제입니까? 여기가 범위를 벗어 났음을 확신하십시오.
paparazzo

3
여기에 가상의 대답이 있습니다. 이미 무엇을해야하는지 알고있는 다른 사람에게 지불하십시오. 초당 수백만 명의 신규 사용자가 있으면 현금을 얻게됩니다.
whatsisname

답변:


15

데이터베이스에 사용자 이름 'user1'이 포함되지 않았다고 가정 해 봅시다. 두 명의 사용자가 동시에 'user1'로 등록을 시도하면 승인됩니다.

왜 받아들일까요? 고유 제한 조건을 적용하거나, 사용자 이름을 기본 키로 사용하거나, 트랜잭션 내에서 애플리케이션 코드 체크인을 실행하는 것은 간단합니다.

데이터베이스 트랜잭션을 사용하여 데이터베이스가 발생하지 않도록 데이터베이스를 사용할 수 있어야합니다. 그렇지 않으면 데이터베이스 데이터에서 변이를 유지할 수있는 응용 프로그램이 없습니다.

스케일링 측면에서 데이터베이스는 필요한 일관성의 종류에 따른 다양한 잠금 모드, 여러 데이터베이스 서버에 대한 분산 데이터베이스 등과 같이 필요한 기술을 이미 발명했습니다.


등록을 잠그면 다른 사용자가 동시에 등록하지 못하게됩니까?
Addzy K

2
+1, 단지 약간의 수학 계산을 실행했으며 Facebook조차도 초당 평균 몇 번의 가입 만합니다. 따라서 데이터베이스 자체의 제약 조건에 의존하는 것으로 충분합니다.
GrandmasterB

2
@AddzyK : 잠금은 데이터베이스가 제약 조건을 시행해야하는 순간 동안 만 발생합니다. 예, 동시에 등록하는 다른 사용자는 줄을 서서 기다려야하지만 대기 시간이 매우 짧아서 가장 큰 시스템에서도 거의 발생하지 않습니다.
Robert Harvey

1
@GrandmasterB 평균은 여기서 전체 이야기를하지 못할 수도 있습니다. 나는 이것이 호주의 인구 조사 자료와 같이 높은 피크 부하를 다루기위한 것이라는 질문에 기초를 두었다.
DeadMG

@AddzyK 할 수 있습니다. 기본적으로 테이블의 잠금 부분 만으로도 도망 갈 수 있습니다 . gnasher729의 답변과 같이이 문제를 처리하는 데는 여러 가지 방법이 있지만이를 처리 할 수있는 상용 분산 데이터베이스 제품을 얻을 수 있다고 생각합니다. 자신 만의 부분 잠금 구성표를 굴려도 DHT와 같이이를 처리하는 알려진 방법이 많이 있습니다.
DeadMG

7

이에 대한 표준 솔루션이 있습니다. 등록 할 여러 작업자를 만듭니다. 각 요청에는 사용자 이름에 적용된 해시가 있으며 해시는 요청을 처리하는 작업자를 결정합니다. 이 방법으로 동일한 사용자 이름에 대한 두 개의 요청을 동시에 처리 할 수있는 방법이 없습니다.

이러한 종류의 요청에 대해서는 데이터 저장소로 모든 데이터베이스 대신 위험과 같은 분산 키 값 저장소를 고려하십시오.


2

이게 문제가 되나요 ?

로그인에 사용자 이름이 아닌 사용자 이름을 사용하는 경우 두 명의 사용자가 고유하지 않은 사용자 이름으로 등록을 마치도록 허용 할 수 없습니다.

사용자 이름이 인증에 사용되지 않는 경우 일부 백그라운드 프로세스를 사용하여 복식 (예 : 타임 스탬프 기반)을 식별하고 플래그를 지정하고 다음 로그온시 사용자 이름을 강제로 변경하도록 할 수 있습니다.

네 문제입니다

당신이 묻는대로, 나는 사용자 이름이 고유 ID라고 가정합니다. 다음과 같은 접근법이 사용될 수 있습니다.

  1. 이전 : 등록 과정에서 새 사용자가 자신의 이름을 확인할 수있는 단계를 예견하십시오. 그렇게 할 때 사용 가능한 계정 이름을 임시 상태로 등록하고 등록을 완료 할 수있는 세션 ID를 미리 예약하십시오.
  2. 같은 시간 : 좀 더 일반적이고 유연한 gnasher729 응답 변형은 간단한 해시 함수 (예 : 기호 테이블 관리에 사용되는 함수)를 사용하여 고유 등록 서버 i에 i를 할당하는 것입니다 (i = h (사용자 이름) 모듈로 제한된 / 세그먼트 범위에서 고유성을 처리 할 number_of_servers)
  3. 이후 : 등록이 끝나면 사용자가 클릭 register할 때 필드를 고유 한 것으로 정의 할 수있는 경우 요청을 트랜잭션 데이터베이스로 보냅니다. 오류가 발생하면 운이 좋지 않은 사용자에게 "문제가 발생했습니다"라는 메시지를 보내고 다른 ID를 선택하도록 요청하십시오.
  4. 비동기 : 사용자를 등록하십시오. 변경하지 않고 단일 레코드인지 확인하기 위해 직후 사용자 레코드를 다시 읽으십시오. 문제가있는 경우 사용자에게 변경 (비동기 적이 아닌)을 요청하거나 문제가 발생한 메일 (비동기 적이지만 사용자 관점에서는 성가신)을 보내거나 등록을하도록하고 이메일을 요청하도록합니다 (명확하게하기 위해). 로그인 절차의 일부로 사용자 이름을 변경하도록합니다.

1

사용자의 고유 식별자로 생각하는 것을 재고하십시오. 각 사용자는 이미 고유 한 이메일 주소를 가지고 있으므로 문제가 이미 해결되었습니다. 물론 이것은 "Mike Nakis"와 같이 여러 사용자가 동일한 이름을 등록 할 수 있음을 의미합니다. 그것에 문제가 있습니까? 확실해? 예를 들어 페이스 북에는 문제가되지 않습니다. "Mike Nakis"라는 여러 페이스 북 사용자가 있습니다. 페이스 북 로그인 페이지를보십시오 : "이메일 또는 전화"와 "암호"를 묻습니다.


0

수백만 명의 사용자가 동일한 등록을하면 26x26 등록 서버를 사용합니다. 하나는 aa로 시작하는 사용자 용이고 다른 하나는 ab로 시작하는 사용자 용입니다. 결과적으로 동시에 각 서버에 수천 명의 사용자 만 등록합니다. 여전히 처리 할 수 ​​없으면 26 x 26 x 26 서버를 사용하십시오.


5
... 그리고 제품 소유자가 국제적으로 가고 싶어합니다.
Telastyn

2
NFKD와 같은 정규화 된 형식 인 한 동일한 원칙이 유니 코드 문자열에 적용됩니다. 사용자 이름을 해시하고 해시를 기반으로 적용 할 수도 있습니다. 그러나이 답변은 기본적으로 자체 분산 데이터베이스를 구현하는 것입니다.
DeadMG

1
한 국가에서 동시에 수백만 명의 사용자가 등록하고 있음을 의미 합니까? 이 경우 실제 솔루션에 더 많은 비용을 지불 할만큼 충분한 돈이 있어야합니다.
gnasher729

보다 구체적으로, 이것은 DHT가 수행되는 방법의 시작일뿐입니다.
DeadMG

두 명의 사용자가 같은 이름을 동시에 등록하는 문제를 어떻게 해결합니까? 두 이름이 모두 같은 두 문자로 시작하여 동일한 등록 서버에서 처리됩니까?
HorusKol
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.