Làm cách nào để ngăn hai người dùng đăng ký cùng một lúc với cùng tên người dùng?


11

Chúng tôi không thể đăng ký đăng ký vì có hàng triệu người dùng đăng ký cùng một lúc. Đăng ký song song cần phải xảy ra.

Giả sử cơ sở dữ liệu không chứa tên người dùng 'user1'. Khi hai người dùng cố gắng đăng ký cùng một lúc với 'user1', họ sẽ chấp nhận. Nhưng nó sẽ gây ra vấn đề Điều này không nên xảy ra.

Tôi đang tìm kiếm một giải pháp hợp lý. Không có gì cụ thể. Chỉ là một ý tưởng để giải quyết điều này.


đưa ra lời giải thích trong lần thử trước của bạn để đăng bài này tại Nơi làm việc, hãy xem xét việc đọc tại sao câu hỏi phỏng vấn làm cho các lập trình viên nghèo. Câu hỏi thường gặp?
gnat

4
Đây là một vấn đề kiến ​​trúc phần mềm hợp pháp. Không phải là loại vấn đề chỉ làm cho một câu hỏi phỏng vấn tốt và không có gì khác.
Karl Bielefeldt

7
Hàng triệu người dùng đăng ký cùng một lúc? Có thật không? Nếu bạn có hàng triệu người dùng đăng ký cùng một lúc, bạn sẽ gặp vấn đề lớn hơn - như xử lý hàng tỷ người dùng đã đăng ký. Và có lẽ tiền để mua máy chủ xử lý nó.
gnasher729

2
@AddzyK Đây là một vấn đề giả định phải đối mặt trong tương lai mà bạn muốn một giải pháp hợp lý? Khá chắc chắn rằng đó là ngoài phạm vi ở đây.
paparazzo

3
Đây là một câu trả lời giả thuyết: trả tiền cho người khác để làm điều đó đã biết phải làm gì. Với hàng triệu người dùng mới / giây, bạn sẽ có tiền mặt.
whatsisname

Câu trả lời:


15

Giả sử cơ sở dữ liệu không chứa tên người dùng 'user1'. Khi hai người dùng cố gắng đăng ký cùng một lúc với 'user1', họ sẽ chấp nhận.

Tại sao nó lại chấp nhận nó? Thật đơn giản để áp dụng một ràng buộc duy nhất, sử dụng tên người dùng làm khóa chính hoặc chỉ đơn giản là chạy mã kiểm tra trong ứng dụng bên trong một giao dịch.

Bạn hoàn toàn có thể sử dụng một giao dịch cơ sở dữ liệu để sử dụng cơ sở dữ liệu để ngăn chặn điều này xảy ra. Mặt khác, không có ứng dụng nào có thể duy trì bất biến trong dữ liệu cơ sở dữ liệu.

Về quy mô, cơ sở dữ liệu đã phát minh ra các công nghệ bạn cần, như các chế độ khóa khác nhau tùy thuộc vào chính xác loại bạn cần, cơ sở dữ liệu phân tán cho nhiều máy chủ cơ sở dữ liệu, v.v.


Việc khóa đăng ký không ngăn người dùng khác đăng ký cùng một lúc?
Addzy K

2
+1, Chỉ cần chạy một số phép toán thô và thậm chí Facebook chỉ tính trung bình một vài lần đăng ký mỗi giây. Vì vậy, dựa vào các ràng buộc riêng của cơ sở dữ liệu là đủ.
GrandmasterB

2
@AddzyK: Khóa chỉ xảy ra trong một thời gian ngắn mà cơ sở dữ liệu phải thực thi các ràng buộc. Có, những người dùng khác đăng ký đồng thời phải xếp hàng chờ đợi, nhưng sự chờ đợi đó rất ngắn và hiếm khi xảy ra, ngay cả trên các hệ thống lớn nhất.
Robert Harvey

1
@GrandmasterB Trung bình có thể không kể toàn bộ câu chuyện ở đây. Tôi giả định dựa trên câu hỏi rằng đây là để xử lý tải trọng cực đại - ví dụ như công cụ điều tra dân số Úc.
DeadMG

@AddzyK Nó có thể làm. Về cơ bản, bạn có thể thoát khỏi chỉ với một phần khóa của bảng. Có rất nhiều kế hoạch để giải quyết vấn đề này, chẳng hạn như câu trả lời của gnasher729, nhưng tôi tin rằng bạn sẽ có thể có được một sản phẩm cơ sở dữ liệu phân tán có sẵn có thể xử lý việc này cho bạn. Ngay cả khi bạn phải cuộn sơ đồ khóa một phần của riêng mình, có rất nhiều cách đã biết để xử lý nó, chẳng hạn như DHT.
DeadMG

7

Có một giải pháp tiêu chuẩn cho việc này. Tạo nhiều công nhân để làm đăng ký. Mỗi yêu cầu có một hàm băm được áp dụng cho tên người dùng và hàm băm xác định nhân viên nào xử lý yêu cầu. Bằng cách này, không có cách nào khả thi cho hai yêu cầu cho cùng một tên người dùng có thể được xử lý đồng thời.

Đối với loại khối lượng yêu cầu này, hãy xem xét một kho lưu trữ khóa phân tán, chẳng hạn như rủi ro thay vì tất cả cơ sở dữ liệu như kho lưu trữ dữ liệu.


2

Đó có phải là vấn đề ?

Không cho phép hai người dùng hoàn thành đăng ký của họ với tên người dùng không phải là duy nhất nếu tên người dùng (và không phải email người dùng) được sử dụng để đăng nhập.

Nếu tên người dùng không được sử dụng để xác thực, bạn có thể sử dụng một số quy trình nền để xác định và gắn cờ đôi (ví dụ dựa trên dấu thời gian) và buộc người dùng thay đổi tên người dùng của mình trong lần đăng nhập tiếp theo

Vâng, đó là một vấn đề

Khi bạn hỏi, tôi cho rằng tên người dùng được coi là một id duy nhất. Phương pháp sau đây có thể được sử dụng:

  1. Trước: Trong quá trình đăng ký, thấy trước một bước mà người dùng mới phải kiểm tra tính khả dụng của tên mình. Khi làm như vậy, hãy lưu ý tên tài khoản khả dụng với trạng thái tạm thời và id phiên sẽ cho phép hoàn tất đăng ký.
  2. Đồng thời: Một biến thể chung hơn và linh hoạt của trả lời gnasher729 , sẽ là sử dụng hàm băm đơn giản (giống như hàm được sử dụng để quản lý bảng ký hiệu), để gán id cho máy chủ đăng ký duy nhất i (i = h (tên người dùng) modulo number_of_servers) sẽ xử lý tính duy nhất trên phạm vi giới hạn / phân đoạn của anh ấy
  3. Sau: Khi kết thúc đăng ký, khi người dùng nhấp vào registergửi yêu cầu đến cơ sở dữ liệu giao dịch của bạn, nếu bạn có thể xác định trường là duy nhất. Khi có lỗi, hãy gửi thông báo "rất tiếc, có vấn đề" với người dùng không may và yêu cầu anh ta chọn id khác.
  4. Không đồng bộ: đăng ký người dùng. Đọc lại hồ sơ người dùng ngay sau đó để đảm bảo nó không thay đổi và duy nhất. Nếu đó là một vấn đề hoặc yêu cầu người dùng thay đổi (không đồng bộ) hoặc gửi cho anh ta một thư có vấn đề (không đồng bộ, nhưng gây khó chịu từ góc độ người dùng), hoặc để anh ta đăng ký nhưng yêu cầu anh ta gửi email (để phân tán) và buộc anh ta thay đổi tên người dùng như một phần của thủ tục đăng nhập.

1

Xem xét lại những gì bạn nghĩ là định danh duy nhất cho người dùng. Mỗi người dùng đã có một địa chỉ email duy nhất, vì vậy vấn đề đó đã được giải quyết cho bạn. Tất nhiên, điều này có nghĩa là nhiều người dùng sẽ có thể đăng ký cùng tên, như "Mike Nakis". Có một vấn đề với điều đó? Bạn có chắc không? Nó không phải là một vấn đề cho facebook, ví dụ. Có nhiều người dùng facebook được gọi là "Mike Nakis". Nhìn vào trang đăng nhập facebook: nó yêu cầu "email hoặc điện thoại" và "mật khẩu".


0

Với hàng triệu người dùng đăng ký cùng một lúc, bạn chỉ cần sử dụng 26 x 26 máy chủ đăng ký, một cho người dùng bắt đầu bằng aa, một cho người dùng bắt đầu bằng ab, v.v. Kết quả là, chỉ có hàng ngàn người dùng đăng ký tại mỗi máy chủ cùng một lúc. Nếu bạn vẫn không thể xử lý được điều đó, hãy sử dụng máy chủ 26 x 26 x 26.


5
... và sau đó chủ sở hữu sản phẩm của bạn muốn đi quốc tế ...
Telastyn

2
Các nguyên tắc tương tự áp dụng cho các chuỗi Unicode miễn là chúng ở dạng chuẩn hóa, chẳng hạn như NFKD. Bạn cũng có thể băm tên người dùng và áp dụng nó dựa trên hàm băm. Tuy nhiên, câu trả lời này về cơ bản chỉ là thực hiện cơ sở dữ liệu phân tán của riêng bạn.
DeadMG

1
Bạn có nghĩa là họ có hàng triệu người dùng đăng ký cùng một lúc tại một quốc gia ? Trong trường hợp đó họ nên có đủ tiền để trả nhiều hơn cho một giải pháp thực sự.
gnasher729

Cụ thể hơn, đây mới chỉ là khởi đầu của cách thức thực hiện các DHT.
DeadMG

Làm thế nào để khắc phục vấn đề của hai người dùng đăng ký cùng một tên cùng một lúc - cả hai tên sẽ bắt đầu bằng hai ký tự và do đó được xử lý bởi cùng một máy chủ đăng ký?
HorusKol
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.