Những lưu ý quan trọng khi chuyển từ kiến ​​trúc nguyên khối sang kiến ​​trúc microservice trong .NET là gì? [đóng cửa]


8

Chúng tôi đang dự tính chia nhỏ những con quái vật nguyên khối thành kiến ​​trúc dựa trên microservice dần dần. Chúng tôi có 5 nhóm, mỗi nhóm chứa 2-3 nhà phát triển C #, ít nhất 1 nhà phát triển cơ sở dữ liệu và 2 kỹ sư QA. Bên cạnh sự thay đổi văn hóa và mô hình khổng lồ từ một kiến ​​trúc nguyên khối sang các dịch vụ siêu nhỏ, cũng có những thách thức kỹ thuật. Tôi muốn hỏi cộng đồng một số sự khôn ngoan và lời khuyên để chúng ta có thể tránh mắc phải những sai lầm tương tự.

Có bất kỳ ví dụ công nghiệp tốt nào mà microservice dựa trên .NET đã được sử dụng thành công trong một hệ thống sản xuất không? Chiến lược cho những điều sau đây là gì?

  • Org : bạn đã tổ chức các giải pháp / dự án .NET như thế nào?
  • Lập kế hoạch phát triển : về mặt lập kế hoạch phát triển, bạn đã chia nhỏ công việc giữa các nhóm như thế nào? Chiến lược tổng thể để đảm bảo tuân thủ hợp đồng giữa các dịch vụ siêu nhỏ đã được đàm phán giữa các nhóm là gì?
  • Cân bằng tải / định tuyến / cổng API : chiến lược cân bằng tải, dự phòng và nhân rộng là gì? Bạn vừa đi với một kiến ​​trúc async hoàn chỉnh và đã sử dụng một hàng đợi cho giao tiếp microservice hoặc bạn đã thực hiện ngang hàng thông qua một cổng cân bằng tải / API? Và tại sao?
  • Kiểm tra tự động hóa : làm thế nào bạn xử lý tự động kiểm tra. Điều này cùng với việc tích hợp liên tục dường như hoàn toàn cần thiết cho kiến ​​trúc microservice. bạn thây no thê nao?
  • Triển khai : bạn đang triển khai như thế nào? Một VM / microservice hoặc một container / microservice hoặc một cái gì đó hoàn toàn khác? Làm thế nào bạn xử lý thực tế là bây giờ bạn có hàng chục cơ sở dữ liệu nếu không xem xét thêm mỗi microservice sẽ có kho dữ liệu của nó, điều đó đã làm gì với cơ sở hạ tầng của bạn và DBA của bạn đã xử lý nó như thế nào?
  • Cơ sở hạ tầng : làm thế nào cơ sở hạ tầng của bạn mở rộng với kiến ​​trúc này. Là nó siêu trò chuyện và bạn phải tinh chỉnh nó hoặc mạng đã xử lý nó mà không có vấn đề? Được tự lưu trữ hoặc trong đám mây?
  • Giám sát : chiến lược giám sát của bạn là gì? Làm thế nào bạn giữ các tab trên hàng chục nếu không phải là hàng trăm microservice? Có phải chủ yếu thông qua đăng nhập và giám sát trung tâm?

3
Hầu hết các điểm đạn có thể làm cho một câu hỏi hợp lý - nhưng như một câu hỏi, đây là nhiều quá rộng.
Philip Kendall

1
Với 5 nhóm, mỗi nhóm chứa 2-3 nhà phát triển C #, tất cả đều làm việc trên cùng một sản phẩm, bạn sẽ gặp vấn đề lớn hơn nhiều so với các công cụ kỹ thuật đó. Bắt đầu với một nhóm và một phần trong ứng dụng và cố gắng tạo một dịch vụ siêu nhỏ của nó có thể được sử dụng cùng với ứng dụng còn lại. Sau đó, bạn có thể trả lời câu hỏi của bạn ở trên từ kinh nghiệm đó.
Doc Brown

Câu trả lời:


9

Tôi đã làm việc trên một số dự án microservice. Chắc chắn các công ty đã đi theo con đường này vì cách tiếp cận DB lớn của họ không thể mở rộng thêm nữa. Dưới đây là kinh nghiệm / suy nghĩ của tôi.

Org. Một giải pháp cho mỗi microservice. gói nuget cho libs chia sẻ

Phát triển. các đội lớn hơn 5-6 devs một khu vực chức năng tại một thời điểm. Tái cấu trúc thành một dịch vụ giao thoa. Thay thế dịch vụ trong bộ nhớ bằng máy khách cho microservice.

Kiểm tra. kiểm tra tích hợp sử dụng dữ liệu đầu vào / đầu ra thực tế. Bạn muốn có thể kích hoạt chúng chống lại bất kỳ trường hợp đang chạy nào để kiểm tra xem chúng có đúng hay không, các thể hiện cục bộ, các đặc tính kiểm tra / uat và trong các trường hợp bộ nhớ để kiểm tra đơn vị. Đảm bảo rằng bạn có thể kiểm tra phiên bản của phiên bản qua giao diện Healthcheck hoặc tương tự

Thu nhỏ. Hàng đợi dựa trên tốt nhất là có thể xử lý các quá trình phân tán nhiều tầng. Rabbit MQ, Zero MQ, MSMQ, v.v ... Nhưng các dịch vụ REST cân bằng tải rất tốt cho các cuộc gọi kiểu rpc và có thể là điểm khởi đầu dễ dàng.

Triển khai. Bạch tuộc. các dự án db, tự tạo no-sql.dbs như Mongo. Mặc dù tôi nghĩ rằng bạn đang đi sai tuyến nếu bạn có nhiều dbs. Thay vào đó, có những thông điệp nặng nề chứa dữ liệu bạn cần cho quá trình và một vài dbs lớn hơn để lưu trữ dữ liệu ẩn sau apis của chính họ.

Không có DBA! Nếu bạn có một DBA wrting sql bạn đang làm sai.

Cơ sở hạ tầng. Không vấn đề gì. Đọc từ một hàng đợi. Làm quá trình. Viết vào hàng đợi. Bạn có thể thoát khỏi nhiều hơn một phiên bản trên mỗi hộp ngay cả trên các phiên bản đám mây vi mô cho các dịch vụ nhỏ hoặc không thường xuyên được gọi

Giám sát. Giao diện kiểm tra sức khỏe cho tất cả các dịch vụ được gọi là reguarly bằng phần mềm giám sát và lên bảng lớn.

Tự động chuyển đổi và khôi phục là rất quan trọng, các trường hợp nên quay vòng khi cần thiết và không trạng thái, do đó, một sự cố không làm cho dịch vụ không hoạt động.

Vấn đề chính không phải là quá nhiều dịch vụ đi xuống vì bản chất của dịch vụ vi mô làm cho chúng mạnh mẽ về mặt này. Đó là cách bạn xử lý các tin nhắn không thể / chưa được xử lý.

Sử dụng logstash hoặc tương tự để theo dõi luồng thông báo và tìm ra vấn đề ở đâu và vấn đề là gì. Đảm bảo bạn có thể chạy lại các tin nhắn thất bại để một quy trình cố định có thể tiến hành ở nơi nó bị tắt.

Lưu ý cuối cùng. phiên bản mọi thứ, dlls, nugets, dữ liệu, giao diện. Với nhiều phiên bản của nhiều dịch vụ và thông điệp lịch sử trôi nổi xung quanh, đây có thể là nguyên nhân chính gây ra sự cố.


1
"Bạn có một DBA wrting sql bạn đang làm sai." : tại sao? Ý tôi là, bỏ qua những thứ Agile mà mọi người sẽ có thể làm mọi thứ, điều gì sẽ ngăn cản việc có một DBA chuyên dụng trong môi trường microservice so với không phải là dịch vụ siêu nhỏ?
Arseni Mourzenko

Hmm khó giải thích. Thông thường những gì tôi thấy là org với các dbs sql di sản khổng lồ chứa đầy các sprocs mà họ đang cố gắng để tránh xa. Họ đã ở trong trạng thái này vì cách tiếp cận tập trung vào DataBase và quan điểm của DBA rằng thực hiện nó trên DB là nhanh nhất. Điều này hoàn toàn ngược lại với những gì mà kiến ​​trúc microservice tôi đang cố gắng làm. Vì vậy, sự hiện diện của một DBA cho thấy họ chưa trốn thoát. Cách suy nghĩ cũ
Ewan

Điều đó thậm chí không gần với @Ewan thật. DBA của chúng tôi chắc chắn vì shit không muốn các quy tắc kinh doanh trong cơ sở dữ liệu của chúng tôi. Cô quan tâm nhiều hơn đến việc có thể di chuyển đến các máy chủ khác nhau và các phiên bản mới hơn là viết các truy vấn kinh doanh. Các DBA làm được nhiều hơn là viết SQL nếu họ giỏi về nó. Thái độ này của bạn về các DBA cho thấy rằng bạn chưa thoát khỏi lối suy nghĩ .
RubberDuck

2
@RubberDuck: bạn đang nói ở đây về phía quản trị viên hệ thống của một DBA. Mặt khác, Ewan đã nói cụ thể về các tác vụ viết SQL của DBA, trong khi tôi tưởng tượng các DBA là người sử dụng kiến ​​thức sâu rộng về cơ sở dữ liệu của họ để giúp các nhà phát triển tối ưu hóa các truy vấn của họ, nói chung về các rủi ro khác nhau và nói chung , làm cho cuộc sống của họ dễ dàng hơn khi đối mặt với các khía cạnh phức tạp của cơ sở dữ liệu.
Arseni Mourzenko

@RubberDuck vâng "mùi mã" của nó dựa trên thông tin hạn chế trong OP. bạn def muốn một DBA trong vai trò ops làm những việc khó khăn. tất nhiên trừ khi bạn chuyển sang một đám mây db
Ewan

1

Trong 2 năm qua, chúng tôi đang phân chia một khối nguyên khối thành microservice, vì vậy đây là một số điều chúng tôi đang làm

Tổ chức : mỗi dịch vụ sẽ là một giải pháp riêng, không có dự án chung với bất kỳ dịch vụ nào khác. Và chúng tôi đã kết thúc các hợp đồng là một giải pháp riêng biệt, trong đó mỗi phiên bản là một gói .nuget.

Phát triển : mỗi nhóm đang làm việc trên một phần của ứng dụng, với mỗi dịch vụ mới, chúng tôi bắt đầu tạo hợp đồng và sau đó tách dịch vụ, nhưng vẫn giữ nó là một phần của ứng dụng / giải pháp chính (vì vậy chưa có cuộc gọi HTTP nào). Và trong một bước tiếp theo, chúng tôi sẽ tách dịch vụ này ra khỏi nhau.

Định tuyến : Tất cả các dịch vụ của chúng tôi đều đứng sau bộ cân bằng tải và mỗi dịch vụ được triển khai trên một vài vms. Chúng tôi đang chia sẻ cùng một vm cho nhiều dịch vụ. Đi với một vm cho mỗi dịch vụ dường như là một sự lãng phí tài nguyên, bởi vì các dịch vụ rất nhỏ trong khi một vm Windows cần khoảng 2G để hoạt động tốt. Một số dịch vụ không liên quan đến tương tác của người dùng (như gửi email / thông báo) đang hoạt động với hàng đợi.

Kiểm tra : Ban đầu, chúng tôi nghĩ rằng đơn vị kiểm tra dịch vụ và kiểm tra tính tương thích hợp đồng giữa các phiên bản khác nhau của khách hàng và dịch vụ với Pact.Net là đủ. Nhưng chúng tôi đã gặp sự cố khi phiên bản mới của dịch vụ không được triển khai và chúng tôi đã làm việc với phiên bản trước. Tất cả các thử nghiệm đã qua, nhưng toàn bộ nền tảng đã không hoạt động tốt. Vì vậy, chúng tôi đã thêm một số thử nghiệm cấp cao (tích hợp) trên các luồng chính.

Triển khai : Tất cả nền tảng được cài đặt trên một vài vms, chúng tôi đang sử dụng kết hợp TFS để xây dựng, AWS S3 cho các tạo phẩm, Ansible để tạo, triển khai và cấu hình vm. Ansible đóng một vai trò lớn ở đây, nó không có tác dụng và sử dụng từ xa powershell để kết nối với các cửa sổ. Chúng tôi đã ngừng sử dụng biến đổi xml của web.config và chuyển sang các mẫu Ansible, vì vậy chúng tôi có thể có tất cả cấu hình trong các tệp Ansible. Và phần tốt là nó là nguồn mở và miễn phí, so với bạch tuộc. Các vms hoàn toàn mới được sử dụng cho các phiên bản mới, chúng tôi chỉ cập nhật các dịch vụ khi chúng tôi phải triển khai các bản sửa lỗi.

Chia tỷ lệ : Khi triển khai như vậy, bạn chỉ có thể chia tỷ lệ vms chứ không thể tự mở rộng dịch vụ. Vì vậy, hãy theo dõi hiệu suất của bạn (CPU, RAM), số lượng yêu cầu bạn nhận được hoặc thậm chí dựa trên thời gian (như vào cuối tuần có ít lưu lượng truy cập hơn) bạn bắt đầu và dừng vms mới

Giám sát : Chúng tôi đang ở trên AWS và chúng tôi có CloudWatch để thông báo theo chuỗi thời gian, nhưng chúng tôi đang lên kế hoạch đến Grafana và Prometheus (một bước gần hơn để đi đến docker, bây giờ với Server 2016). Khi đăng nhập, chúng tôi đang sử dụng Graylog (đang sử dụng ElastiSearch phía sau). Thật dễ dàng để áp dụng nó, bởi vì chúng ta đang đang sử dụng Log4Net với appenders tập tin trước và có một appender đặc biệt đối với Graylog. Bạn có thể xây dựng rất nhiều cảnh báo dựa trên nó, chúng tôi nhận ra rằng nó thực sự là một quá trình liên tụ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.