images
27/09/2022 04:56 am

Java Map - Phần 1

Sếp giao cho tôi phải xây dựng một hệ thống quản lý và thu vé xe khách.

Sếp giao cho tôi phải xây dựng một hệ thống quản lý và thu vé xe khách. Nôm na như sau: 


Giả sử khách hàng muốn đi từ Hà Nội tới Hạ Long, họ sẽ mua vé điện tử bằng cách lên website bán vé, điền thông tin cá nhân bao gồm số CMT đồng thời chuyển tiền vào hệ thống để mua vé. Hệ thống sẽ báo thành công và gửi về cho khách hàng một mã code. Khi khách hàng bắt đầu hành trình, họ chỉ cần ra xe khách, và đưa cho người soát vé mã code là có thể lên xe. 


Team của tôi đã cố gắng làm trong vòng 1 tuần và trình Sếp. Sếp vui vẻ lắm và quyết định nếu triển khai hệ thống thành công sẽ thưởng nóng cho team. 


Do marketing trên nhiều phương tiện với nhiều ưu đãi, nên chỉ sau 3 ngày triển khai, hệ thống ghi nhận lượng giao dịch khủng với tần suất có thể lên tới vài chục nghìn giao dịch đặt vé đồng thời trong 1 giây vào giờ cao điểm các ngày gần cuối tuần. Điều đó có nghĩa hệ thống cần xử lý hàng triệu giao dịch trong cả ngày. Team rất tự tin khi hệ thống chạy ổn định và không hề có dấu hiệu gì về lỗi hệ thống hay trang bị chậm sau 2 tuần đầu tiên chạy thật.


Một sự việc bất ngờ xảy đến vào cuối tuần thứ 3, bắt đầu từ chiều tối ngày thứ 6 và ngày thứ 7, chúng tôi bị khủng hoảng vì có hơn 20 cuộc gọi điện của khách hàng đến than phiền và chửi rủa là lừa đảo. Khách báo đã mua vé và thanh toán tiền rồi nhưng khi ra xe và đưa mã vé cho người soát vé thì đều nhận được câu trả lời là: mã vé không hợp lệ. Ban đầu chúng tôi còn nghĩ có thể do khách hàng nhầm gì đó. 


Từ thông tin khách hàng, chúng tôi kiểm tra lại các luồng thanh toán và mã vé đều thấy khách đã trả tiền rồi và mã vé là hợp lệ. Một mặt chúng tôi phải tìm cách kiểm tra lại các mã vé không hợp lệ, xác nhận xem đó có phải là vé hợp lệ không để khách có thể lên xe. 

👉Team rơi vào tâm lí hoang mang không biết nguyên nhân lỗi là gì, và bao nhiêu người bị ảnh hưởng?!


Việc tìm lỗi là khá khó. Thông tin log trong server cũng không có gì đáng ngờ. Những nỗi lo sợ bắt đầu lớn dần lên và bao nhiêu sự tự tin của team bay đi đâu hết, thay vào đó là bồn chồn, bất ổn. Hệ thống thì đã chạy được 2 tuần không lỗi, các nâng cấp gần đây không có gì đặc biệt làm thay đổi logic xử lý vé trong khi các test case được thực hiện lại đều cho kết quả thành công không ghi nhận lỗi.


2 ngày cuối tuần tôi lại vùi đầu vào review code, rà soát hết các điểm nghi ngờ, chạy test lại các function, và cuối cùng thu hẹp được điểm nghi ngờ nhất.


Các bạn có thể cùng review đoạn code Java (như trong ảnh) sau khi đã được lược đi các phần rườm rà trong phần quản lý vé.



Map<String, String> ticketMap = new HashMap<>();


public String bookTicket(String identification) {

   String ticketCode = UUID.randomUUID().toString();

   ticketMap.put(ticketCode, identification);

   return ticketCode;

}


public boolean checkTicketExist(String ticketCode) {

   return ticketMap.containsKey(ticketCode);

}


Logic đơn giản là: mỗi một khách hàng sẽ có thông tin identification như số CMT. Khi khách hàng đã chuyển tiền thành công, hàm bookTicket sẽ được gọi để sinh ra một mã vé ứng với khách hàng đó. Khách hàng sẽ lưu lại mã này.


Khi khách hàng đưa mã này cho người soát vé. Việc tra cứu trên hệ thống sẽ gọi đến hàm checkTicketExists, đơn giản hàm này chỉ kiểm tra xem trong Map đã có key này tồn tại hay chưa. Nhìn đoạn code thì có thể thấy: nếu đã mua vé thành công - hiển nhiên việc kiểm tra vé tồn tại sẽ đúng.

------------------------------

☘️P/S: Mời các bạn đón đọc Java Map - Phần 2 trình bày về cách fix bug này nhé!


- Tech Zone -

Thư giãn chút nào!!!

Bài viết liên quan