Microservices vs Kiến trúc nguyên khối [đã đóng]


82

Tôi đã đọc một số bài viết về microservices và tôi hơi bị tò mò. Có vẻ như đó là một khái niệm thú vị. Nhưng tôi tự hỏi, lợi và bất lợi khi sử dụng microservices so với kiến ​​trúc nguyên khối là gì và ngược lại.

Khi microservices phù hợp hơn và tốt hơn nên đi đâu với kiến ​​trúc nguyên khối.


6
Martin Fawler đã viết một bài báo mở rộng về chủ đề này. Tôi đánh giá cao đề nghị bạn đọc: martinfowler.com/articles/microservices.html
Kaj

Xem bài viết này về kiến ​​trúc microservies: medium.com/startlovingyourself/…
Bhagwati Malav

Dịch vụ vi mô chỉ là một phân đoạn của toàn bộ hệ thống ứng dụng chạy như một máy chủ hoặc quy trình dịch vụ một cách độc lập và nó được chạy trên một cụm máy chủ. Vì vậy, nếu một lỗi xảy ra trên dịch vụ đó, nó sẽ bị cô lập và toàn bộ hệ thống của bạn sẽ không bị hỏng hoàn toàn, đó là một lợi thế ngoài tính đồng thời mà bạn có thể nhận được.
LEMUEL ADANE

Câu trả lời:


75

Mặc dù tôi còn khá mới đối với thế giới microservices, nhưng tôi sẽ cố gắng trả lời câu hỏi của bạn đầy đủ nhất có thể.

Khi bạn sử dụng kiến ​​trúc microservices, bạn sẽ tăng khả năng tách và tách các mối quan tâm. Vì bạn đang chia nhỏ ứng dụng của mình.

Điều này dẫn đến việc cơ sở mã của bạn sẽ dễ quản lý hơn (mỗi ứng dụng độc lập với các ứng dụng khác để duy trì và chạy). Do đó, nếu bạn làm đúng , việc thêm các tính năng mới vào ứng dụng của bạn sẽ dễ dàng hơn trong tương lai . Trong khi với một kiến ​​trúc nguyên khối, nó có thể trở thành một điều rất khó thực hiện nếu ứng dụng của bạn lớn (và bạn có thể giả định rằng nó sẽ xảy ra vào một thời điểm nào đó).

Việc triển khai ứng dụng cũng dễ dàng hơn , vì bạn đang xây dựng các microservices độc lập riêng biệt và triển khai chúng trên các máy chủ riêng biệt. Điều này có nghĩa là bạn có thể xây dựng và triển khai các dịch vụ bất cứ khi nào bạn muốn mà không cần phải xây dựng lại phần còn lại của ứng dụng.

Vì các dịch vụ khác nhau có quy mô nhỏ và được triển khai riêng biệt, nên rõ ràng là dễ dàng mở rộng quy mô chúng hơn, với lợi thế là bạn có thể mở rộng các dịch vụ cụ thể của ứng dụng ứng dụng đang tải quá mức).

Tuy nhiên, đối với các ứng dụng không có ý định trở nên quá lớn để quản lý trong tương lai. Tốt hơn là giữ nó ở kiến ​​trúc nguyên khối. Vì kiến ​​trúc microservices có một số khó khăn nghiêm trọng liên quan. Tôi đã nói rằng việc triển khai microservices dễ dàng hơn, nhưng điều này chỉ đúng khi so sánh với các khối lớn. Sử dụng microservices, bạn có thêm sự phức tạp khi phân phối các dịch vụ đến các máy chủ khác nhau ở các vị trí khác nhau và bạn cần tìm cách quản lý tất cả những điều đó. Xây dựng microservices sẽ giúp bạn về lâu dài nếu ứng dụng của bạn lớn, nhưng đối với các ứng dụng nhỏ hơn, việc duy trì nguyên khối sẽ dễ dàng hơn.


21
Kinh nghiệm của tôi (và tôi đã làm việc trên cả hai loại cơ sở mã) là nguyên khối đơn giản hơn nhiều: cơ sở mã dễ quản lý hơn nhiều (có ít hơn nhiều!), Dễ dàng hơn để thêm các tính năng (bạn chỉ cần thêm chúng vào một nơi và không phải xác định các API liên quy trình cho mọi thứ) và việc triển khai nó dễ dàng hơn nhiều (bạn chỉ triển khai cho một tập hợp máy chủ chứ không phải nửa tá loại). Câu trả lời của @ Paulo là một bức tranh hoàn chỉnh hơn nhiều!
Ben Hoyt

"Việc triển khai ứng dụng cũng dễ dàng hơn, vì bạn đang xây dựng các microservices độc lập riêng biệt và triển khai chúng trên các máy chủ riêng biệt. Điều này có nghĩa là bạn có thể xây dựng và triển khai các dịch vụ bất cứ khi nào bạn muốn mà không cần phải xây dựng lại phần còn lại của ứng dụng." - Khi bạn có một số kiểu triển khai cho các dịch vụ khác nhau, việc triển khai nói chung khó hơn chứ không phải dễ dàng hơn. Có một cấu hình CI so với nhiều cấu hình, cấu hình này dễ bảo trì hơn.
Michael

Trường hợp tốt nhất để tách khối nguyên khối thành nhiều dịch vụ khi có các chức năng hoàn toàn độc lập . Nếu bạn không loại bỏ sự phụ thuộc trước, bạn có thể gặp phải trường hợp xấu nhất - nguyên khối phân tán (khớp nối chặt chẽ - thay đổi tầm thường = thay đổi mọi dịch vụ). Xem thêm chi tiết: Tiêu chí phân chia Microservices
uvsmtid

Câu trả lời này không trung lập vì bạn có thể xây dựng các ứng dụng mô-đun mà không cần microservices. Cơ sở mã không nhỏ hơn vì bạn thực thi API dịch vụ thay vì một dạng hợp đồng khác, các dịch vụ EJB hoặc Corba cũng được phép sử dụng mô-đun. Mặt khác, sự đơn giản bị cáo buộc của việc triển khai nhị phân khép kín bao gồm máy chủ ứng dụng đi kèm với cái giá phải trả là tính linh hoạt và thiên về sự tách biệt vai trò giữa nhà phát triển và các kỹ sư hỗ trợ / vận hành sản xuất.
Jose Manuel Gomez Alvarez

158

Đây là một câu hỏi rất quan trọng vì một số người bị thu hút bởi tất cả những lời bàn tán xung quanh microservices và có những sự cân bằng cần cân nhắc. Vậy, những lợi ích và thách thức của microservices (khi so sánh với mô hình nguyên khối) là gì?

Những lợi ích

  • Khả năng triển khai : nhanh nhẹn hơn để triển khai các phiên bản mới của dịch vụ do chu kỳ xây dựng + kiểm tra + triển khai ngắn hơn. Ngoài ra, hãy linh hoạt để sử dụng các cấu hình bảo mật, nhân rộng, tính bền bỉ và giám sát dành riêng cho dịch vụ.
  • Độ tin cậy : một lỗi microservice ảnh hưởng đến riêng microservice đó và người tiêu dùng của nó, trong khi trong mô hình nguyên khối, lỗi dịch vụ có thể ảnh hưởng đến toàn bộ nguyên khối.
  • Tính khả dụng : triển khai phiên bản mới của một microservice cần ít thời gian ngừng hoạt động, trong khi việc triển khai phiên bản mới của một dịch vụ trong nguyên khối yêu cầu khởi động lại toàn bộ nguyên khối thường chậm hơn.
  • Khả năng mở rộng : mỗi microservice có thể được mở rộng một cách độc lập bằng cách sử dụng các nhóm, cụm, lưới. Các đặc điểm triển khai làm cho microservices trở nên phù hợp tuyệt vời với tính đàn hồi của đám mây.
  • Khả năng sửa đổi : linh hoạt hơn để sử dụng các khung mới, thư viện, nguồn dữ liệu và các tài nguyên khác. Ngoài ra, các microservices được ghép nối lỏng lẻo, các thành phần mô-đun chỉ có thể truy cập thông qua các hợp đồng của chúng và do đó ít có nguy cơ biến thành một quả bóng bùn lớn.
  • Quản lý : nỗ lực phát triển ứng dụng được chia cho các nhóm nhỏ hơn và hoạt động độc lập hơn.
  • Quyền tự chủ về thiết kế : nhóm có quyền tự do sử dụng các công nghệ, khuôn khổ và mẫu khác nhau để thiết kế và triển khai từng dịch vụ vi mô, đồng thời có thể thay đổi và triển khai lại từng dịch vụ vi mô một cách độc lập

Thách thức

  • Khả năng triển khai : có nhiều đơn vị triển khai hơn, do đó, có nhiều công việc phức tạp hơn, tập lệnh, khu vực chuyển giao và tệp cấu hình để giám sát việc triển khai. (Vì lý do đó, phân phối liên tục và DevOps rất được mong đợi cho các dự án microservice.)
  • Hiệu suất : các dịch vụ có nhiều khả năng cần giao tiếp qua mạng hơn, trong khi các dịch vụ trong nguyên khối có thể được hưởng lợi từ các cuộc gọi nội hạt. (Vì lý do đó, thiết kế nên tránh các microservices "chát".)
  • Khả năng sửa đổi: các thay đổi đối với hợp đồng có nhiều khả năng ảnh hưởng đến người tiêu dùng được triển khai ở nơi khác, trong khi ở mô hình nguyên khối, người tiêu dùng có nhiều khả năng ở trong nguyên khối và sẽ được triển khai ngay sau khi hoàn thành dịch vụ. Ngoài ra, các cơ chế để cải thiện quyền tự chủ, chẳng hạn như tính nhất quán cuối cùng và các cuộc gọi không đồng bộ, làm tăng thêm độ phức tạp cho các dịch vụ nhỏ.
  • Khả năng kiểm tra: các bài kiểm tra tích hợp khó thiết lập và chạy hơn vì chúng có thể kéo dài các microservices khác nhau trên các môi trường thời gian chạy khác nhau.
  • Quản lý : nỗ lực quản lý các hoạt động tăng lên vì có nhiều thành phần thời gian chạy hơn, tệp nhật ký và tương tác điểm-điểm cần giám sát.
  • Sử dụng bộ nhớ : một số lớp và thư viện thường được sao chép trong mỗi gói microservice và diện tích bộ nhớ tổng thể tăng lên.
  • Quyền tự chủ về thời gian chạy : trong nguyên khối, logic kinh doanh tổng thể được gắn kết với nhau. Với microservices, logic được trải rộng trên các microservices. Vì vậy, tất cả những điều khác đều bình đẳng, có nhiều khả năng một microservice sẽ tương tác với các microservices khác qua mạng - sự tương tác đó làm giảm quyền tự chủ. Nếu sự tương tác giữa các microservices liên quan đến việc thay đổi dữ liệu, thì nhu cầu về ranh giới giao dịch sẽ ảnh hưởng đến quyền tự chủ hơn nữa. Tin tốt là để tránh các vấn đề về quyền tự chủ trong thời gian chạy, chúng tôi có thể sử dụng các kỹ thuật như tính nhất quán cuối cùng, kiến ​​trúc hướng sự kiện, CQRS, bộ nhớ cache (sao chép dữ liệu) và điều chỉnh các microservices với ngữ cảnh bị ràng buộc DDD. Những kỹ thuật này không có sẵn cho microservices, nhưng hầu như đã được đề xuất bởi hầu hết mọi tác giả mà tôi đã đọc.

Một khi chúng ta hiểu được những đánh đổi này , có một điều nữa chúng ta cần biết để trả lời câu hỏi khác: cái nào tốt hơn, microservices hay monolith? Chúng ta cần biết các yêu cầu phi chức năng (yêu cầu thuộc tính chất lượng) của ứng dụng. Ví dụ, một khi bạn hiểu tầm quan trọng của hiệu suất so với khả năng mở rộng, bạn có thể cân nhắc sự cân bằng và đưa ra quyết định thiết kế có kiến ​​thức.


Này, câu trả lời thú vị. Tôi đã tự hỏi liệu các màn trình diễn có khác biệt như vậy hay không. Bởi vì, microservices cần trao đổi mạng trong khi nguyên khối thì không. Tuy nhiên, nếu bạn có một triệu yêu cầu, thì ngay cả khi bạn có trao đổi mạng, việc xử lý sẽ bị phân chia bởi các microservices nơi mà nguyên khối phải hỗ trợ xử lý yêu cầu đầy đủ đúng không? Nếu chúng ta thực hiện một xác thực đơn giản, nó sẽ sử dụng một phần của tất cả khối mà các microservices sẽ chỉ cung cấp một phần nhỏ. Vậy hiệu suất của mono có giảm nhiều so với microservices khi lượng yêu cầu tăng không?
Emixam23

4
Tôi không hiểu lắm về nhận xét, nhưng vấn đề là ở chỗ so sánh hiệu suất của cùng một chức năng được triển khai và triển khai dưới dạng một tập hợp các dịch vụ nhỏ so với một tập hợp các thành phần trong cùng một nguyên khối. Tất cả những thứ khác đều như nhau, trong trường hợp này, hiệu suất (cụ thể là thời gian phản hồi) có xu hướng tốt hơn trong cách tiếp cận nguyên khối do khả năng thực hiện các cuộc gọi cục bộ thay vì các cuộc gọi từ xa do microservices yêu cầu.
Paulo Merson

1
Chuỗi cuộc gọi dài liên quan đến nhiều dịch vụ vi mô là một mô hình chống lại cần tránh và có những cách cụ thể để làm như vậy. Do đó, thời gian phản hồi sẽ không trở nên tồi tệ hơn với microservices. Chỉ có điều, bạn có thể sẽ sử dụng nhiều phần cứng hơn để phân phối cùng một tải. Tuy nhiên, chi phí phần cứng bổ sung mang lại cho bạn những thứ bạn không dễ dàng nhận được với nguyên khối (nếu bạn làm đúng microservices): thuộc tính mở rộng quy mô tốt hơn, khả năng phục hồi và độ tin cậy cao hơn và chu kỳ phát hành ngắn hơn nhiều.
user625488 23/09/18

11

@Luxo là đúng. Tôi chỉ muốn đưa ra một sự thay đổi nhỏ và mang lại quan điểm tổ chức của nó. Không chỉ microservices cho phép tách các ứng dụng mà còn có thể hữu ích ở cấp độ tổ chức. Ví dụ, tổ chức sẽ có thể chia thành nhiều nhóm trong đó mỗi nhóm có thể phát triển trên một tập hợp các dịch vụ nhỏ mà nhóm có thể cung cấp.

Ví dụ: trong các cửa hàng lớn hơn như Amazon, bạn có thể có nhóm cá nhân hóa, nhóm thương mại điện tử, nhóm dịch vụ cơ sở hạ tầng, v.v. Nếu bạn muốn tham gia vào dịch vụ vi mô, Amazon là một ví dụ rất tốt về điều đó. Jeff Bezos quy định các nhóm phải giao tiếp với các dịch vụ của nhóm khác nếu họ cần quyền truy cập vào một chức năng được chia sẻ. Xem ở đây để biết mô tả ngắn gọn.

Ngoài ra, các kỹ sư từ Etsy và Netflix cũng đã có một cuộc tranh luận nhỏ trở lại thời kỳ microservices vs monolith trên Twitter. Cuộc tranh luận ít kỹ thuật hơn một chút nhưng cũng có thể cung cấp một số hiểu biết sâu sắc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.