Làm thế nào để chuyển sang microservice tạo ra một vấn đề thời gian chạy?


104

Bình luận viên sau đây viết :

Microservice chuyển rối loạn chức năng tổ chức của bạn từ một vấn đề thời gian biên dịch sang một vấn đề thời gian chạy.

Bình luận viên này mở rộng về vấn đề nói:

Tính năng không lỗi. Chạy vấn đề thời gian => vấn đề prod => phản hồi mạnh mẽ hơn, nhanh hơn về rối loạn chức năng cho những người có trách nhiệm

Bây giờ tôi hiểu điều đó với microservice bạn:

  • có khả năng tăng độ trễ thông qua giao dịch của bạn - vốn là mối quan tâm về sản xuất và thời gian chạy.
  • tăng số lượng giao diện mạng của mạng Cameron trong mã của bạn, nơi có thể có các lỗi phân tích thời gian chạy tiềm năng.
  • có khả năng có thể thực hiện triển khai màu xanh lam. Chúng có thể được giữ bởi các giao diện không khớp (xem giao diện mạng). Nhưng nếu việc triển khai màu xanh lam hoạt động thì đó là vấn đề đáng lo ngại hơn.

Câu hỏi của tôi là: Điều gì có nghĩa là việc chuyển sang microservice tạo ra một vấn đề thời gian chạy?


13
Nếu A nói chuyện với B một cách đơn giản thì ít nhất giao diện thực tế có thể được chứng minh là tương thích (thông qua việc gõ tĩnh) khiến cho nhiều khả năng nó cũng đúng. Thông thường các dịch vụ siêu nhỏ giao tiếp với nhau mà không cần kiểm tra thời gian biên dịch như vậy
Richard Tingle

Nếu bạn đang nghiên cứu các vấn đề liên quan đến việc sử dụng microservice, bài viết Fowler là phải đọc. martinfowler.com/articles/microservice.html Tôi tin rằng đó không chỉ là trường hợp biên dịch thời gian so với thời gian chạy như @Richard Tingle nói. Và không thực sự đồng ý rằng có một vấn đề sản xuất là tốt hơn một trong những phát triển. Nhưng microservice có thể giúp mở rộng các dự án lớn theo những cách khác. (Và là một sự quá mức cho hầu hết các dự án nhỏ)
Borjab

2
Nhà bình luận đó là thiển cận. Chạy vấn đề thời gian => vấn đề prod => người dùng không hài lòng => mất tiền.
Philipp

@Philipp: Đó là điểm. Tổng hợp các vấn đề về thời gian do rối loạn chức năng tổ chức => không ai quan tâm. Mất tiền do rối loạn chức năng tổ chức => làm tổn thương chính xác những người chịu trách nhiệm về rối loạn chức năng tổ chức nói trên. Hy vọng: rối loạn chức năng tổ chức được cố định nhanh hơn.
Jörg W Mittag

Câu trả lời:


194

Tôi có một vấn đề. Hãy sử dụng microservice! Bây giờ tôi có 13 vấn đề phân tán.

Chia hệ thống của bạn thành các thành phần được đóng gói, gắn kết và tách rời là một ý tưởng tốt. Nó cho phép bạn giải quyết các vấn đề khác nhau một cách riêng biệt. Nhưng bạn có thể làm điều đó hoàn toàn tốt trong việc triển khai nguyên khối (xem Fowler: microservice Premium ). Rốt cuộc, đây là những gì OOP đã dạy trong nhiều thập kỷ! Nếu bạn quyết định biến các thành phần của mình thành microservice, bạn sẽ không đạt được bất kỳ lợi thế kiến ​​trúc nào. Bạn có được sự linh hoạt về lựa chọn công nghệ và có thể (nhưng không nhất thiết!) Một số khả năng mở rộng. Nhưng bạn được đảm bảo một số vấn đề đau đầu xuất phát từ (a) bản chất phân tán của hệ thống và (b) giao tiếp giữa các thành phần. Chọn microservice có nghĩa là bạn có những vấn đề khác rất cấp bách đến mức bạn sẵn sàng sử dụng microservice mặc dù những vấn đề này.

Nếu bạn không thể thiết kế một khối nguyên khối được phân chia rõ ràng thành các thành phần, bạn cũng sẽ không thể thiết kế một hệ thống microservice. Trong một cơ sở mã nguyên khối, nỗi đau sẽ khá rõ ràng. Lý tưởng nhất là mã sẽ không biên dịch nếu nó bị hỏng khủng khiếp. Nhưng với microservice, mỗi dịch vụ có thể được phát triển riêng biệt, thậm chí có thể bằng các ngôn ngữ khác nhau. Bất kỳ vấn đề nào trong tương tác của các thành phần sẽ không trở nên rõ ràng cho đến khi bạn tích hợp các thành phần của mình và tại thời điểm đó, đã quá muộn để khắc phục kiến ​​trúc tổng thể.

Nguồn lỗi số 1 là giao diện không khớp. Có thể có những lỗi phát sáng như tham số bị thiếu hoặc các ví dụ tinh tế hơn như quên kiểm tra mã lỗi hoặc quên kiểm tra điều kiện tiên quyết trước khi gọi phương thức. Gõ tĩnh phát hiện các vấn đề như vậy càng sớm càng tốt: trong IDE của bạn và trong trình biên dịch, trước khi mã chạy. Các hệ thống động không có sự sang trọng này. Nó sẽ không nổ tung cho đến khi mã bị lỗi được thực thi.

Những tác động đối với microservice thật đáng sợ. Microservice vốn đã năng động. Trừ khi bạn chuyển sang ngôn ngữ mô tả dịch vụ chính thức, bạn không thể xác minh bất kỳ loại chính xác nào về việc sử dụng giao diện của bạn. bạn phải kiểm tra, kiểm tra, kiểm tra! Nhưng các thử nghiệm rất tốn kém và thường không đầy đủ, điều này cho thấy khả năng các vấn đề vẫn có thể tồn tại trong sản xuất. Khi nào thì vấn đề đó trở nên rõ ràng? Chỉ khi con đường bị lỗi đó được thực hiện, tại thời điểm chạy, trong sản xuất. Quan niệm rằng các vấn đề prod sẽ dẫn đến phản hồi nhanh hơn làvui nhộn sai lầm nguy hiểm, trừ khi bạn thích thú với khả năng mất dữ liệu.


13
@JacquesB Tôi tin tưởng rằng rối loạn chức năng tổ chức của cộng đồng đề cập đến việc không thể phát triển một hệ thống. Phần lớn câu trả lời của tôi là bối cảnh để minh họa cách người ta có thể đi đến kết luận như vậy, nhưng là ý kiến ​​chuyên môn của tôi và không được lấy từ tweet.
amon

10
"Đá nguyên khối được phân chia thành các thành phần" - điều đó có nghĩa là gì?

10
Và không nói về phiên bản của giao diện (giao diện thay đổi theo thời gian).
Peter Mortensen

12
@mobileink Monolith không phải là một thuật ngữ lý tưởng ở đây vì nó gợi ý rằng không có kiến ​​trúc nào. Nhưng những gì tôi đang cố gắng truyền tải là một hệ thống được phát triển và triển khai thành một hệ thống duy nhất, trái ngược với kiến ​​trúc hướng dịch vụ nơi các bộ phận của hệ thống có thể được triển khai độc lập. Vui lòng chỉnh sửa bài đăng nếu bạn biết một thuật ngữ tốt hơn
amon

7
@amon Nghe từ Monolith không ngay lập tức gợi lên ý tưởng "không có kiến ​​trúc". Hầu hết các tòa nhà đều là Monolith, cũng như Kim tự tháp vĩ đại của Ai Cập, và nhiều vật phẩm khác. Rõ ràng họ đã được kiến ​​trúc, và giao toàn bộ. Nhiều hệ thống phần mềm thiếu kiến ​​trúc tốt; nhưng việc thiếu kiến ​​trúc tốt dường như không phụ thuộc vào cách chúng được triển khai. Bạn có thể mượn một số giàn giáo của một dự án khác và gọi nó là kiến ​​trúc (3 tầng, 2 tầng, n tầng, microservice, v.v.) nhưng làm như vậy không đảm bảo bạn đã làm tốt.
Edwin Buck

215

Dòng tweet đầu tiên là của tôi, vì vậy tôi sẽ mở rộng về nó:

Giả sử bạn có 100 nhà phát triển, làm việc trên một ứng dụng nguyên khối. Đó là quá nhiều người để giao tiếp hiệu quả với nhau, vì vậy công ty phải nỗ lực để phân chia họ thành các nhóm nhỏ hơn và tạo ra các mô hình giao tiếp tốt giữa họ. Khi tổ chức "không hoạt động", các nhóm có thể không nói chuyện với nhau, họ không liên kết với mục tiêu lớn hơn, họ không đồng ý với các ưu tiên, v.v. - kết quả là, họ phải mãi mãi gửi một thứ gì đó. Đó là một "vấn đề thời gian biên dịch" theo nghĩa là rối loạn chức năng là hiển nhiên trước khi phần mềm được sản xuất. Dự án có thể là một cuộc diễu hành tử thần hoặc sẽ không bao giờ xuất xưởng ("biên dịch").

Tôi nghĩ rằng nhiều người bị thu hút bởi các dịch vụ vi mô và đang chuyển sang chúng, không phải vì lợi ích kỹ thuật / kiến ​​trúc vốn có, mà vì nó cho phép họ bỏ qua các rối loạn chức năng tổ chức. Thay vì cố gắng sắp xếp 100 nhà phát triển, họ hy vọng rằng họ có thể có các nhóm nhỏ làm việc trong các silo, mỗi nhóm tập trung vào dịch vụ vi mô nhỏ của riêng họ. Nếu bạn ở trong một tổ chức rối loạn như vậy, điều này thật hấp dẫn: nó cho phép bạn nhiều quyền hơn để tránh những người bạn không thích, không giao tiếp.

Thật không may, nó trở thành một "vấn đề thời gian chạy" bởi vì một khi phần mềm đang chạy trong sản xuất, giao tiếp tốt cũng trở nên quan trọng. Các vấn đề với tổ chức - các nhóm và cách chúng được liên kết và giao tiếp - biểu hiện tại "thời gian chạy".

Quan điểm của tweet của tôi là: nếu những gì bạn có là vấn đề của mọi người , một kiến ​​trúc mới sẽ không giúp ích gì. Nó sẽ chỉ trì hoãn những ảnh hưởng của vấn đề. Tôi nghĩ rằng sự hấp dẫn của các dịch vụ vi mô đối với nhiều người là hy vọng rằng nó sẽ giải quyết một cách kỳ diệu những vấn đề của những người này.


67
+1. Đây là một câu trả lời Stack Exchange tốt hơn nhiều so với một tweet. :-)
ruakh

3
Điều này cũng đúng với bất kỳ hệ thống động nào, thực sự. Gõ động rất hữu ích, nhưng chỉ khi bạn có đúng người. "Cơ sở dữ liệu dạng tự do" rất hữu ích, nhưng chỉ khi bạn có đúng người. Nếu bạn không có đúng người, bạn chỉ cần giải quyết vấn đề chứ không giải quyết chúng.
Luaan

2
Tôi nghĩ rằng đây là một tautology. Khi mọi người là vấn đề, các vấn đề có thể biểu hiện ở khắp mọi nơi. Tôi không thể tưởng tượng việc vận chuyển một giải pháp chạy như một bộ microservice với các bài kiểm tra tích hợp thích hợp. Không có cách nào để vận chuyển một giải pháp với một luồng làm việc được hỗ trợ trong trường hợp đó. Nếu bất cứ ai chuyển sang microservice với kiểm tra dòng chảy, đặc biệt là để che giấu các vấn đề, họ là vấn đề. Cũng có thể gửi nhị phân chưa được kiểm tra / bị hỏng. Nó nâng vấn đề từ các lập trình viên cấp trooper lên cao hơn, nơi nó thuộc về.
luk32

10
@ luk32 Một phần, vâng, nhưng ý chính của microservice khiến nó trở nên hấp dẫn đối với các đội xấu là bạn làm cho kỹ năng và thâm hụt giao tiếp của bạn không được chú ý trong một khoảng thời gian dài hơn. Đó không phải là vấn đề có vấn đề hay không, là khi chúng sẽ xuất hiện
T. Sar

18
Câu trả lời rất hay. Cảm ơn vì đã xác nhận ý kiến ​​của tôi về Twitter là hoàn toàn vô dụng đối với bất cứ điều gì ngoại trừ khuấy động mọi người.
Robert Harvey

43

Câu hỏi của tôi là: Điều gì có nghĩa là việc chuyển sang microservice tạo ra một vấn đề thời gian chạy?

Đó không phải là những gì các tweet đang nói! Họ không nói gì về việc chuyển sang microservice , họ cũng không nói gì về việc tạo ra vấn đề. Họ chỉ nói điều gì đó về vấn đề thay đổi .

họ đặt ra một hạn chế theo ngữ cảnh đối với các xác nhận của họ, cụ thể là tổ chức của bạn không hoạt động.

Vì vậy, những gì tweet đầu tiên về cơ bản là hai điều:

  • "nếu bây giờ tổ chức của bạn không có khả năng thiết kế các hệ thống phức tạp mà không có microservice, thì nó sẽ không thể thiết kế được các hệ thống phức tạp với microservice" và
  • "các vấn đề gây ra bởi sự bất lực đó xuất hiện trong thời gian biên dịch, tức là trong quá trình phát triển sẽ xuất hiện trong thời gian chạy, tức là trong sản xuất" (về mặt kỹ thuật, chúng cũng có thể xuất hiện trong quá trình thử nghiệm, nhưng hãy nhớ rằng, trích dẫn tự giới hạn cho các tổ chức rối loạn chức năng, có khả năng có chế độ kiểm tra dưới tiêu chuẩn)

Dòng tweet thứ hai nói rằng thực tế là các vấn đề chỉ thể hiện ở sản xuất, tức là nơi khách hàng nhìn thấy chúng, là một tính năng, không phải là lỗi, bởi vì khi khách hàng phàn nàn, điều đó có xu hướng được nghe thấy ở những nơi khác nhau so với khi bản dựng bị phá vỡ, cụ thể là ở những nơi có thể làm gì đó về rối loạn chức năng tổ chức (ví dụ như quản lý cấp cao). Vì rối loạn chức năng tổ chức thường là sự thất bại của quản lý cấp cao, điều này có nghĩa là khách hàng không hài lòng phản ánh không tốt đến những người chịu trách nhiệm chính cho sự không hài lòng đó, trong khi chất lượng mã thấp do lỗi quản lý cấp cao hơn thường chỉ phản ánh không tốt đối với các nhà phát triển, những người tuy nhiên, không có lỗi và không thể làm gì đó với nó.

Vì vậy, tweet đầu tiên nói rằng microservice di chuyển các vấn đề gây ra bởi quản lý tồi từ thời gian biên dịch, nơi chỉ các nhà phát triển nhìn thấy chúng, đến thời gian chạy, nơi khách hàng nhìn thấy chúng. Dòng tweet thứ hai nói rằng đó là một điều tốt, bởi vì sau đó, các vấn đề làm tổn thương những người chịu trách nhiệm về chúng.


6
@Michael Nếu bạn không thể thấy họ ảnh hưởng đến chất lượng mã như thế nào, có thể xem xét tác động - nếu có - quản lý đối với bất kỳ phần nào của chất lượng sản phẩm mà doanh nghiệp của họ tạo ra.
wjl

30
@Michael: Mọi thứ cuối cùng là do quản lý cấp cao hơn. Là chất lượng mã thấp gây ra bởi thời hạn không thể? Ai đặt ra những thời hạn? Ai bảo những người đặt ra những thời hạn đó để đặt những thời hạn đó? Là chất lượng mã thấp gây ra bởi các nhà phát triển không đủ năng lực? Ai đã thuê những nhà phát triển bất tài? Ai đã thuê những người thuê những nhà phát triển bất tài? Có phải là do dụng cụ không đầy đủ? Ai mua những công cụ đó? Ai phê duyệt ngân sách để mua những công cụ đó? Nó được gây ra bởi kiến ​​trúc ngu ngốc? Ai thuê kiến ​​trúc sư? Ai đưa anh ta phụ trách? Những tweet đó được đặc biệt trong bối cảnh
mai

13
Rối loạn chức năng tổ chức. Vâng, làm cho chức năng tổ chức là khá nhiều THE công việc của quản lý cấp cao hơn. Đó là những gì quản lý .
Jörg W Mittag

4
Mặc dù nó có thể sẽ hoạt động lâu dài, nhưng ý tưởng giải quyết các vấn đề của công ty bạn bằng cách khiến chúng tác động đến khách hàng dường như không đúng.
Stijn de Witt

1
@ JörgWMittag Tôi không nghĩ hợp lý khi cho rằng mã xấu được viết bởi các nhà phát triển xấu là lỗi của những người đã thuê những nhà phát triển xấu đó chứ không phải chính các nhà phát triển xấu. Cuối cùng nó có thể là trách nhiệm của quản lý, nhưng nó được gây ra bởi các nhà phát triển.
Miles Rout

9

Nó tạo ra một vấn đề thời gian chạy trái ngược với vấn đề thời gian biên dịch .

Một ứng dụng nguyên khối rất khó và tốn kém để biên dịch. Nhưng một khi nó biên dịch, bạn có thể chắc chắn một cách hợp lý rằng không có sự không tương thích cực kỳ ngu ngốc giữa các thành phần tồn tại, bởi vì hệ thống loại có thể bắt chúng. Lỗi tương tự trong một hệ thống kính hiển vi có thể không hiển thị cho đến khi hai thành phần cụ thể thực sự tương tác theo một cách cụ thể.


9
Điều này dường như cho rằng các ứng dụng "nguyên khối" luôn được gõ tĩnh. Những gì về ngôn ngữ gõ động? Và những gì về giao diện dịch vụ gõ tĩnh?
JacquesB

1
@JacquesB OTOH, tôi có thể nghĩ chính xác bằng không các ngôn ngữ được biên dịch được gõ động.
miễn phí

2
@JacquesB JavaScript và Python không được biên dịch. Trừ khi bạn tính các cấu trúc trình thông dịch nội bộ làm mục tiêu biên dịch, trong trường hợp đó, mọi ngôn ngữ đều được biên dịch.
Immibis

3
@immibis: mỗi triển khai ECMAScript hiện tạiít nhất một trình biên dịch. V8, ví dụ, có hai trình biên dịch và trình thông dịch chính xác bằng 0, nó không bao giờ phiên dịch, nó luôn biên dịch thành mã máy nhị phân. SpiderMonkey có bốn trình biên dịch, tôi tin và một trình thông dịch, nhưng trình thông dịch đó không diễn giải ECMAScript. SpiderMonkey không bao giờ diễn giải ECMAScript, nó luôn biên dịch nó thành mã byte của SpiderMonkey trước, sau đó nó có thể biên dịch thành mã máy nhị phân. Tất cả các triển khai Python, Ruby và PHP hiện có đều có trình biên dịch.
Jörg W Găngag

12
@LieRyan Bạn thực sự bối rối nếu bạn nghĩ suy luận kiểu giống như được gõ động và / hoặc Haskell được gõ động.
Derek Elkins

2

Cả trong các hệ thống nguyên khối và microservice bạn phải xác định giao diện giữa các hệ thống con. Các giao diện nên được thiết kế tốt, tài liệu tốt và ổn định nhất có thể. Điều này giống như trong OOP.

Nếu tổ chức của bạn không thể làm điều này, microservice cũng sẽ không giải quyết được vấn đề. Trong microservice bạn có giao diện Web công cộng. Vì vậy, bạn thậm chí phải dành nhiều nỗ lực hơn vào thiết kế giao diện.

Nếu giao diện không được thiết kế đúng, bạn sẽ gặp hai loại vấn đề về thời gian chạy:

  1. Nếu giao diện không được sử dụng đúng cách, bạn sẽ gặp lỗi khi chạy, không phải lúc biên dịch.
  2. Gọi một giao diện Web khá chậm, do đó bạn có thể gặp các vấn đề về hiệu suất.

Tôi nghĩ rằng việc tạo ra các vấn đề thời gian chạy không phải là vấn đề tổ chức truyền thông đúng đắn cho những người chịu trách nhiệm.

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.