eCommerce & Micro Services

Nguyễn Quang Huy
Edumall Engineering
4 min readJan 29, 2019

Yêu cầu đặt ra

  • Xây dựng hệ thống theo mô hình Micro Services.
  • Áp dụng các công nghệ mới PWA, AMP đem lại trải nghiệm tốt hơn cho người dùng.
  • Là nền tảng eCommerce thực sự, thiết kế & giải pháp được chấp nhận và sử dùng bởi nhiều công ty, tổ chức ở Việt Nam và trên thế giới.
  • Tích hợp với các hệ thống cũ, không làm gián đoạn việc kinh doanh.

Lựa chọn

  • Sau khoảng 3tuần tìm hiểu về eCommerce, Magento2 là nền tảng được chọn làm xương sống của hệ thống.
  • Java & Spring Boot được chọn để xây dựng các micro service vệ tinh
  • ReactJS được chọn để làm web application (lựa chọn này vì team có nhiều thành viên biết ReactJS, nếu không VueJS với vue-storefront mình đánh giá là lựa chọn tốt hơn)
  • Elasticsearch để lưu trữ danh mục sản phẩm
  • MySQL để lưu trữ các thông tin phụ trợ

Các đặc điểm nổi bật của Magento2:

  • Là nền tảng eCommerce viết bằng PHP, phát hành lần đầu tiên năm 2008
  • Dữ liệu sản phẩm & người dùng được thiết kế theo mô hình EAV dễ dàng mở rộng và tùy biến
  • Chức năng promotion, coupon linh hoạt, đáp ứng tốt các yêu cầu kinh doanh
  • Chức năng cart, order chuẩn chỉ, làm nên xương sống của hệ thống eCommerce
  • Có hệ thống API & tài liệu đầy đủ, chi tiết. Đáp ứng 99.99% yêu cầu
  • Hiệu năng đọc dữ liệu tốt khi được cache bởi Varnish
  • Hiệu năng ghi dữ liệu có thể chấp nhận được với hệ thống trung bình, với hệ thống lớn cần sửa đổi lại để hiệu năng tốt hơn

Thách thức

  • Magento2 là một hệ thống lớn, tất cả các nghiệp vụ & chức năng được đóng gói trong cùng code base (Monolithic). Việc tách ra thành các micro service có thể làm nhưng rất tốt nguồn lực. Bản Commerce của Magento2 hỗ trợ việc “Split database performance solution” là một giải pháp tốt để tăng hiệu năng nhưng chưa cần thiết.
  • pwa-studio của Magento2 tại thời điểm tháng 10/2018 chưa đầy đủ tài liệu, v1.x cho thấy kiến trúc khá phức tạp, v2.x mới bắt đầu được phát triển (hiện tại 01/2019 v2.x vẫn chưa có bản RELEASE nhưng mình đánh giá khá cao khả năng dễ áp dụng & tùy biến cho dự án mình đã làm).
  • Nắm bắt luồng nghiệp vụ eCommerce, ánh xạ với luồng dữ liệu của Magento, tích hợp với các hệ thống cũ là một thách thức không nhỏ.

Giải pháp

  • Coi Magento2 là một service đóng kín, thay thế dần các module của Magento2 bằng Java & Springboot bắt đầu là Catalog (dùng Magento Community 2.3 không sửa đổi gì cả). Sau Catalog module dự kiến cần thay thế tiếp theo là Cart & Promotion. Cuối cùng là Order.
  • Xây dựng web appliction dựa trên ReactJS thuần, tuân theo các “best practice”, không tuân theo framework nào cả.
  • Áp dụng CQRS tách luồng đọc, ghi của dữ liệu:

B1: dữ liệu về product & catalog được nhập vào từ hệ thống cũ đang chạy tốt

B2: dữ liệu được lắng nghe bằng tiến trình viết bằng SpringBoot rồi đẩy vào RabbitMQ

B3: worker lấy dữ liệu từ RabbitMQ đẩy vào ElasticSearch & Magento2

B4: catalog-service lấy dữ liệu từ ElasticSearch trả về cho người dùng

Luồng xử lý đơn hàng

  • B1: Người dùng vào web application xem khóa học → gọi API của catalog-service
  • B2: Người dùng thêm khóa học vào giỏ hàng → gọi API của Magento2, tạo giỏ hàng trên Magento2 và cho khó học được chọn vào giỏ hàng (Cart)
  • B3: Người dùng thực hiện checkout
  • Người dùng điền thông tin điện thoại, email, địa chỉ → gọi API của Magento2, thêm các thông tin này vào Cart
  • Người dùng chọn hình thức thanh toán → gọi API của Magento2, thiết lập hình thức thanh toán, chuyển từ Cart sang Order với trạng thái mới tạo, chuyển người dùng sang trang thanh toán
  • B5: Người dùng thực hiện thanh toán
  • Người dùng điền xong thông tin thanh toán → gọi API của payment-service, tương tác với đối tác, cập nhật trạng thái order & chuyển người dùng đến trang cảm ơn
  • Người dùng xem lại thông tin Order trên trang cá nhân của mình → gọi API của auth-service để login, gọi API của user-service để xem lịch sử giao dịch

Kết quả

https://beta.edumall.co.th/

--

--