chúng ta đã đến vòng tròn đầy đủ với các dịch vụ siêu nhỏ, trở lại các phương pháp tiếp cận trường học rất cũ chưa?


9

Về mặt kiến ​​trúc và thiết kế phần mềm, làm thế nào để microservice "xếp chồng" (ý định chơi chữ) chống lại phần mềm trung gian? Tôi đến từ Java và có vẻ như khi bạn rời khỏi REST thẳng như một API và trừu tượng hóa các lớp khác nhau và các tham số kết nối, ít nhất là trong Java, bạn gần như quay lại với một số ý tưởng trường học rất cũ . Chúng tôi đã trở về với ảo hóa ... wheras JVM là đã ảo.

Theo một cách bất khả tri, bạn có thể, và tôi sẽ tranh luận về những lợi thế của việc trừu tượng hóa API RESTful thành CORBA. Hoặc, theo cách trung tâm java hơn, JMS hoặc MDB.

Đã có lúc EJB là một vấn đề lớn trong Java, sau đó nó được công nhận là một chút của một cụm sao, nhưng, bây giờ, chúng ta có trở lại từ đầu không?

Hoặc, microservice có cung cấp thứ gì đó mà CORBA, hoặc thậm chí tốt hơn, MDB, thiếu không? Khi tôi đọc (TLDR) Martin Fowler giải thích về các dịch vụ siêu nhỏ, nó sẽ cho tôi một giải pháp tốt cho một vấn đề xấu, nếu bạn muốn. Hay đúng hơn, một cách tiếp cận có đầu óc khép kín, đưa ra một mức độ phức tạp chỉ đẩy vấn đề xung quanh. Nếu các dịch vụ thực sự là vi mô và rất nhiều, thì mỗi dịch vụ có một chi phí đô la để vận hành và duy trì nó.

Hơn nữa, nếu một dịch vụ vi mô trong số nhiều dịch vụ thay đổi API, thì mọi thứ tùy thuộc vào dịch vụ đó bị phá vỡ. Nó dường như không kết hợp lỏng lẻo, nó có vẻ trái ngược với nhanh nhẹn. Hay tôi đang lạm dụng những từ đó?

Tất nhiên, có một lượng lựa chọn không xác định giữa các thái cực này.

Cá mập so với Gorilla ... đi! (Đối với phạm vi, điều đó có nghĩa là mỉa mai và hoàn toàn không phải là ý định của tôi. Câu hỏi được đặt theo mệnh giá. Nếu câu hỏi có thể được cải thiện, vui lòng làm như vậy hoặc nhận xét và tôi sẽ sửa. )

Hình dung vô số dịch vụ siêu nhỏ đang chạy trong docker, tất cả trên một máy, nói chuyện với nhau ... điên rồ. Khó duy trì hoặc quản trị viên, và bên cạnh không thể thay đổi bất cứ điều gì vì mọi thay đổi sẽ xếp tầng và gây ra các lỗi không lường trước được. Làm thế nào tốt hơn là các dịch vụ này nằm rải rác trên các máy khác nhau? Và, nếu chúng được phân phối, thì chắc chắn một số kỹ thuật trường học rất, rất cũ đã giải quyết, ít nhất là ở một mức độ, tính toán phân tán.

Tại sao tỷ lệ ngang rất phổ biến, hoặc ít nhất là mong muốn?


4
Bỏ phiếu để đóng. Không rõ bạn đang hỏi gì và tại sao bạn lại hỏi nó. Kiến trúc microservice chỉ là một kiến ​​trúc khác. Không hơn không kém.
davidk01

1
Bạn cũng có thể thấy bài viết này đáng giá: devweek.com/blog/microservice-the-good-the-bad-and-the-ugly
davidk01 11/03/2015

1
Tôi thích "Vì vậy, bây giờ họ có hàng trăm dịch vụ giả nhỏ, và thay vì nguyên khối, họ phải lo lắng về những gì sẽ xảy ra khi ai đó muốn thay đổi hợp đồng của một trong những dịch vụ đó. Một quả bóng, bằng một tên khác. về việc tự hỏi liệu mã sẽ biên dịch nếu họ thực hiện thay đổi, họ tự hỏi liệu nó có chạy hay không, trong thực tế. " - microservice cho từ chối cổ gắt gỏng : không, tôi không phải là một người cổ, đó chỉ là một bài viết hài hước.
Thufir 11/03/2015

"Thay vì tự hỏi liệu mã sẽ biên dịch ... họ tự hỏi liệu nó có chạy được không ..." Trên thực tế đây không phải là vấn đề. Đơn giản là vì nếu nhà phát triển thay đổi hợp đồng mà không thông báo cho tất cả các bên liên quan - nhà phát triển đó sẽ rất khó khăn. Nghĩa đen Nếu chúng tôi sử dụng hợp đồng có thời hạn thì hãy tưởng tượng nếu nhà cung cấp dịch vụ di động của bạn thay đổi các điều khoản hợp đồng mà không hỏi / thông báo cho bạn? Đó là lý do tại sao đó là hợp đồng - tất cả các bên liên quan phải nhận thức được / đồng ý về các thay đổi hợp đồng và khi thay đổi này xảy ra (giả sử dòng phát triển phù hợp), tất cả nên được kiểm tra và vận hành trơn tru.
Alexey Kamenskiy

1
@Thufir Như đã nói trước khi MS chỉ là một cách tiếp cận khác, nó sẽ có những lợi ích và nhược điểm của nó. Tôi thực sự đã làm việc với phương pháp này (ngay cả trước khi tôi nghe nói rằng nó có một tên đặc biệt cho nó) trên nhiều dự án. Như một lưu ý phụ - nó không phải là một thác nước, nó là những gì bạn làm cho nó. Khi tôi làm việc cho một dự án phát triển (theo nhóm) của hệ điều hành di động, cách tiếp cận này là cách duy nhất bởi vì hệ điều hành không thể được tạo ra giant blob, nó phải có giao diện, vì vậy mỗi phần bắt đầu từ kernel là loại MS, và điều đầu tiên trước đó bất kỳ nhóm nào bắt đầu viết mã là đồng ý về thông số kỹ thuật v0.0.1.
Alexey Kamenskiy

Câu trả lời:


2

TL; DR. Tôi đã có niềm vui khi uống rất nhiều Kool-Aid có hương vị microserver, vì vậy tôi có thể nói một chút về lý do đằng sau chúng.

Ưu điểm:

  • Các dịch vụ biết rằng sự phụ thuộc của họ là ổn định và đã có thời gian để nướng
  • Cho phép triển khai các phiên bản mới
  • Cho phép các thành phần được hoàn nguyên mà không ảnh hưởng đến các lớp cao hơn.

Nhược điểm:

  • Bạn không thể sử dụng các tính năng mới và sáng bóng của các phụ thuộc của bạn.
  • Bạn không bao giờ có thể phá vỡ tính tương thích ngược API (hoặc ít nhất là không cho nhiều chu kỳ phát triển).

Tôi nghĩ rằng về cơ bản bạn hiểu sai về cách một kiến ​​trúc microservice được cho là hoạt động. Cách thức hoạt động của nó là mọi dịch vụ siêu nhỏ (được gọi từ đây trở đi là MS) đều có API cứng nhắc mà tất cả các khách hàng của nó đồng ý. MS được phép thực hiện bất kỳ thay đổi nào mà nó muốn miễn là API được bảo tồn. MS có thể được ném ra và viết lại từ đầu, miễn là API được bảo tồn.

Để hỗ trợ cho khớp nối lỏng lẻo, mọi MS phụ thuộc vào phiên bản n-1 phụ thuộc của nó. Điều này cho phép phiên bản hiện tại của dịch vụ kém ổn định hơn và rủi ro hơn một chút. Nó cũng cho phép các phiên bản đi ra trong sóng. 1 máy chủ đầu tiên được nâng cấp, sau đó một nửa và cuối cùng là phần còn lại. Nếu phiên bản hiện tại phát triển bất kỳ vấn đề nghiêm trọng nào, MS có thể được khôi phục về phiên bản trước mà không mất chức năng trong các lớp khác.

Nếu API cần được thay đổi, nó phải được thay đổi theo cách tương thích ngược.


"MS có thể được ném ra và viết lại từ đầu, miễn là API được bảo tồn." - mới thoải mái đấy, nhưng ok. Về mặt hiệu suất, ở đầu đối diện của quang phổ, làm thế nào để tất cả các MS này so sánh với một ứng dụng / dịch vụ / hệ thống nguyên khối? Về mặt phân phối, có vẻ như , và vui lòng sửa cho tôi nếu sai, rằng có hiệu suất tiềm năng từ việc đặt n MS trên một máy duy nhất ... ảo hóa trên máy tính lớn ?? Nó gần giống như bạn càng mở rộng quy mô của MS theo chiều ngang thì càng đơn giản để sau đó chia tỷ lệ theo chiều dọc ...? Điểm thưởng cho việc không đọc câu hỏi của tôi :)
Thufir

1
Như với bất kỳ lớp gián tiếp nào, bạn đang thực hiện một cú đánh hiệu suất so với một quả bóng bùn lớn. Trong trường hợp của MS, nó đặc biệt tốn kém vì bạn đang thực hiện một chuyến đi khứ hồi trên mạng cho mỗi cuộc gọi. Sử dụng ảo hóa hoặc container làm cho chuyến đi khứ hồi này ngắn hơn đáng kể vì cuộc gọi không bao giờ thực sự rời khỏi máy. Điều đó cũng có nghĩa là bạn có được sự cô lập nhiều hơn (một dịch vụ chạy trốn không thể làm tổn thương các đồng nghiệp của nó) với chi phí phần cứng nhỏ hơn.
Konstantin Tarashchanskiy

5

Mọi kỹ thuật phát triển phần mềm mà chúng tôi từng phát minh ra là về việc quản lý sự phức tạp bằng cách nào đó. Một phần lớn trong số họ đã và đang tiếp tục là về sự trừu tượng, đóng gói và khớp nối lỏng lẻo. Microservice là một cách khác để thực hiện những điều đó, có lẽ đó là lý do tại sao nó giống với nhiều kỹ thuật cũ hơn ở cấp độ lý thuyết cao, nhưng điều đó không làm cho nó ít hữu ích hoặc có liên quan.

Về khớp nối lỏng lẻo, tôi nghĩ bạn đã hiểu nhầm mục tiêu một chút. Nếu tác vụ A cần gọi tác vụ B, sẽ không bao giờ có cách nào khiến A và B tách rời 100%. Sẽ không bao giờ xảy ra Những gì bạn có thể làm là đảm bảo rằng, nếu tác vụ B gọi nhiệm vụ C, thì nhiệm vụ C không bao giờ phải lo lắng về các thay đổi đối với A. Nếu ba nhiệm vụ này được liên kết với nhau trong một đốm lớn, truyền các cấu trúc cho nhau, thì sẽ có một rất có thể tất cả họ sẽ phải thay đổi nếu bất kỳ ai trong số họ làm điều đó. Nhưng nếu cả ba đều là microservice, thì về cơ bản, bạn đã đảm bảo rằng một thay đổi đối với A sẽ chỉ buộc B cập nhật (trừ khi đó là một thay đổi lớn đối với chức năng cốt lõi của A mà bạn có lẽ nên biến nó thành một dịch vụ hoàn toàn mới). Điều này đặc biệt đúng nếu tất cả các cập nhật microservice được thực hiện theo cách tương thích ngược, mà chúng nên được.

Về nhận xét nhanh, tôi có thể nói với bạn từ kinh nghiệm cá nhân rằng mã microservice-y của chúng tôi chơi tốt hơn rất nhiều so với mã nhanh hơn so với mã "được liên kết thành một blob lớn" của chúng tôi. Sau đó, bất cứ khi nào ai đó sửa lỗi ở chức năng cấp thấp, anh ta thực sự phải gửi cho toàn bộ bộ phận R & D một email nói rằng "vui lòng gửi lại nhiệm vụ của bạn hoặc tất cả họ sẽ gặp sự cố vào thứ Sáu". Chúng tôi nhận được một vài trong số này mỗi tuần . Nếu mã của anh ta ở trong một dịch vụ siêu nhỏ, tất cả chúng ta sẽ tự động hưởng lợi từ việc sửa chữa ngay khi anh ta triển khai một phiên bản mới.

Tôi không hiểu đầy đủ nhận xét về COBRA và MDB, vì dường như chúng không phải là kiến ​​trúc phần mềm mà là các thành phần của một; theo hiểu biết của tôi, chúng là những cách tiềm năng để xác định các giao thức nhắn tin của microservice và / hoặc triển khai các dịch vụ micros nói trên, chứ không phải trong các lựa chọn thay thế cho microservice.


1
"Nếu ba nhiệm vụ này được liên kết với nhau trong một đốm lớn ..." Tôi chỉ có quan điểm Java về vấn đề này, nhưng tôi sẽ nói "không", ý tưởng tồi, đừng làm điều đó. Thực hiện một thư viện, API # 1, # 2 API, vv, để đạt được điểm chính xác của bạn "..task C không bao giờ phải lo lắng về những thay đổi đến A," bởi vì C là một khách hàng của B chỉ và không của A ở tất cả . Về vấn đề đó, tôi không thấy điều đó là mới cả, xin lỗi. Tôi biết rằng câu hỏi tôi hỏi là mờ nhạt. Đó là một câu hỏi mờ vì tôi mờ về những gì nó nói về tất cả. Mỗi câu trả lời đều hữu ích cho tôi, nếu chỉ để giúp với vốn từ vựng của tôi.
Thufir

1
@Thufir Nếu tất cả các thư viện được liên kết động và tất cả các tác vụ đều chạy trên cùng một bộ máy, thì bạn đã đúng, điều đó thực sự sẽ cho phép triển khai riêng. Nhưng microservice cho phép bạn bỏ ngay cả những giả định đó, nếu bạn muốn đi xa đến mức đó với việc tách rời. Nó hoàn toàn hợp lý phải không.
Ixrec

CORBA là (là) một công nghệ phân tán cho phép các kiến ​​trúc phân tán tại một thời điểm (cuối năm 1990) khi chưa có tên rộng rãi để định nghĩa chúng. Bạn có thể tự do triển khai các hệ thống dựa trên CORBA hạt mịn hoặc hạt mịn kết thúc trong cái mà sau này sẽ được gọi là SOA hoặc microservice. CORBA đã không tồn tại, nhưng chúng tôi đang làm lại, chỉ với một công nghệ khác. Vấn đề, mặc dù, không phải là công nghệ. Vì vậy, có, chúng tôi sẽ đi vòng tròn đầy đủ. Tôi hy vọng chúng tôi đã học được điều gì đó trong quá trình này.
xtian

4

Làm thế nào tốt hơn là các dịch vụ này nằm rải rác trên các máy khác nhau?

Vì đám mây.

Xong cười chưa? Nghiêm túc mà nói - đối với nhiều doanh nghiệp, chi phí lớn nhất cho phần mềm không phải là phần mềm nữa. Đó là băng thông, phần cứng, chi phí CDN, v.v ... Bây giờ mọi người đều có thiết bị di động, có lưu lượng truy cập lớn hơn nhiều. Và điều đó sẽ chỉ trở nên tồi tệ hơn khi máy nướng bánh mì của bạn có kết nối internet của riêng nó.

Vì vậy, các doanh nghiệp đang tìm cách quản lý những chi phí đó. Cụ thể, họ đang cố gắng xử lý vấn đề kinh doanh "nếu sự cố này xảy ra, làm cách nào tôi có thể phục vụ hàng triệu người nhận / sử dụng phần mềm của mình - mà không phải trả trước cho máy chủ để phục vụ hàng triệu người nhận / sử dụng phần mềm của tôi ? ".

Tại sao tỷ lệ ngang rất phổ biến, hoặc ít nhất là mong muốn?

Bởi vì nó trả lời vấn đề kinh doanh (rất lớn và ngày càng tăng) này.

Khi bạn có một tá người dùng, bạn có thể ném tất cả các dịch vụ trên một hộp. Điều này là tốt, vì bạn chỉ muốn trả tiền cho một hộp. Và bạn cũng không muốn trả tiền cho các thay đổi đối với ứng dụng để phân chia các dịch vụ khác nhau khi quy mô kinh doanh của bạn. Ngày nay, bạn không có thời gian để làm điều đó trước khi đám đông khách hàng thắp sáng máy chủ của bạn bằng mọi cách.

Nó cũng tốt vì nó cho phép bạn sắp xếp phân bổ máy chủ để bạn có thể:

  1. sử dụng hầu hết các máy chủ bạn có, ít để "lãng phí".
  2. đo lường các yếu tố hiệu suất cá nhân của phần mềm của bạn.
  3. giảm thời gian triển khai / xuống do phát hành.

Việc triển khai rất chi tiết làm cho hai điều đó trở nên dễ dàng / tốt hơn (ngoài việc giúp thực thi sự phân tách mối quan tâm tốt hơn).


Ok, tôi có thể thấy lợi thế. Có một rào cản thấp để vào, nhưng nó có thể mở rộng. Tôi cho rằng những gì ném tôi cho một vòng lặp là khi bạn mở rộng theo chiều ngang của MS, có vẻ như ... rất ... retro? Một cái gì đó. Tôi không thể nói lý do tại sao nó có vẻ sai.
Thufir 13/03/2015

Mở rộng quy mô ứng dụng là một vấn đề không nhất thiết cần đến microservice: bạn có thể tăng sức mạnh của VM rất dễ dàng trên AWS (thậm chí theo yêu cầu) hoặc bạn có thể thêm nhiều VM phía sau bộ cân bằng tải trong kiến ​​trúc truyền thống.
xtian

@xtian - chắc chắn, nhưng bạn thường nhân rộng những thứ sai và do đó tiêu nhiều tiền hơn bạn cần. Ý tưởng đằng sau microservice là bạn chỉ cần chia tỷ lệ những gì bạn cần (cpu, bộ nhớ, đĩa, thông lượng, gpu)
Telastyn
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.