Câu chuyện của công ty DKE

DKE là nhà phân phối linh kiện điện tử lớn thứ 5 thế giới. Họ xây dựng một hệ thống ERP Distribution Management System để phục vụ cho việc phân phối bán lẻ từ năm 2002 trên nền tảng MFC, viết bằng C/C++ với hơn 2 triệu dòng code. Đến nay cũng đã gần 20 năm.

Hệ thống hiện tại đang gặp nhiều vấn đề như sau:

  • Nhiều công nghệ phát triển cách đây hơn 20 năm như MFC đến nay đã lỗi thời, nhất là khi .NET, .NET core ra đời;
  • Thiết kế ban đầu là thiết kế đơn khối (Monolithic) trở nên cồng kềnh do quá nhiều chức năng được thêm vào, khó bảo trì, quá trình xây dựng, triển khai source code mất nhiều thời gian. Việc triển khai mở rộng hệ thống thật sự phức tạp;
  • Khó thay đổi framework, hệ thống viết bằng C/C++ và MFC, nếu chuyển đổi sang .NET core ,C# gần như phải viết lại toàn bộ.

Họ quyết định thay đổi lại thiết kế chuyển đổi kiến trúc từ monolithic sang microservice. Với mục tiêu tận dụng thế mạnh của kiến trúc microservice như khả năng dễ triển khai, sử dụng được nhiều technical stack, scaling…

Tuy nhiên nói thì dễ nhưng làm thì khó, mặc dù kiến trúc microservice có nhiều ưu điểm hơn kiến trúc đơn khối nhưng đội kĩ sư của DKE gặp phải những vấn đề như sau:

  • Database của DKE có hơn 500 bảng, sử dụng Oracle DB relationship quan hệ giữa các bảng vô cùng phức tạp. Mỗi bảng có trung bình vài trăm nghìn record. Làm thế nào để chia nhỏ database này sang multi- database trong kiến trúc microservice và chuyển dữ liệu sang?

  • Việc chuyển từ mono sang microservice không thể thực hiện ngay lập tức, mà phải mất nhiều năm. Như vậy không thể dừng ngay hệ thống mono để chuyển được, mà phải thực hiện kiểu roll-out. Vậy làm thế nào để 2 hệ thống này chạy song song?
  • Trong quá trình chuyển dữ liệu, thì hệ thống cũ có thể vẫn được cập nhật liên tục, làm sao có thể đáp ứng được thay đổi này sang hệ thống mới kịp thời.

Ngoài ra có rất nhiều khó khăn khác không thể kể hết được.

Giải pháp

Trong vòng gần 2 năm, các kĩ sư của DKE đã nghiên cứu thử nghiệm rất nhiều phương pháp khác nhau để thực hiện việc di chuyển. Bài viết này chia sẻ một số giải pháp ở mức độ khái quát.

Nghiệp vụ của DKE là Distributed management system, hiểu nhanh là phân phối bán lẻ. Phương pháp domain drive design được áp dụng để phân tích nghiệp vụ và chia nhỏ hệ thống thành từng module riêng lẻ như Order, Payment, Sale.

Từ kết quả của việc phân tích business của DDD, các kĩ sư đã có thể ước tính được module, số microservice cần tạo.

Các microservice được tách thành internal service và external service. Internal service được viết bằng NodeJS trực tiếp tương tác với database, gửi nhận dữ liệu bất đồng bộ cho external service (expose API) to client qua message queue. Về sau thì phần internal microservice được chuyển thành .NET core.

Phần API viết bằng .Netcore và sử dụng thư viện Swagger để sinh ra API specs.

Theo microservice best practice, để đảm bảo loose coupling, database sẽ được tách ra thành nhiều database nhỏ sở hữu bởi các microservice. Tuy nhiên khi đưa vào thực tế, với database quan hệ chằng chịt, phụ thuộc lẫn nhau, và cả triệu record data thì chia nhỏ là chuyện không đơn giản.

Team đã sử dụng phương pháp chia nhỏ và chuyển data thành từng phần như gom những bảng thuộc sale thì một database làm chủ bởi các sale service, payment thành 1 một database, làm chủ bởi payment service.

Oracle Golden Gate được thử nghiệm để di chuyển giữa database mới sang database cũ.

Mặc dù việc thử nghiệm trên từng module riêng lẻ cho kết quả hứa hẹn, nhưng việc chia toàn bộ database vẫn là bài toán phức tạp do vấn đề chuyển đổi tính đồng nhất dữ liệu (ACID) sang BASE của microservice.

Do đó, việc di chuyển sang microservice vẫn đang dừng ở phần code logic, các microservice vẫn point vào 1 database duy nhất.

Để biết các kĩ sư DKE xử lý như thế nào, mời quý độc giả đón đọc bài tiếp theo!

Đỗ Trọng Nguyên – FPT Software

Tin liên quan: