Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

การประมวลผลเบื้องหลังระดับปรมาจารย์ด้วย Sidekiq ใน Ruby on Rails

Sidekiq ช่วยให้นักพัฒนา Ruby สามารถรักษาเว็บแอปพลิเคชันที่รวดเร็วและตอบสนองโดยการย้ายงานที่ใช้เวลานานไปไว้เบื้องหลัง

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

ในโพสต์นี้ เราจะเน้นไปที่การใช้ Sidekiq อย่างมีประสิทธิภาพเพื่อจัดการและประมวลผลงานเบื้องหลัง

มาเริ่มกันเลย!

พื้นฐานของ Sidekiq

โดยพื้นฐานแล้ว Sidekiq เป็นเฟรมเวิร์กการประมวลผลพื้นหลังที่มีคุณสมบัติครบถ้วนสำหรับ Ruby ซึ่งช่วยให้คุณรันงานพื้นหลังได้ไปพร้อม ๆ กัน ซึ่งเป็นสิ่งสำคัญสำหรับเว็บแอปพลิเคชันที่ตอบสนองและเชื่อถือได้ ไม่ว่าจะส่งอีเมล ปรับขนาดรูปภาพ หรือประมวลผลไฟล์ CSV งานที่ใช้เวลานานก็สามารถทำได้เบื้องหลังโดยใช้ Sidekiq

สถาปัตยกรรมของ Sidekiq อาศัยการทำงานแบบมัลติเธรดและแนวคิดของ "ผู้ปฏิบัติงาน" เป็นอย่างมาก อย่างไรก็ตาม ใน Sidekiq 6.3.0 00 โมดูลเลิกใช้แล้วเพื่อสนับสนุน 16 เนื่องจากคำศัพท์คำว่า "ผู้ปฏิบัติงาน" อาจทำให้เกิดความสับสน:

คุณกำลังพูดถึงกระบวนการหรือไม่? ด้ายเหรอ? ประเภทของงาน? ฉันขอแนะนำให้นักพัฒนาหยุดใช้คำว่าผู้ปฏิบัติงาน

Redis ซึ่งเป็นฐานข้อมูลในหน่วยความจำที่รวดเร็วปานสายฟ้า มีบทบาทสำคัญในที่นี่ โดยทำหน้าที่เป็นระบบคิวที่เก็บงานเบื้องหลังเหล่านี้

หมายเหตุ: แม้ว่า Sidekiq จะใช้ Redis ในด้านพื้นที่เก็บข้อมูล แต่เราจะไม่ลงรายละเอียดการกำหนดค่าและการใช้งาน Redis ในบทความนี้

การติดตั้งและการตั้งค่า Sidekiq สำหรับ Rails

ในการเริ่มต้น คุณจะต้องเรียกใช้ Ruby เวอร์ชัน 2.5 ขึ้นไป และเซิร์ฟเวอร์ Redis เวอร์ชัน 4 ขึ้นไป

ตอนนี้คุณพร้อมที่จะติดตั้ง Sidekiq Ruby gem แล้ว

เริ่มต้นด้วยการเพิ่ม Sidekiq ลงใน Gemfile ของแอปพลิเคชันของคุณ:

 

ถัดไป ติดตั้งในไดเร็กทอรีของโปรเจ็กต์ของคุณ:

 

เมื่อติดตั้ง Sidekiq แล้ว คุณจะต้องกำหนดค่า ใน Railsapplication คุณกำหนดค่า Sidekiq เป็น 20 ของคุณ อะแดปเตอร์เปิด 37 และเพิ่มบรรทัดต่อไปนี้ภายในคำจำกัดความของ applicationclass:

 

คุณสามารถกำหนดค่า Sidekiq เพิ่มเติมได้ด้วยการสร้าง Sidekiq Initializer ให้ชี้ไปที่อินสแตนซ์ Redis เป็นต้น นี่เป็นสคริปต์พิเศษใน Rails ที่ทำงานเมื่อแอปพลิเคชันของคุณเริ่มทำงาน

ใน 48 ให้สร้างไฟล์ชื่อ 53 . ภายในไฟล์นี้ คุณสามารถระบุการกำหนดค่า Sidekiq ต่างๆ ได้ ตัวอย่างเช่น:

 

การกำหนดค่านี้จะบอก Sidekiq ให้เชื่อมต่อกับเซิร์ฟเวอร์ Redis ในเครื่อง แน่นอนว่าในสภาพแวดล้อมการใช้งานจริง คุณจะต้องแทนที่ URL ในเครื่องด้วย URL ของเซิร์ฟเวอร์ Redis จริงของคุณ (นี่คือตำแหน่งที่ยอดเยี่ยมสำหรับตัวแปรสภาพแวดล้อม)

แค่นั้นแหละ! เมื่อติดตั้งและกำหนดค่า Sidekiq แล้ว ตอนนี้คุณก็พร้อมที่จะเริ่มสร้างและประมวลผลงานในพื้นหลังของแอปพลิเคชัน Rails ของคุณแล้ว

การตั้งค่างาน Sidekiq

ต่อไปนี้เป็นวิธีการตั้งค่าและเริ่มต้นงาน Sidekiq ขั้นพื้นฐาน:

 

หากต้องการจัดคิวงานให้รันจริงๆ ให้โทรไปที่ 60 วิธีการในคลาสงานเช่นนี้:

 

บรรทัดนี้จะเพิ่มงานให้กับคิวดีฟอลต์ที่ดำเนินการทันทีที่งานพร้อมใช้งาน อาร์กิวเมนต์ 'some_name' และ 42 ถูกส่งผ่านไปยังวิธีดำเนินการ 70 เมื่อดำเนินการ

จากที่นี่ ไคลเอ็นต์ Sidekiq จะพุชงานเข้าไปในคิวใน Redis และเซิร์ฟเวอร์ Sidekiq จะดึงงานนั้นออกจากคิวเมื่อพร้อมที่จะประมวลผล

การสร้างงาน Sidekiq งานแรกของคุณ

ใน Sidekiq งานจะถูกแสดงตามคลาสงาน และงานที่ต้องดำเนินการจะถูกกำหนดไว้ใน 89 วิธีการ มาสร้างงาน Sidekiq พื้นฐานกันเถอะ:

 

ในข้อมูลโค้ดนี้ เราได้สร้างคลาส 92 . ต้องใช้สองอาร์กิวเมนต์:102 และ 116 . เมื่อดำเนินการ ระบบจะพิมพ์คำทักทายไปยังคอนโซลตามจำนวนครั้งที่ระบุ แน่นอนว่านี่เป็นตัวอย่างง่ายๆ ในแอปพลิเคชันในโลกแห่งความเป็นจริง 120 วิธีการสามารถมีโค้ดใด ๆ ที่คุณต้องการเรียกใช้ในพื้นหลังได้

ตอนนี้ดำเนินงานของคุณ เพียงโทรไปที่ 135 วิธีการในชั้นเรียนและส่งผ่านอาร์กิวเมนต์ใด ๆ ของคุณ 146 วิธีการที่คาดหวัง นี่คือวิธีที่เราสามารถกำหนดเวลา 155 เราเพิ่งสร้าง:

 

นี่จะจัดคิวงานพิมพ์ "Hello, Jeff!" ห้าครั้ง

หากคุณต้องการให้งานดำเนินการในช่วงเวลาใดเวลาหนึ่ง คุณสามารถใช้168 หรือ 178 วิธีการ ตัวอย่างเช่น:

 

ในตัวอย่างนี้ 'เมเรดิธ' จะได้รับคำทักทายของเธอสามครั้งในห้านาที ในขณะที่ 'เจฟฟ์' จะต้องรอสองวันจึงจะได้รับคำทักทายของเขาสองครั้ง

การใช้งาน Sidekiq ขั้นสูง

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

การลองงานใหม่โดยอัตโนมัติ

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

 

ในตัวอย่างนี้ หากงานล้มเหลว Sidekiq จะลองอีกครั้งสิบครั้งก่อนที่จะยอมแพ้

การจัดลำดับความสำคัญของงาน

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

 

ในตัวอย่างนี้ งานสำหรับ 195 จะถูกวางไว้ในคิววิกฤต เมื่อเริ่มต้นเซิร์ฟเวอร์ Sidekiq ของคุณ คุณสามารถระบุลำดับที่ควรประมวลผลคิวได้

นี่เป็นเพียงตัวอย่างเล็กๆ น้อยๆ ของการใช้ประโยชน์จากคุณสมบัติขั้นสูงของ Sidekiq เพื่อปรับแต่งการประมวลผลงานเบื้องหลังของคุณ ด้วย Sidekiq คุณมีเครื่องมือเพื่อให้แน่ใจว่างานของคุณจะได้รับการประมวลผลอย่างมีประสิทธิภาพ เชื่อถือได้ และในลักษณะที่เหมาะสมกับความต้องการของแอปพลิเคชันของคุณมากที่สุด

การตรวจสอบและปรับขนาดด้วย Sidekiq

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

หากต้องการใช้แดชบอร์ด Sidekiq ให้ติดตั้งในไฟล์เส้นทาง Rails ของคุณ ใน 205 เพิ่ม:

 

หลังจากเพิ่มบรรทัดเหล่านี้ คุณจะสามารถเข้าถึงแดชบอร์ดได้โดยไปที่ '/sidekiq' บนเซิร์ฟเวอร์ของคุณ

การตรวจสอบ Sidekiq ด้วย AppSignal

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

การประมวลผลเบื้องหลังระดับปรมาจารย์ด้วย Sidekiq ใน Ruby on Rails

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

การประมวลผลเบื้องหลังระดับปรมาจารย์ด้วย Sidekiq ใน Ruby on Rails

การรวม AppSignal เข้ากับ Sidekiqsetup กับ Rails เป็นเรื่องง่าย Ruby gem ของ AppSignal แทรกลงในมิดเดิลแวร์เซิร์ฟเวอร์ Sidekiq โดยไม่มีการกำหนดค่าเพิ่มเติมใดๆ นอกจากนี้ยังใช้ได้กับ ActiveJob!

คุณยังสามารถใช้ AppSignal สำหรับแอปพลิเคชัน Sidekiq ที่ไม่ได้ทำงานบน Rails โดยใช้การตั้งค่าที่กล่าวถึงในเอกสาร

กรณีการใช้งาน Sidekiq

กรณีการใช้งานที่พบบ่อยที่สุดสองกรณีสำหรับ Sidekiq คือการส่งอีเมลแบบอะซิงโครนัสและการสร้างรายงานตามกำหนดเวลา มาดูตัวอย่างเหล่านี้กันดีกว่า

อีเมล โดยเฉพาะอีเมลที่มีไฟล์แนบขนาดใหญ่หรือมีผู้รับจำนวนมาก อาจใช้เวลานานพอสมควรในการส่ง ด้วยการจัดการอีเมลที่ส่งงานพื้นหลัง ใบสมัครของคุณจะสามารถตอบสนองต่อคำขอของผู้ใช้ต่อไปได้ในขณะที่อีเมลกำลังประมวลผล

นี่คือตัวอย่างง่ายๆ ของงาน Sidekiq สำหรับการส่งอีเมลในแอปพลิเคชัน Rails:

 

ในตัวอย่างนี้ 217 ใช้ 229 class เพื่อส่งอีเมลรีเซ็ตรหัสผ่านไปยังผู้ใช้ หากต้องการจัดคิวอีเมลที่จะส่ง ให้โทรไปที่ 238 จากที่อื่นในใบสมัครของคุณ

อย่างไรก็ตาม ในแอปพลิเคชัน Rails ทั่วไป คุณไม่จำเป็นต้องสร้างงาน Sidekiq แยกต่างหากสำหรับการส่งอีเมล Rails จัดเตรียมเฟรมเวิร์ก Action Mailer ซึ่งใช้ในการส่งอีเมลและผสานรวมอย่างดีกับ Active Job สำหรับการประมวลผลในเบื้องหลัง

ต่อไปนี้คือตัวอย่างวิธีที่คุณอาจใช้ Active Job และ Action Mailer เพื่อส่งอีเมลรีเซ็ตรหัสผ่าน:

 

ในตัวอย่างนี้ เรียก 244 บนเมลจะจัดคิวอีเมลให้ส่งเป็นงานพื้นหลังโดยอัตโนมัติ เบื้องหลัง Active Job ใช้ Sidekiq เพื่อจัดการงานเหล่านี้

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

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

สรุป

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

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

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

ขอให้สนุกกับการเขียนโค้ด!

ปล. หากคุณต้องการอ่านโพสต์ Ruby Magic ทันทีที่เผยแพร่ สมัครรับจดหมายข่าว Ruby Magic ของเราและไม่พลาดแม้แต่โพสต์เดียว!