Microservices และ shared library


9

เรากำลังออกแบบระบบโดยใช้ไมโครไซต์อิสระ (เชื่อมต่อผ่านบัส RabbitMq) รหัสจะ (สำหรับส่วนประกอบแรกอย่างน้อย) เขียนเป็น python (ทั้ง python2 และ python3) เรามีแอปพลิเคชั่นก้อนเดียวที่ใช้ตรรกะทางธุรกิจบางอย่างซึ่งเราต้องการ refactor เป็น microservices และขยาย คำถามหนึ่งที่ทำให้ฉันกังวลก็คือ:

เป็นวิธีที่ดีที่สุดในการแบ่งปันรหัสระหว่างไมโครไซต์ต่างๆ เรามีฟังก์ชั่นผู้ช่วยทั่วไป (การประมวลผลข้อมูลการบันทึกการแยกวิเคราะห์การกำหนดค่า ฯลฯ ) ซึ่งจะต้องใช้โดยไมโครไซต์หลายรายการ

Microservices จะพัฒนาเป็นโครงการแยกต่างหาก (git repositories) ห้องสมุดทั่วไปสามารถพัฒนาเป็นโครงการที่มีในตัวเองได้เช่นกัน ฉันจะแชร์ไลบรารีเหล่านี้ระหว่างไมโครไซต์ได้อย่างไร

ฉันเห็นหลายวิธี:

  • คัดลอกเวอร์ชันของไลบรารีที่จำเป็นสำหรับแต่ละ microservice และอัพเดตตามต้องการ
  • ปล่อยไลบรารีทั่วไปไปยัง PyPi ภายในและแสดงรายการไลบรารีเหล่านั้นเป็นการอ้างอิงในข้อกำหนดของ microservice
  • รวมที่เก็บไลบรารีเป็น submodule git

ฉันต้องการอ่านเพิ่มเติมเกี่ยวกับแนวทางที่แนะนำวิธีปฏิบัติที่ดีที่สุดประสบการณ์ที่ผ่านมาก่อนที่จะตัดสินใจเลือกวิธีดำเนินการ คุณมีข้อเสนอแนะหรือลิงค์หรือไม่?


ฉันมีประสบการณ์ไม่เพียงพอที่จะตอบคำถามด้วยตัวเอง (บริษัท ของฉันเพิ่งเริ่มทำสิ่งที่คล้ายกัน) แต่นี่คือลิงค์ไปยังงานนำเสนอเกี่ยวกับสาเหตุที่สิ่งที่คุณอธิบายเป็นธงสีแดงและสามารถนำไปสู่ ​​"monolith กระจาย" . Microservices ไม่ควรมี shared library พวกเขาควรจะสื่อสารระหว่าง API ที่กำหนดไว้อย่างดีเท่านั้นเช่นSwagger (ปัจจุบันเรียกว่าOpen API )
Captain Man

@CaptainMan: แน่นอน แต่สมมติว่าคุณมีฟังก์ชั่นที่เรียบง่ายนี้: fib(n)(การใช้งานของชุดฟีโบนักชี) คุณไม่ต้องการที่จะทำซ้ำการใช้งานในแต่ละไมโครบริการ ที่เป็นของutilsห้องสมุด (รุ่นสำหรับคุณสมบัติและแก้ไขข้อบกพร่อง) นั่นไม่ใช่ monolith แบบกระจายนั่นเป็นเพียงเลเยอร์ของฟังก์ชันการทำงานทั่วไป คำถามของฉันคือวิธีจัดการเลเยอร์นี้ในระดับการติดตั้ง
blueFast

microservices ของเรามีไลบรารีที่ใช้ร่วมกันเพื่อให้แน่ใจว่าพวกเขาได้พูดคุยกับ microservices อื่น ๆ ทั้งหมดในระบบของเราในลักษณะเดียวกัน ฉันไม่แน่ใจว่าเป็นไปได้อย่างไรที่จะทำเช่นนั้นกับห้องสมุดที่ไม่แชร์ อย่างน้อยที่สุดทุกคนจะต้องใช้ libs XML / JSON / etc ในการจัดการ ฉันยังไม่ได้ดูงานนำเสนอนั้น แต่คุณมีความหมายเฉพาะของ "ห้องสมุดสาธารณะ" ในใจมากกว่าที่ฉันคิด
Ixrec

1
@ jeckyll2hide เราใช้ C ++ แต่โครงสร้างพื้นฐานของเราสำหรับเรื่องนี้เทียบเท่ากับสัญลักษณ์แสดงหัวข้อย่อยที่สองของคุณ: repo ที่แยกจากกันทุกคนประกาศการพึ่งพาของพวกเขาระบบสร้างมาตรฐานที่รู้วิธีหาการพึ่งพาเหล่านั้น ณ เวลาที่สร้างเป็นต้น
Ixrec

1
ฉันรู้สึกเหมือนเป็นคนโง่คำถามของคุณไม่ได้เกี่ยวกับไมโครแชร์เซอร์วิสไลบรารีโดยเฉพาะมันถามเกี่ยวกับวิธีแชร์ไลบรารีของทีมกับทีม ฉันรู้เพียงพอเกี่ยวกับการโพสต์คำตอบ
Captain Man

คำตอบ:


5

ทางเลือกที่สองของคุณคือหนทางที่แน่นอน แยกไลบรารีทั่วไปออกและติดตั้งลงในเซิร์ฟเวอร์ PyPi ในพื้นที่ของคุณ

ตัวเลือกที่ 1 น่ากลัวเพราะการปรับปรุงห้องสมุดจะเป็นการยากที่จะเผยแพร่ต่อผู้อื่นที่สามารถใช้งานได้

ตัวเลือก 3 คล้ายกับตัวเลือก 1

รูปแบบทั่วไปคือการติดตั้ง Jenkins เพื่อที่ว่าเมื่อคุณกดไปที่ master ของ repo Library มันจะสร้าง python และอัพโหลดมันไปยัง PyPi repo โดยอัตโนมัติ เมื่อคุณเขียนสคริปต์บิลด์นี้คุณจะไม่ต้องกังวลเกี่ยวกับไลบรารี่ของบรรจุภัณฑ์และทำการอัพโหลดด้วยตนเองไปยัง PyPi และด้วยตัวเลือกนี้การอัปเดตห้องสมุดทั้งหมดจะพร้อมใช้งานทันทีเพื่ออัพเกรดเป็นไมโครไซต์อื่น ๆ

การตั้งค่าเซิร์ฟเวอร์ PyPi ของคุณนั้นง่ายมาก ฉันชอบคำแนะนำนี้


1
ฉันยอมรับว่าตัวเลือกที่ 2 นั้นดีที่สุด แต่ตัวเลือกที่ 3 กับ submodules นั้นมีอะไรที่เหมือนกันมากกับตัวเลือกที่ 2 มากกว่าตัวเลือกที่ 1
8bittree

@ 8bittree: ใช่ตัวเลือก 3 คล้ายกับตัวเลือก 2 แต่การมีเซิร์ฟเวอร์ git (ระยะไกล "ส่วนกลาง") เป็นกลไกการกระจายแพคเกจ ในอีกด้านหนึ่งมันใช้คอมไพล์สำหรับบางสิ่งที่ไม่ได้กล่าวถึง (การจัดการการพึ่งพา) ในทางกลับกันก็ลดจำนวนส่วนประกอบ (ไม่จำเป็นต้องใช้ PyPi ส่วนตัว)
blueFast

2

ไม่ใช่ Python guy แต่เซิร์ฟเวอร์ PyPi นั้นเป็นตัวเลือกที่ดีที่สุด googling ที่รวดเร็วนั้นให้ภาพลักษณ์ที่คล้ายคลึงกับการมี Nexus repo สำหรับเหยือก Java ของทีม

จริงๆตราบใดที่มันถูกปรับใช้กับพื้นที่เก็บข้อมูลส่วนกลางบางส่วน (กับสำนักงาน / ทีม) ที่เครื่องมือการจัดการการพึ่งพาของคุณสามารถทำงานร่วมกับ (อ่านจากและปรับใช้) แล้วมันเป็นตัวเลือกที่ดี

ตัวเลือกที่ 1 เป็นสิ่งที่แย่ที่สุดคุณไม่ควรจัดการกับการพึ่งพาตนเอง มันเป็นความเจ็บปวด ในวิทยาลัยก่อนที่ฉันจะรู้เกี่ยวกับ Maven และเมื่อฉันคิดว่า Git นั้นซับซ้อนเกินไปเราก็ทำทุกอย่างด้วยตนเองตั้งแต่การรวมรหัสของทุกคนไปจนถึงการตั้งค่า classpaths เพื่อคว้าการพึ่งพา มันเป็นความเจ็บปวดฉันจะไม่ต้องการให้ใครผ่านไปได้แม้แต่เศษเสี้ยวของปัญหาอย่างจริงจังโดยเฉพาะในสภาพแวดล้อมการทำงานที่มีประสิทธิภาพเป็นสิ่งสำคัญ

ตัวเลือกที่ 3 อาจทำงานได้ดี แต่ไม่มีประโยชน์ใด ๆ เหนือ PyPi ท้องถิ่น (นอกเหนือจากการตั้งค่าได้ง่ายกว่า แต่ประโยชน์ของระบบการจัดการการพึ่งพาที่แท้จริงนั้นดีกว่ามาก)


1

ก่อนอื่นการแบ่งก้อนหินใหญ่เป็นไมโครไซต์จะเป็นเรื่องยากเสมอ ดูการจัดการข้อมูลแบบกระจายอำนาจ - ห่อหุ้มฐานข้อมูลลงในไมโครไซต์สำหรับแนวคิดว่าทำไม

ที่กล่าวว่ามีหลายสูตรสำหรับวิธีการที่จะค่อนข้างมีสุขภาพดี หนึ่งในนั้นคือhttp://12factor.net/ คุณจะต้องดูแลแต่ละไลบรารีและแอ็พพลิเคชันอย่างอิสระจากนั้นจัดการการอ้างอิงอย่างชัดเจน ถ้าคุณไปเส้นทางนั้นฉันจะแนะนำอย่างยิ่งว่าคุณมีคำสั่งง่าย ๆ ที่จะอัพเดทการอ้างอิงทั้งหมดของสิ่งที่เป็นปัจจุบันและคุณเรียกใช้มันเป็นประจำสำหรับแต่ละบริการไมโคร มันเป็นสิ่งสำคัญที่จะต้องมีกระบวนการปลดปล่อยอย่างมีสติที่คุณล็อคไลบรารีเวอร์ชันต่างๆไว้ในการผลิต แต่คุณจริงๆจริงๆ , จริงๆไม่ต้องการที่จะอยู่ในตำแหน่งที่ได้รับการอ้างอิงเก่าและคุณไม่ทราบว่าสิ่งที่ออกมี

นอกจากนี้ยังมุ่งเน้นที่การทำให้ไลบรารีการสำรองข้อมูลของคุณแน่นและมีสมาธิมากที่สุด จะมีการดึงตามธรรมชาติเสมอเพื่อเริ่มเพิ่มเนื้อหาในไลบรารีหลักเพื่อการแบ่งปันที่ง่าย ทำอย่างนั้นและคุณจะดึงบอลทั้งหมดของสปาเก็ตตี้ที่มีอยู่ลงในห้องสมุดสาธารณะและกลับไปสู่ความยุ่งเหยิงที่คุณมีอยู่ตอนนี้ ดังนั้นจึงเป็นการดีกว่าที่จะแก้ไขมากกว่าวิธีอื่น


0

คุณควรจะไร้เซิร์ฟเวอร์โดยชี้โดยตรงจากไฟล์การอ้างอิงแพ็คเกจ Python ไปยัง repos GitHub ส่วนตัวที่มีห้องสมุด ฉันเชื่อว่า Pipenv และ Poet สนับสนุนสิ่งนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.