Dịch vụ vi mô và thư viện chia sẻ


9

Chúng tôi đang thiết kế một hệ thống dựa trên các dịch vụ siêu nhỏ độc lập (được kết nối qua xe buýt RabbitMq). Mã sẽ (ít nhất là cho các thành phần đầu tiên) được viết bằng python (cả python2 và python3). Chúng tôi đã có một ứng dụng nguyên khối triển khai một số logic nghiệp vụ mà chúng tôi muốn cấu trúc lại dưới dạng microservice và mở rộng. Một câu hỏi khiến tôi lo lắng là:

Cách tốt nhất để chia sẻ mã giữa các microservice khác nhau là gì. Chúng tôi có các chức năng trợ giúp chung (xử lý dữ liệu, ghi nhật ký, phân tích cấu hình, v.v.), phải được một số microservice sử dụng.

Các microservice sẽ được phát triển thành các dự án riêng biệt (kho git). Các thư viện chung có thể được phát triển như một dự án khép kín. Làm cách nào để chia sẻ các thư viện này giữa các dịch vụ?

Tôi thấy một số cách tiếp cận:

  • sao chép xung quanh phiên bản của thư viện cần thiết cho mỗi microservice và cập nhật khi cần
  • phát hành các thư viện chung cho PyPi nội bộ và liệt kê các thư viện đó dưới dạng phụ thuộc trong các yêu cầu của microservice
  • bao gồm kho thư viện như là một mô hình con git

Tôi muốn đọc thêm một chút về các phương pháp được đề xuất, thực tiễn tốt nhất, kinh nghiệm trong quá khứ trước khi quyết định cách tiến hành. Bạn có bất kỳ đề nghị hoặc liên kết?


Bản thân tôi không đủ thông thạo về microservice (công ty của tôi gần đây đã bắt đầu làm điều gì đó tương tự) để trả lời, nhưng đây là một liên kết đến một bài thuyết trình về lý do tại sao những gì bạn đang mô tả là một lá cờ đỏ và có thể dẫn đến một "khối nguyên khối phân tán" . Microservice không nên có thư viện chia sẻ yêu cầu. Họ thực sự chỉ nên giao tiếp giữa một api được xác định rõ như Swagger (bây giờ được gọi là API mở ).
Thuyền trưởng Man

@CaptainMan: Chắc chắn, nhưng giả sử bạn có chức năng đơn giản này: fib(n)(triển khai chuỗi trò chơi). Bạn không muốn lặp lại việc thực hiện đó trong mỗi microservice. Điều đó thuộc về một utilsthư viện (phiên bản, cho các tính năng và sửa lỗi). Đó không phải là nguyên khối phân tán, đó chỉ là một lớp chức năng phổ biến. Câu hỏi của tôi là làm thế nào để xử lý lớp này ở mức thực hiện?
dangonfast

Các dịch vụ siêu nhỏ của chúng tôi đã chia sẻ các thư viện để đảm bảo họ nói chuyện với tất cả các dịch vụ siêu nhỏ khác trong hệ thống của chúng tôi theo cùng một cách. Tôi không chắc làm thế nào có thể làm điều đó với các thư viện không chia sẻ; ở mức tối thiểu mọi người sẽ cần một số lib thao tác XML / JSON / etc. Tôi chưa xem bài thuyết trình đó, nhưng bạn có ý nghĩa cụ thể hơn về "thư viện chia sẻ" trong tâm trí so với cái tôi đang nghĩ đến không?
Ixrec

1
@ jeckyll2 leather Chúng tôi đang sử dụng C ++, nhưng cơ sở hạ tầng của chúng tôi tương đương với điểm đạn thứ hai của bạn: repo riêng biệt, mọi người đều tuyên bố sự phụ thuộc của họ, hệ thống xây dựng tiêu chuẩn biết cách tìm các phụ thuộc đó vào thời gian xây dựng, v.v.
Ixrec

1
Tôi cảm thấy như một hình nộm, câu hỏi của bạn không thực sự là về các thư viện chia sẻ microservice cụ thể, nó thực sự hỏi về cách chia sẻ thư viện của nhóm bạn với nhóm. Tôi biết đủ về điều đó để gửi một câu trả lời.
Thuyền trưởng Man

Câu trả lời:


5

Lựa chọn thứ hai của bạn chắc chắn là con đường để đi. Thoát ra khỏi các thư viện phổ biến và cài đặt chúng vào máy chủ PyPi cục bộ của bạn.

Tùy chọn 1 là khủng khiếp vì những cải tiến cho các thư viện sẽ khó truyền bá cho những người khác có thể sử dụng nó.

Tùy chọn 3 tương tự như tùy chọn 1.

Mô hình phổ biến là thiết lập Jenkins để khi bạn đẩy lên thành thạo repo thư viện, nó sẽ tạo một python và tự động tải nó lên repo PyPi. Khi bạn viết tập lệnh xây dựng này, bạn sẽ không bao giờ phải lo lắng về việc đóng gói các thư viện và tải chúng lên thủ công lên PyPi. Và với tùy chọn này, tất cả các cập nhật thư viện sẽ có sẵn ngay lập tức để có thể nâng cấp lên các dịch vụ siêu nhỏ khác.

Thiết lập máy chủ PyPi của riêng bạn rất dễ dàng. Tôi thích hướng dẫn này


1
Tôi đồng ý rằng tùy chọn 2 là tốt nhất, nhưng tùy chọn 3 với các mô hình con có nhiều điểm chung với tùy chọn 2 hơn tùy chọn 1.
8bittree

@ 8bittree: có, tùy chọn 3 tương tự như tùy chọn 2, nhưng có máy chủ git (từ xa "trung tâm") là cơ chế phân phối gói. Một mặt, nó đang sử dụng git cho một cái gì đó không liên quan đến (quản lý phụ thuộc), mặt khác, nó làm giảm số lượng các thành phần (không cần PyPi riêng tư)
dangonfast

2

Không phải là một người Python nhưng máy chủ PyPi có vẻ là lựa chọn tốt nhất. Một googling nhanh mang lại vẻ ngoài tương tự như có một repo Nexus cho các lọ Java của nhóm.

Thực sự miễn là nó được triển khai đến một loại kho lưu trữ trung tâm (cho văn phòng / nhóm) mà công cụ quản lý phụ thuộc của bạn có thể làm việc với (đọc từ và triển khai đến) thì đó là một lựa chọn tốt.

Tùy chọn 1 thực sự là tồi tệ nhất, bạn không bao giờ phải tự xử lý các phụ thuộc. Đó là một nỗi đau. Ở trường đại học trước khi tôi biết về Maven và khi tôi nghĩ Git quá phức tạp, chúng tôi đã làm mọi thứ bằng tay, từ việc hợp nhất mã của mọi người đến thiết lập đường dẫn lớp, đến lấy các phụ thuộc. Đó là một nỗi đau, tôi thực sự không muốn ai phải trải qua dù chỉ là một phần của rắc rối đó, đặc biệt là trong môi trường làm việc mà hiệu quả là quan trọng.

Tùy chọn 3 có thể sẽ hoạt động tốt, nhưng nó không có bất kỳ lợi ích thực sự nào đối với PyPi cục bộ (ngoài việc có thể dễ dàng hơn để thiết lập, nhưng lợi ích của hệ thống quản lý phụ thuộc thực sự tốt hơn rất nhiều).


1

Trước hết, việc tách một khối đá nguyên khối thành microservice luôn luôn khó khăn. Xem Quản lý dữ liệu phi tập trung - đóng gói cơ sở dữ liệu vào microservice để biết lý do tại sao.

Điều đó nói rằng, có một số công thức cho cách làm tương đối hoàn toàn. Một trong số đó là http://12factor.net/ . Điều đó sẽ nói rằng bạn nên duy trì độc lập từng thư viện và ứng dụng, sau đó quản lý các phụ thuộc một cách rõ ràng. Nếu bạn đi theo con đường đó thì tôi sẽ NGHIÊM TÚC rằng bạn có một lệnh đơn giản cập nhật tất cả các phụ thuộc vào bất cứ điều gì hiện tại và bạn chạy nó thường xuyên cho mỗi dịch vụ vi mô. Điều quan trọng là có một quy trình phát hành lành mạnh trong đó bạn khóa các phiên bản của thư viện trong sản xuất. Tuy nhiên, bạn thực sự, thực sự , thực sự không muốn ở trong một vị trí mà sự phụ thuộc trở nên cũ kỹ và bạn không biết những gì ở ngoài kia.

Cũng tập trung vào việc làm cho các thư viện sao lưu của bạn chặt chẽ và tập trung nhất có thể. Sẽ luôn có một lực kéo tự nhiên để bắt đầu thêm nội dung vào các thư viện cốt lõi để chia sẻ dễ dàng. Làm điều đó, và bạn sẽ nhanh chóng kéo toàn bộ quả mỳ spaghetti hiện có vào các thư viện dùng chung và quay lại với mớ hỗn độn mà bạn có bây giờ. Do đó, tốt hơn là sửa quá mức theo cách khác.


0

Bạn sẽ có thể truy cập serverless bằng cách trỏ trực tiếp từ tệp phụ thuộc gói Python vào kho lưu trữ GitHub riêng có chứa các thư viện. Pipenv và Poet đều ủng hộ điều này, tôi tin.

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.