thảo luận Gộp 1 vài services

RioZ

Junior Member
Chào các bro. Team em đang gặp khó khăn trong việc re-design lại microservices. Project của anh bạn Sing, nhưng chôm khá nhiều core từ thiên triều (cũng dễ hiểu mà, giờ project éo nào chả thế :)). Ban đầu team em gia công cho 1 client ở Sing, nên build microservice theo cái core kia, chấp nhận bị duplicated bizness code ra nhiều services, miễn là delivery cho họ kịp hạn. Giờ có đối tác được client cũ giới thiệu sang, muốn build hệ thống na ná vậy, change bizness đi một chút. Thằng lead thì bỏ của chạy lấy người rồi, team lại toàn thợ code chả thằng nào rành về design structure. Nói sơ qua về project nhé.

- Mình không thể kể ra toàn bộ, mà nói khái quát những cái đang gặp khó khăn thôi nhé, lỡ bể chuyện thì bọn nó thịt mình =((. Có 1 services authern chứa credential (gọi là A), thằng này làm nhiệm vụ xác thực rồi bắn response cho customer-handle service, gọi thằng này là B, nhận được authern rồi nó cung cấp metadata cho các services khác. Ban đầu thằng B lãnh đạn hứng request từ user và cả xử lý nặng nữa, nhưng team em đã tách được nhiệm vụ này sang thằng B2 để nó chuyên xử lý mấy cái nặng nhọc như paging, handle async. Ngoài ra, do đặc thù bizness cần counter nên build thêm 1 service nữa (dùng framework khác cho thuận lợi hơn) gọi là Counter service (C)

- Server chứa credential đã được tay lead custom re-structure khá ngon, giờ chỉ ngồi custom lại chút để hợp bizness mới mà thôi. Bộ counter chạy khá ngon và chính xác, còn thằng B hứng request từ user trước mắt không cần sửa gì rồi. 3 thằng này khỏi quan tâm. Nếu sửa chắc vẫn chỉ sửa linh tinh mỗi thằng B.

- Data xịn của user được chứa ở các Division services (là các D), hứng metadata truyền từ thằng B đến và so khớp với metadata của nó, để handle việc crud. Mỗi thằng D đều có postgresql lưu data và mongodb làm cache, cũng dùng mongodb đựng các config/metadata. Tính đến giờ đã build ra 3 services cho 3 loại metadata: json, xml, REST API => tương ứng với từng format mà data lưu xuống postgre sẽ mang đặc thù riêng :byebye:; mà code các thằng D lại giống giống nhau (thậm chí giống đến 70~80% luôn ạ). Do code base của D phục vụ chuyên cho handle crud nên em đã chỉnh cho nó làm nhiệm vụ export data, gọi đến cache, paging và counter theo kiểu fix cứng trong code.


- Ông client mới đang rất ưng cái export, họ chỉ muốn chỉnh sửa bizness đôi chút cho hợp với logic bên họ thôi. Vấn đề mới bây giờ là họ cần thêm tính năng import nữa, cũng có bizness đi theo 3 loại format đó luôn. :ah: Team phải viết thêm D+ implement tính năng import, ban đầu viết trước cái format json đã, xem họ ưng không. Mà các bác biết rồi đấy, viết code import big data khá lằng nhằng, mới viết xong 1 cái mà chi phí đã cao, bên em đang đàm phán với họ về giá của cả 3. Code export của team hiện tại đã móc logic cache, paging lung tung với thằng B2 lộn xí ngầu cả lên, trong khi import thì đách cần cache làm gì. Nhưng khổ nỗi chức năng import của client lại.. giống hệt với 3 format của D, nếu giờ tách code ra service mới thì duplicate ác mộng. Nhỡ đâu sau này maintain, client muốn sửa 1 chút bizness thế là phải sửa tất cả các thằng D, chắc cả team bốc cư't quá. Báo giá để sửa 1 nhóm nhỏ bizness không được deal quá cao, nhưng chi phí để sửa tất cả các D và D+ là rất tốn công. :cry:

1652581849408.png

Em biết kiến trúc microservices phải chấp nhận duplicated code, không như kiến trúc mono có thể module hóa để re-use thuận tiện. Vừa đòi hỏi micro vừa đèo bòng re-use code là quá tham lam. (Chỗ này em tự gạch vì có vẻ sai sai)

Khái quát vấn đề em gặp phải: code cũ cho 3 loại metadata bị dup ra làm 3 và vẫn na ná nhau, code này gọi đến service handle để thao tác các caching, paging khá lằng nhằng; code mới cũng tương tự code cũ nhưng không gọi đến thằng handle kia. Nên em cần refactor thằng D theo kiểu gộp code base của 3 thằng cũ vào chung 1 source, rồi từ đó triển khai code import mới ở D.

Team em có 1 lợi thế lớn, là bộ code cũ đã bán cho client cũ và bên họ chạy ngon rồi, không thêm bớt gì nữa.

Sau đây là hướng xử lý của em đưa ra. Nếu các bro có cao kiến gì hãy cứ gạch đá thoải mái nhé.
  • Team em sẽ tạm "đập đi xây lại" bộ D, gọi vậy cũng hơi quá, chỉ là tinh chỉnh code của các D services sao cho nó chung 1 code base, build ra cả 3 dạng như ý muốn. Config nằm trong mongo các kiểu rồi, giờ bỏ công fix lại nhưng về lâu dài sẽ có lợi.
  • Gộp thằng import D+ vào trong D services. Sẵn có mongo, tách phần code ra sao cho code chạy export theo flow riêng, import riêng. 2 flow này vẫn có thể re-use các bizness function vì bây giờ chúng đã nằm ở cùng nơi rồi.
  • Trường hợp xấu nhất là bỏ luôn thằng B2 và sẽ paging, caching các kiểu ở trong D. Nhưng như vậy sẽ gây bottle-neck ở D.
 
Last edited:
Hệ thống của thím không phải microservice mà là big ball of mud thì đúng hơn.
Em biết kiến trúc microservices phải chấp nhận duplicated code, không như kiến trúc mono có thể module hóa để re-use thuận tiện. Vừa đòi hỏi micro vừa đèo bòng re-use code là quá tham lam.
Đã gọi là micro và nếu micro thật sự thì rất ít hoặc không có duplicate code.

Nếu code được viết dạng module thật sự (loosely coupling, high cohesion) thì deploy nó vô monolith, microservice hay serverless cũng không thành vấn đề. Từ khoá thím cần tham khảo là clean architecture.
Nhưng giờ với budget siêu nhỏ của team thì em nghĩ là nên kệ mẹ nó, đắp feature vào cho xong project rồi té đi, outsource thời gian đâu mà re-architecture. Đến công ty product to vcd như Zendesk mà bị technical debt kiểu này còn éo giải quyết nổi, dev vác dái chạy hết, cty là tuyển dev mới vào đắp thêm feature lên hệ thống cũ và cách đó vẫn work nên họ không muốn thay đổi gì đâu.
 
Cơ bản là tách hàm tách service, refactor mỗi cái cho 1 mục đích cụ thể
Vấn đề duplicate code có 2 cách:
Tách service riêng
Tách module riêng rồi nhúng vào các module khác như 1 dependency

via theNEXTvoz for iPhone
 
Tôi thấy việc tái cấu trúc lại code để đỡ duplicate là hợp lý rồi. Khổ trước sướng sau.
  • Nếu sau này có 1 loại metadata mới hay cần chỉnh sửa gì thì cũng đỡ tốn công
  • Giờ có khách hàng mới thì đây là cơ hội để chỉnh sửa, hệ thống đang chạy mà sửa thì có nhiều rủi ro hơn
  • Nếu sau này có khách hàng mới nữa thì mình có thể dùng hệ thống mới này để phát triển tiếp
  • Nếu tái cấu trúc thành công thì đó cũng là 1 thành tựu của bản thân và team. Sau này có thể chém với mấy đứa em hoặc nhà tuyển dụng là hồi xưa 1 tay anh cấu trúc lại đống project này nên nó mới ngon như bây giờ :rolleyes:. Nếu không dọn dẹp thì như rác còn trong nhà, ngày nào cũng thấy.
Chi phí/thời gian nếu đi theo hướng này thì phải cần thêm ở giai đoạn đầu rồi, nhưng giai đoạn sau sẽ tốt hơn
Mà vụ gom D và D+ thì cẩn thận xem thao tác import có tốn nhiều tài nguyên với số lượng request có cao không để optimize, không khéo lại ảnh hưởng performance chung.
 
Nói thật với thớt là design hệ thống phải dựa vào business mới chuẩn được. Chứ hỏi đại khái thế này thì bố ai trả lời được.

Sent from Samsung SM-A528B using vozFApp
 
Code export của team hiện tại đã móc logic cache, paging lung tung với thằng B2 lộn xí ngầu cả lên, => bạn làm rõ hơn flow chỗ này cái
 
Ủa nhưng bạn đang gặp vấn đề gì mới được chứ
Không có bài toán thì giải quyết kiểu gì :D

Giờ bạn muốn
  • Phát triển tính năng mới
  • Thay đổi artchitecture hệ thống
  • Giảm code duplication

Thì chọn 1 cái ưu tiên thôi chứ định làm hết hay sao...
 
Ủa nhưng bạn đang gặp vấn đề gì mới được chứ
Không có bài toán thì giải quyết kiểu gì :D

Giờ bạn muốn
  • Phát triển tính năng mới
  • Thay đổi artchitecture hệ thống
  • Giảm code duplication

Thì chọn 1 cái ưu tiên thôi chứ định làm hết hay sao...
Team em đang có thời cơ làm cả 3. :D Tranh thủ làm thôi chứ mai mốt các ông tướng vác dái chạy thì cái hệ thống này vứt. Mấy hôm nay em cũng chả làm được gì cả, thằng lead mới "lên chức" lại đang bận deal với client rồi.

Cơ mà trong list 3 cái trên, em nghĩ cái 1 vẫn đặt độ ưu tiên cao hơn, để có thêm tí tiền dằn túi đã, bụng không đói, đầu gối sẽ dư sức để bò. :big_smile: Còn lại cứ theo thứ tự 1-2-3 vậy.

Nhưng giờ với budget siêu nhỏ của team thì em nghĩ là nên kệ mẹ nó, đắp feature vào cho xong project rồi té đi, outsource thời gian đâu mà re-architecture. Đến công ty product to vcd như Zendesk mà bị technical debt kiểu này còn éo giải quyết nổi, dev vác dái chạy hết, cty là tuyển dev mới vào đắp thêm feature lên hệ thống cũ và cách đó vẫn work nên họ không muốn thay đổi gì đâu.
big ball of mud :too_sad:
Thú thật client mới đây là ông client tiềm năng, nếu lần này bên họ chạy ngon thì khả năng team em sẽ có cơ hội làm về solution cho họ. Team em đều tin rằng họ quan tâm đến code quality. Việc refactor cả system cũng có lợi phần nào nếu họ muốn thuê thêm.
 
Last edited:
Chi phí/thời gian nếu đi theo hướng này thì phải cần thêm ở giai đoạn đầu rồi, nhưng giai đoạn sau sẽ tốt hơn
Mà vụ gom D và D+ thì cẩn thận xem thao tác import có tốn nhiều tài nguyên với số lượng request có cao không để optimize, không khéo lại ảnh hưởng performance chung.
Em vẫn đang merge code mới vào cái D cũ, chưa làm xong. :shame: Xong phần lớn thì em sẽ thử test theo cách import/export big data cùng lúc xem nó chịu nổi không.

Hệ thống cũ thì các services D chạy độc lập, chỉ gọi chung đến B2 thôi, mà thằng B2 chịu tải khá tốt, đến nay chưa bị client complain vụ bottle-neck. :beauty:
 
Back
Top