Chương 1: Giới thiệu Chương 2: Cơ sở lý thuyết Chương 3: Phân tích và thiết kế hệ thống Chương 4: Kết quả xây dựng Chương 5: Tổng kết và hướng phát triển 17 Chương2.NET Core 5 Đối với một website bán vé xe mang tính chất của một website thương mại điện tử, hệ thống sẽ có thể phải đối mặt một lượng lớn truy cập cũng như nguồn dữ liệu. Ngày nay có rất nhiều ngôn ngữ cũng như nên tảng công nghệ hỗ trợ các lập trình viên thực hiện các tính toán logic, truy xuất dữ liệu cho hệ thông website của mình nhưng nỗi bật hơn hết phải kể đến đó là ASP.NET Core và NodeJS - hai framework có độ phổ biến cao trong lĩnh vực xây dựng và phát triển dịch vụ ứng dụng web ở phía máy chủ. Nhờ vào đặc điểm có thé mở rộng (Scalability) mà cả hai có thể triển khai chia các xử lý dịch vụ nhỏ hơn, độc lập với nhau (microservice) từ đó tăng khả năng giải quyết yêu cầu với một lượng lớn truy cập. Điều này sẽ giúp website chúng tôi trở nên đa nhiệm hơn.
Yếu tố tiếp theo khi đề cập đến một website thương mại điện tử đó là tính bảo mật. Về khía cạnh này, ASP.NET Core và NodeJS đều có thể đáp ứng tốt. Mặc khác, một dự án xây dựng website quản lý bán vé xe sẽ cần phải có khả năng bảo trì nâng cấp khi cần thiết.NET Core thê hiện rõ điểm mạnh của mình trong việc quản lý và tô chức mã nguồn được viết bằng ngôn ngữ C# của mình. Trong khi đó, các dịch vụ ở NodeJS được viết bằng ngôn ngữ Javascript — một ngôn ngữ mang tính tiện dụng nhanh nhưng không đảm bảo được tính lâu dài trong việc bảo trì, nâng cấp và sửa chữa.
Cùng với yêu cầu dữ liệu ghế xe phải cập nhật theo thời gian thực, ASP.NET Core hỗ trợ mạnh mẽ việc tích hợp SignalR — một công nghệ cho phép dữ liệu được truyền đi và tiếp nhận realtime giữa client và server. Hơn thế nữa, ASP.NET Core cung cấp cho các lập trình viên một cộng đồng sử dụng và hỗ trợ rất lớn và giàu tiềm năng giúp họ có thể tham khảo mỗi khi gặp khó khăn. Nền tảng Google maps API Đây là nền tảng bản đồ vô cùng mạnh mẽ được phát triển bởi gã không lồ công nghệ Google. Là một nền tảng miễn phí được sử dụng rất phổ biến với các người dùng cuối ở Việt Nam.
Còn đối với doanh nghiệp muốn có các yêu cầu dữ liệu theo mong muốn thì phải tra phí dựa trên phiên (session), yêu cầu (request), lượt tải bản đồ (load map). Autocomplete Autocomplete - Per request* - 10,000 Autocomplete + Place - 10,000 Details - Per session* Hình 2.1: Bảng giá API tự động điền của Google Maps. Đối với bài toán cho phép người dùng nhập dữ liệu bất kỳ để đề xuất chuyến xe như website của chúng tôi, thì sự hỗ trợ của nền tảng này là thực sự cần thiết, với cơ sở dữ liệu hơn 200 triệu doanh nghiệp và địa điểm, Google maps sẽ cung cấp đa dạng cách lựa chọn đầu vào gần như là đúng ý muốn người dùng. Khi người dùng chọn một địa điểm Google maps API sẽ trả về tọa độ địa lý của điểm đó và cũng là đầu vào dé quét qua những trạm dừng, điểm dừng gan với vị trí đó.
Hiện tại, với chính sách của Google, chúng ta chỉ cần xác thực thẻ tín dụng (credit card) là có thể có 200 đô la miễn phí mỗi tháng dé sử dụng dịch vụ bản đồ của Google. Với mức miễn phí như vậy, mỗi tháng website sẽ có được khoảng 10.000 request miễn phí. 1 mart 1 Martin Place 1 Martin Street 1 Martin Place Mort Australi 1 Martin Street 1 Martins Avenue Google Hình 2.2: Dự đoán điểm đến dựa trên dữ liệu nhập của người dùng 19 Tuy nhiên, hệ thống có kế hoạch sẽ không phụ thuộc nhiều vào nền tảng này trong tương lai, vì vậy mỗi yêu cầu tìm kiếm của người dùng sẽ được tìm kiếm trong cơ sở dữ liệu trong hệ thống trước, néu như kết qua ít hơn 5 thì sẽ gọi API tới Google dé lấy dữ liệu, sau đó sẽ lưu lại dữ liệu này. Bên cạnh đó, dé tiết kiệm chỉ phí cho hệ thống, trong chức năng chỉ đường cho người dùng từ điểm nhập tới trạm dừng, chúng tôi sẽ mở đường link sang google map thay vì nhúng map vào hệ thống website.
Elastic Search Engine Elastic Search là một engine chuyên dùng để tim kiếm dữ liệu, hoạt động như một web server lưu trữ dữ liệu cung cấp khả năng truy cập gọn gàng cho client thông qua các giao thức RESTful. Do các điểm dữ liệu (document) trong Elastic Search Enginge được đánh index khi lưu và sửa, nên dữ liệu sẽ được tìm kiếm nhanh hơn cách tìm kiếm đữ liệu tuần tự truyền thống. Elastic search hỗ trợ nhiều cách tìm kiếm dữ liệu, nỗi trội như fulltext và đặc biệt là hỗ trợ kiểu dữ liệu địa lý (geopoint) cho phép người dùng tìm kiếm dữ liệu trong một bán kính cụ thể dựa trên vĩ độ, kinh độ đầu vào. Cách tìm kiếm này đặc biệt phù hợp với bài toán của website trong tìm kiếm những trạm gần nhất trong một bán kính cho phép so với điểm đi và điểm đến của người dùng nhập vào.3: Logo thương hiệu của Elastic Search 20 Ví tất cả thuộc tính trong một document đều là khóa chính, Elastic Search sẽ đánh index cho đữ liệu đầu vào, cũng như tiến hành đánh index lại mỗi khi có hành động cập nhật, xóa, vì vậy nhìn chung tốc độ thêm, xóa, sửa của Elastic Search engine sẽ chậm hơn đáng kể so với cơ sở dữ liệu truyền thống.
Elastic Search chỉ phù hợp với những hệ thống cần tìm kiếm nhanh và dữ liệu không được cập nhật và thêm liên tục. Đối với hệ thống bán vé xe của chúng tôi dữ liệu mua vé được thêm liên tục, và thông tin về trạng thái thanh toán của người dùng cũng sẽ được cập nhật sau đó, kèm theo đó Elastic Search engine không hỗ trợ transaction, điều này đặc biệt khá khó xử đối với hệ thống bán vé, cần chèn nhiều ghế vào cơ sở dữ liệu. Ví dụ khi một người cần chèn 3 ghế 1, 2, 3 vào cơ sở dữ liệu, khi chèn đến ghế thứ 2 thì một người khác đã chén ghế thứ 3. Vì không hỗ trợ transaction nên chúng ta hoàn toàn không thé rollback lại.
Chúng ta phải chọn ghế được xóa, sẽ là ghế số 3, vì người kia đã đến và chèn trước, sau đó tiến hành chèn tiếp ghế cuối cùng của người đầu tiên. Điều này gây ra những kịch bản khó kiểm soát cũng như làm chậm đi các yêu cầu đến từ người ding và đây cũng là kịch bản có thé xảy ra thường xuyên tại hệ thống bán vé. MaEqiaie Pak ee rine Pat mm, Austral lễ a / \ ots k Pat — > ie a = .ˆ Da hi Hình 2.4: Minh họa quét các trạm dừng theo bán kính cho trước 21 Đối với trường hợp trạm dừng trong hệ thống bán vé thì khác, dữ liệu trạm dừng sẽ ít được thêm, xóa sửa, các trạm dừng, điểm dừng thường là cố định và được quản lý bởi các cơ quan, tô chức có thấm quyền, loại dữ liệu này cũng không cần quản lý bởi transaction, nhưng đặc biệt chúng lại cần tìm kiếm nhanh theo tọa độ những trạm gần nhất so với điểm đi và đến của người dùng. Vì vậy, trong hệ thông bán vé xe của chúng tôi, tất cả dữ liệu sẽ được lưu và quản lý chặt chẽ bởi SQL Server, kết hợp với dữ liệu trạm dừng, điểm dừng được lưu ở Elastic Search Engine.
Real-time web-app với SignalR Đây là một thư viện mã nguồn trong ASP .Net mở được phát triển bởi Microsoft. Thư viện cho phép chúng ta xây dựng web — app nhanh chóng, dé dàng và hiệu quả với các cú pháp đơn giản. SignalR thực sự cần thiết đối với các web — app ASP .Net cần nhận phản hồi nhanh chóng và chủ động từ máy chủ. Cách thức hoạt động của signalR khá đơn giản, mỗi client sẽ kết nối và giữ kết nối với một Hub ở máy chủ (trong tiếng Anh kết nối này được gọi là pipeline), kết nối này cho phép client và server gọi các phương thức của nhau theo thời gian thực một cách chủ động thay vì chờ yêu cầu (request) đến từ client.
——: P- « Client le) Send response Send state h Set state SignalR Hub Lecturer's response update Send response Set state —=. Send response Client_n Hình 2.5: Mô hình hoạt động của SignalR Đối với bài toán đặt vé xe, đặc biệt trong các giờ cao điểm, các chuyến xe được đặt nhiều và nhanh, nếu không có hệ thống real-time thì người dùng sẽ khó 22 chọn được những ghế mong muốn cũng như hoàn toàn việc đặt 1 cách dé dàng. Ví dụ như một người cần 3 ghế trong 1 chuyến xe và một trong 3 ghế đó đã được đặt thành công bởi một người khác và khi người muốn đặt 3 ghế tiến hành đặt vé, hệ thống sẽ trả lỗi ghế x đã được đặt, điều này có thé giảm trải nghiệm người dùng của chúng ta khi một người tiến hành đặt liên tục không được trong khi đã tiến hành reload website nhiêu lân. Cơ chế xác thực sử dụng JSON Web Token (JWT) Bên cạnh các bài toán chính là cho phép tìm kiếm đa dạng và chọn ghế thời gian thực thì có một bài toán không thể thiếu ở một website thương mại điện tử đó là bài toán bảo mật.
Đề một website thương mại điện tử có thê hoạt động tốt và đảm bảo thông tin được chỉnh sửa đúng cách thì cơ chế xác thực và phân quyền người dùng là không thê thiếu. Đề giải quyết bài toán này chúng tôi sẽ sử dụng một cơ chế dựa trên JWT. JWT là một các ký tự được máy chủ sinh ra và gửi cho client khi thực hiện đăng nhập vào hệ thống. Thường được lưu trữ ở cookies hoặc local storage, va được đính kèm vào header của mỗi request người dùng thực hiện.
Khi một request đến máy chủ, máy chủ tiến hành xác thực token (authentication) sau đó là phân quyền (authorization) dựa trên JWT này. 23 HEADER: eyJhb6ci01.JTUzT1NiTsTnR5cCT6TkpXVC.ey JzdWTi01TxMjM@ôNTY30DkwTiwibmFtZST6Tkpva { "alg": "HS256", G4gRG91T1wiaWF9TjoxNTE2MjM5MDTyfQ. Sf1Kx “typ”: "JWT" wRJSMeKKF2QT4fwpMe.JY_adQssw5c } PAYLOAD: { "sub": "1234567896", "name": "John Doe", "iat": 1516239822 } VERIFY SIGNATURE HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload) , your-256-bit-secret ) secret base64 encoded Hinh 2.6: Minh hoa mot JWT Cấu trúc của một JWT gồm 3 phan: Header, Payload va Signature. Phan Header thường chứa các thông tin về kiều của chuỗi ký tự này (là JWT) và thuật toán mã hóa JWT này.
Phần payload thường chứa thông tin do máy chủ thêm vào, mỗi cặp key — value trong JWT được gọi là claim.