Nếu ở Nhật ít lâu chắc ai cũng sẽ quen với một cái thẻ chip nhỏ, dùng để ra vào ga tàu, đi xe bus, hay mua đồ ở các cây bán nước hoặc cửa hàng tiện lợi.

Điểm đặc trưng của cái thẻ này là nó hoạt động rất nhanh, bạn chỉ cần đưa nó đến gần đầu đọc thẻ, rồi chỉ trong một tiếng bíp giao dịch mà bạn cần đã hoàn tất. Không những vậy nó hoạt động rất ổn định. Không biết bạn đã thấy suica bị lỗi bao giờ chưa, chứ mình thì chưa bao giờ thấy nó không phản hồi.

Sơ qua về tải của hệ thống này bạn có thể tính sơ sơ mỗi buổi sáng riêng ở Tokyo số người sử dụng tàu điện cũng lên đến ngót chục triệu, mỗi người đập thẻ vào ga, đập thẻ ra khỏi ga ở những ga tàu khác nhau, nhưng một điểm chung là suica tính tiền vẫn đúng và nhanh. Nếu bạn là một người làm kỹ thuật giống mình thì có lẽ bạn cũng đã có lúc thắc mắc vì sao nó làm được như vậy?

Vậy trong bài viết này mình sẽ cùng tìm hiểu về hệ thống này nhé.

Sơ Qua về Suica

Trước hết nói qua về thẻ suica đã, nếu bạn chưa từng đến Nhật thì có thể bạn chưa hình dung được về nó.

Hệ thống tàu điện ở Nhật (mà mình đồ là ở Việt Nam cũng sẽ như vậy) không giống như hệ thống xe bus ở Hà Nội ở đó bạn trả tiền theo lượt lên xuống xe. Đi tàu bạn sẽ phải trả tiền theo điểm xuất phát và điểm kết thúc mà bạn đi. Bạn đi càng xa thì càng tốn nhiều tiền, càng gần thì càng ít tiền. Hơn nữa sau khi vào ga bạn có thể đổi tàu chuyển tàu tùy thích, tiền sẽ chỉ được tính khi bạn ra khỏi ga. Cách tính này theo mình có lợi hơn cho người dùng, vì sẽ chỉ phải trả chính xác những gì mình đã đi (đi được bao xa, bất kể đi bằng cách nào). Nhưng về mặt hệ thống để đáp ứng điều này có thể không đơn giản. Bạn cần biết ga tàu mà người dùng đã lên, ga mà họ xuống, quãng đường đi theo đường gần nhất từ ga đầu đến ga đích, với khoảng cách đó thì hết bao nhiêu tiền. So với hệ thống ở Việt Nam, anh phụ xe sẽ chạy đến bảo bạn mua vé một lần khi lên xe, thì cách tính tiền này rõ ràng là phức tạp hơn.

Thêm nữa, bạn cũng có thể đăng kí vé tháng. Một lần nữa khác với vé xe bus ở Hà Nội vé tháng tàu điện không cho phép bạn đi tất cả các tuyến. Bạn chỉ được phép đăng kí một tuyến đường nhất định mà bạn đi thường xuyên. Khi đó bạn có thể lên xuống tất cả các ga trong tuyến đó thoải mái, nhưng nếu ra ngoài phạm vi đã đăng kí, bạn sẽ phải trả thêm tiền. Tiền phải trả sẽ tính sao cho có lợi nhất cho người dùng. Nó bằng quãng đường gần nhất từ ga đích đến ga gần nhất trong tất cả các ga mà bạn đăng kí trong vé tháng. Giê! Và nó làm việc tính tiền phức tạp hơn đáng kế.

Hệ thống phải ghi nhận tất cả ga nằm trong vé tháng của bạn. Khi bạn tính tiền tàu, nó sẽ phải tìm xem ga tàu xuất phát và tàu đích có nằm trong vé tháng hay không. Nếu có thì đơn giản nhưng nếu không có thì cần phải tìm trong tất cả ga mà bạn đã đăng kí, ga gần nhất với điểm đích của bạn, rồi tính tiền dựa vào quãng đướng đó. Bạn đã nghĩ ra thuật toán nào giải quyết nhanh gọn vấn đề này chưa?

Thế còn trường hợp sau thì sao. Giả sử ga tàu A,B,C,D,E,F,G,H,I nằm trên cùng một tuyến, vé tháng của bạn đăng kí B,C,D,E,F. Bạn di chuyển từ ga A đến ga I thì như thế nào? Hệ thống phải tính quãng đường từ A đến I trừ bỏ quãng đường có vé tháng rồi tính tiền cho bạn. Mình khá chắc là tính toán của nó không đơn giản.

Vậy đó là nghiệp vụ của hệ thống tàu điện, Ngoài ra Suica còn phải giải quyết các vấn đề phi chức năng khác, ví dụ như tốc độ. Hệ thống tàu điện ở Tokyo rất đông đúc, giải quyết giao thông cho ngót chục triệu người đi làm cơ mà. Bạn cứ tưởng tượng lấy hai chục cái xe bus tuyến 20 chật kín người trong giờ cao điểm, nối vào nhau thành một chuyến. Ga tàu đông như ga Tokyo hay ShinJuku có khoảng hai chục đường ray cho tàu từ các hướng cập bến. Trung bình mỗi 3 đến 5 phút lại có một tàu cập bến tại một đường ray. Nói chung tải của các ga này rất lớn. Nếu cửa soát vé ở ga không kịp làm việc thì tất yếu là cửa ra vào ga sẽ tắc. Mà tắc đường ở ga nguy hiểm, vì người ta có thể sẽ rơi xuống đường ray và … chuyện nghiêm trọng.

Theo một thống kê của JR – công ty tàu điện. Nếu một cửa soát vé không soát vé được cho 43 người trong 1 phút thì tắc nghẽn sẽ xảy ra(Các ga tàu ở mỗi cửa có đến hàng chục cửa soát vé nhé, nhưng vẫn không chịu tải được). Vậy trung bình Suica có khoảng hơn một giây để giải quyết thanh toán cho một hành khách. Có đúng như vậy không? Hành khách phải di chuyển qua cửa soát vé. Bước một vài bước cần có thời gian. Hơn 1 s phải bao gồm cả thời gian người dùng đưa thẻ đến đầu đọc, thẻ phản hồi, cửa soát vé mở và người dùng bước ra, người dùng không giữ thẻ trên đầu đọc suốt 1s để hệ thống làm việc đâu. Như vậy thời gian để thẻ phản hồi phải ngắn hơn một giây rất nhiều.

Và thời gian phản hồi trung bình của suica là 100ms !!!, thời gian trong tài liệu là 200ms (aka 0.2s). Trong thời gian đó nó phải phát sóng để nạp điện cho chip IC ở trên thẻ, đầu đọc xác thực thẻ đó là suica thật hay giả, xác định nó là thẻ nào trong khoảng 40 triệu thẻ đang hoạt động, đọc thông tin trên thẻ, tính toán tiền đi lại của người dùng, ghi lại kết quả cần thiết vào thẻ. Và bíp (100ms). Bạn đã thấy nó khủng như thế nào chưa? Nếu vẫn chưa thì bạn thử đánh lệnh ping trên Terminal nhé. Thời gian để gói tin di chuyển qua mạng internet đến server và quay về máy tính, mất khoảng 50ms server đó được cho là phản hồi tốt. Đó mới là thời gian để truyền tin. Thời gian để server xử lý, ví dụ như loadtime của một trang web trùng bình chẳng hạn, phản hồi khoảng 300ms Google pagespeed sẽ cho bạn điểm thưởng, Nhưng như vậy là muộn so với yêu cầu của suica.

Nếu là người chịu trách nhiệm thiết kế hệ thống như vậy, bạn sẽ làm như thế nào?

Một yêu cầu phi chức năng nữa mà nó cần đảm bảo là ổn định. Liên quan đến tiền nên nó không được phép tính sai, đã đành, nhưng nó không được phép dừng hoạt động. Trong giờ cao điểm mà cửa soát vé không hoạt động, mọi người bị kẹt lại trong ga. Ga tàu đông đúc, người ta rơi xuống đường ray … chuyện xấu lại xảy ra.

Và suica đáp ứng được yêu cầu này. Google còn thỉnh thoảng có thể không truy cập được. nhưng bạn đã bao giờ thấy suica không phản hồi bao giờ chưa. Khi bạn đưa thẻ vào đầu đọc, một là nó bíp (xanh) hai là nó tít tít (đỏ) báo lỗi. Chưa bao giờ nó chết cứng không hoạt động. Và trong những lần nó đỏ, lỗi chắc chắn là do người dùng (thẻ hết tiền, hoặc chưa đập thẻ lên tào đã đập thẻ xuống tàu), không có chuyện suica phản hồi nhầm.

Với vai trò là người thiết kế hệ thống, bạn sẽ thiết kế như thế nào để đảm bảo tính ổn định như vậy?

Vấn đề về tốc độ

Trước hết suica sử dụng công nghệ được phát triển ban đầu bởi Sony có tên là Felica, bản thân nó cũng là một công nghệ rất xuất sắc. Bên trong thẻ có một IC chip, chip này hoạt động không cần pin mà sẽ được khởi động bởi điện truyền qua sóng điện từ từ đầu đọc thẻ, được bắt qua dải anten năm trong thẻ. Thẻ Felica là thẻ chíp, khác với thẻ từ, nó có thiết bị lưu dữ liệu và hệ điều hành của riêng nó. Encryption key của nó được thay mới sau mỗi lần đọc ghi, đảm bảo tính bảo mật và không bị giả mạo. Thẻ có thể giao tiếp mà không cần tiếp xúc, chỉ cần đưa thẻ lại gần đầu đọc trong khoảng 10cm, thẻ và đầu đọc có thể nhận diện nhau, có thể truyền tin ở tốc độ 212kb/s. Nó sẽ tự động xóa bỏ phiên làm việc và khôi phục trạng thái cũ nếu đột nhiên mất liên lạc với đầu đọc để đảm bảo tính ổn định. Giê! Công nghệ xuất sắc của Sony mà, nhưng đó là chuyện cái thẻ.

Suica không nhanh chỉ bởi vì một cái thẻ.

Về cơ bản hệ thống sẽ chỉ tính toán online những cái gì cần thiết, những tác vụ nặng nhưng không cần gấp có thể thực hiện offline.

Về kiến trúc Server được đặt phân tán tại từng ga và bản thân cửa soát vé, ngoài ra còn có server trung tâm để tập trung thông tin. Khi nhận thông tin của thẻ, cửa soát vé sẽ xử lý bằng thông tin mà nó có, nếu không đủ nó sẽ truy vấn ngược lên server của nhà ga. Cũng tương tự như cách mà DNS hoạt động. Giúp giảm thời gian truyền tin qua mạng, vì thông tin chỉ truyền trong khoảng cách tương đối gần. Sau khi ghi nhận người dùng đã checkin vào ga. Hệ thống sẽ tính toán trước thông tin và số tiền người dùng có thể có và truyền trước thông tin đến các ga khác, trong khi hành khách đang trên tàu!!!!

Thiết kế này có thể hiện thực được vì tận dụng bản chất vật lý, hành khách cần thời gian để di chuyển giữa các ga. Trong lúc đó hệ thống sẽ chủ động tính toán trước.

Nếu người dùng đi vào và ra khỏi ga ngay lập tức, hoặc thanh toán trong ga thì sao?.

Khi đó thông tin có thể truy vấn ngay lập tức tại server ga sở tại, nên thời gian đáp ứng vẫn nhanh. Quá đẹp!!!

Ngoài ra ngay khi người dùng checkin, đầu đọc thẻ cũng sẽ lưu sẵn mã nhà ga mà hành khách lên. Trong thẻ cũng lưu sẵn mã của tất cả ga hành khách đăng kí trong vé tháng. Khi checkout, dựa vào thông tin lưu sẵn trên thẻ và thông tin được truyền đến trước đó. Thời gian đáp ứng của Suica vẫn được đảm bảo

Vấn đề ổn định

Như đã đề cập, Suica không được phép dừng hoạt động. Nhưng không thể thiết kế được một phần cứng nào có thể hoạt động 100% thời gian mà không có sự cố. Suica được thiết kế theo hướng kể cả khi sự cố có xảy ra thì hệ thống vẫn có thể vận hành đúng. Trong hệ thống vẫn tồn tại server trung tâm để tập trung và thống nhất dữ liệu, nhưng về bản chất hệ thống này là hệ thống phân tán. Dù server trung tâm gặp sự cố một thời gian thì server tại các nhà ga vẫn có thể tự hoạt động. Trên thực tế server trung tâm đã có lúc gặp sự cố thật nhưng hoạt động của suica vẫn không hề bị gián đoạn.

Ngoài ra với suica thực tế chỉ cần ghi nhận lại đầy đủ các sự kiện, ai đã nạp tiền ở đâu, khi nào, đã tiêu tiền ở đâu, bao giờ, bao nhiêu tiền là có thể khôi phục lại được thông tin đúng. Nên thậm chí thông tin ở server trung tâm có bị mất hoàn toàn nhưng dựa vào log tại các server phân tán thông tin đúng của thẻ vẫn có thể khôi phục lại được.

Tư tưởng thiết kế này hiện nay không có gì mới mẻ với người làm hệ thống. Nhưng nên nhớ rằng Suica được giới thiệu vào năm 2000. Trước cả khi Google bắt đầu phổ biến. Sau 20 năm nhìn lại cũng có thể thấy thiết kế của Suica cũng vượt qua thời đại một khoảng cách không nhỏ.

Kết

Cũng ko có gì để nói nhiều, hi vọng bạn giải đáp được thắc mắc của mình, còn mình thì mình thấy ngày xưa ai thiết kế hệ thống này thật là giỏi vãi. Chịu tải lớn, đòi hỏi ổn định cao, tốc độc cao. Mà sau 20 năm rồi vẫn làm người ta phải bất ngờ.

Còn trong trường hợp bạn vẫn chưa thuyết phục thì có thể đọc thêm tại đây nhé

https://tatase.hatenadiary.jp/entry/2015/11/09/今のエンジニアが学ぶべきSuicaのシステムの凄さ

https://www.jreast.co.jp/youran/pdf/2013-2014/jre_youran_group_p63_67.pdf

https://www.jreast.co.jp/press/2015/20150602.pdf