Bí quyết công nghệ của EzyPlatform - Quản lý socket user
Back To BlogsTại sao đã có phiên (session) rồi lại phải sinh ra người dùng (user)?
Một phiên sẽ được định danh bởi một id, tuy nhiên trong phần mềm thực tế thì chúng ta lại thường xác định một người dùng thông qua email, số điện thoại hay tên đăng nhập. Mỗi người dùng lại đăng nhập bằng nhiều thiết bị khác nhau, mỗi session chỉ đáp ứng được một thiết bị vậy nên chúng ta cần đến user để quản lý các session tương ứng với các thiết bị.
Chính vì có chứa các thông tin đăng nhập nên socket user cũng sinh ra để quản lý các thông tin ánh xạ với thông tin người dùng trong cơ sở dữ liệu ví dụ như adminId hay userId.
Một socket user được đại diện bởi một đối tượng EzyUser.
Tìm hiểu về lớp EzyUser
Đúng hơn là chúng ta sẽ tìm hiểu về việc cài đặt giao diện EzyUser với thiết kế lớp như sau:
- Giao diện EzyUser cung cấp các hàm cơ sở của một socket user.
- Lớp EzySimpleUser cung cấp các hàm cài đặt.
Một số dữ liệu mà một socket user quản lý bao gồm:
sessionMap: Một map quản lý các session ánh xạ theo id.maxSessions: Số lượng session tối đa tương đương với số thiết bị tối đa mà một người dùng có thể đăng nhập.startIdleTime: Thời gian ghi nhận không còn session nào, nghĩa là các thiết bị đã ngắt kết nối hết.maxIdleTime: Thời gian tối đa tính theo milli giây để một socket user có thể tồn tại sau khi không còn session nào, nghĩa là không có thiết bị nào được kết nối đến.locks: Quản lý các đối tượng lock để bạn có thể sử dụng cho các nghiệp vụ cần đồng bộ hoá dữ liệu tương ứng với từng người dùng.- ...
Socket user được quản lý thế nào
Các socket user được quản lý bởi các lớp manager theo sơ đồ lớp như sau:
- EzyUserManager: Giao diện chứa các hàm cơ sở cho việc quản lý socket user.
- EzyAbstractUserManager: Cài đặt một số hàm cơ bản của
EzyUserManager. - EzyZoneUserManagerImpl: Lớp này quản lý các socket user của cả một zone, nếu bạn muốn gửi thông báo đến toàn bộ người dùng cho cả 1 zone, bạn có thể sử dụng lớp này.
- EzyAppUserManagerImpl: Lớp này quản lý các socket user của một app, nó không tạo mới mà chỉ giữ tham chiếu đến người dùng của zone.
Bạn cần lưu ý rằng mỗi zone sẽ quản lý người dùng độc lập, nghĩa là dù cho có cùng một tên đăng nhập nhưng trên 2 zone sẽ có hai đối tượng EzyUser với cùng username được tạo ra.
Giải quyết vấn đề reconnect
Như đã đề cập ở bài trước chúng ta có vấn đề reconnect. Khi có socket user nó cũng góp phần giải quyết một ít. Khi không còn bất kỳ session nào nữa thì vẫn có một khoảng thời gian EzyFox Server sẽ cho phép đối tượng user tồn tại và bạn cũng có thể cấu hình khoảng thời gian này, ví dụ:
<user-management> <user-max-idle-time>15</user-max-idle-time> </user-management>
Nếu trong khoảng thời gian này người dùng đăng nhập trở lại bạn có thể trả về cho client trạng thái hiện tại, ví dụ một người chơi đang ở trong bàn chơi bạn sẽ gửi thông tin trạng thái của bàn chơi hiện tại cho client và trận đấu vẫn sẽ tiếp tục, ngược lại, quá thời gian thì trận đấu sẽ kết thúc.
Giải quyết vấn đề chỉ cho phép một thiết bị đăng nhập tại một thời điểm
Cũng đã đề cập trong bài trước, giả sử chúng ta có một trò chơi hành động, ở một thời điểm chỉ có một thiết bị được đăng nhập để điều khiển nhân vật, chúng ta có thể giới hạn số lượng session trên một user là 1 và cho phép thay đổi thiết bị, ví dụ chúng ta có thể cấu hình như sau:
<user-management> <user-max-idle-time>15</user-max-idle-time> <allow-change-session>true</allow-change-session> <max-session-per-user>1</max-session-per-user> </user-management>
Cấu hình này đảm bảo chỉ 1 thiết bị được đăng nhập tại một thời điểm, nếu thiết bị mới được đăng nhập, thiết bị cụ sẽ bị ngắt kết nối.
Tổng kết
Socket user là một khái niệm tương đối quan trọng của EzyFox Server và EzyPlatform và nó được đại diện bởi lớp EzyUser. Các socket user được quản lý bởi các lớp manager. Thông qua socket user chúng ta có thêm công cụ để giải quyết các vấn đề reconnect và giới hạn số lượng thiết bị đăng nhập.