คิวข้อความกับบริการบนเว็บ? [ปิด]


258

ภายใต้เงื่อนไขใดที่ผู้ใช้จะชื่นชอบแอปที่พูดคุยผ่านคิวข้อความแทนที่จะใช้บริการบนเว็บ (ฉันแค่หมายถึง XML หรือ JSON หรือ YAML หรืออะไรก็ตามผ่าน HTTP ที่นี่ไม่ใช่ประเภทเฉพาะ)

ฉันต้องพูดคุยระหว่างสองแอพในเครือข่ายท้องถิ่น หนึ่งจะเป็นเว็บแอปและต้องขอคำสั่งในแอปอื่น การร้องขอคือสิ่งต่าง ๆ เช่นการสร้างผู้ใช้การย้ายไฟล์ไปรอบ ๆ และการสร้างไดเรกทอรี ภายใต้เงื่อนไขใดที่ฉันต้องการให้ XML Web Services (หรือตรง TCP หรือบางอย่าง) เพื่อใช้คิวข้อความ

เว็บแอพคือ Ruby on Rails แต่ฉันคิดว่าคำถามนั้นกว้างกว่านั้น

คำตอบ:


315

เมื่อคุณใช้บริการเว็บคุณมีไคลเอนต์และเซิร์ฟเวอร์:

  1. หากเซิร์ฟเวอร์ล้มเหลวลูกค้าจะต้องรับผิดชอบในการจัดการข้อผิดพลาด
  2. เมื่อเซิร์ฟเวอร์ทำงานอีกครั้งไคลเอนต์จะรับผิดชอบในการส่งต่ออีกครั้ง
  3. หากเซิร์ฟเวอร์ให้การตอบสนองต่อการโทรและลูกค้าล้มเหลวการดำเนินการจะหายไป
  4. คุณไม่มีความขัดแย้งนั่นคือถ้าลูกค้านับล้านรายเรียกบริการบนเว็บหนึ่งเซิร์ฟเวอร์ในหนึ่งวินาทีเซิร์ฟเวอร์ของคุณอาจล่ม
  5. คุณสามารถคาดหวังการตอบสนองจากเซิร์ฟเวอร์ได้ทันที แต่คุณสามารถจัดการการโทรแบบอะซิงโครนัสได้เช่นกัน

เมื่อคุณใช้คิวข้อความเช่น RabbitMQ, Beanstalkd, ActiveMQ, IBM MQ Series, Tuxedo คุณคาดหวังผลลัพธ์ที่แตกต่างกันและมีความผิดพลาดมากกว่า:

  1. หากเซิร์ฟเวอร์ล้มเหลวคิวจะยังคงมีข้อความ (เป็นทางเลือกแม้ว่าจะปิดเครื่อง)
  2. เมื่อเซิร์ฟเวอร์ทำงานอีกครั้งเซิร์ฟเวอร์จะได้รับข้อความรอดำเนินการ
  3. หากเซิร์ฟเวอร์ให้การตอบสนองต่อการโทรและลูกค้าล้มเหลวหากลูกค้าไม่ยอมรับการตอบกลับข้อความจะยังคงอยู่
  4. คุณมีข้อโต้แย้งคุณสามารถตัดสินใจได้ว่าเซิร์ฟเวอร์จะจัดการคำขอจำนวนเท่าใด (เรียกว่าคนงานแทน)
  5. คุณไม่คาดหวังการตอบสนองแบบซิงโครนัสทันที แต่คุณสามารถใช้ / จำลองการโทรแบบซิงโครนัส

Message Queues มีคุณสมบัติมากขึ้น แต่นี่เป็นกฎง่ายๆในการตัดสินใจว่าคุณต้องการจัดการกับเงื่อนไขข้อผิดพลาดด้วยตนเองหรือปล่อยให้อยู่ในคิวข้อความ


1
หากใช้การโยงSOAP / JMSหนึ่งจะได้รับการเชื่อมต่อแบบหลวมที่เว็บเซอร์วิส
koppor

สำหรับบริการ micro หลาย ๆ ตัวที่ฝั่งเซิร์ฟเวอร์ซึ่งควรเลือกใช้บริการบนเว็บหรือการเข้าคิว?
shivendra pratap singh

เรียน @sw ฉันอาจทราบได้ว่านั่นหมายความว่าเราสามารถวาง MQ ไว้หน้าเว็บไซต์ปกติได้หรือไม่ สมมติว่าฉันมีเว็บไซต์ Wordpress (LAMP stack) ฉันสามารถใช้ MQ infront ของ Apache เพื่อให้คำขอมา 1 ต่อ 1 แทนการมาทั้งหมดในเวลาเดียวกัน ในกรณีนี้ลูกค้า (เบราว์เซอร์) เชื่อมต่อกับ MQ แทนที่จะเป็น Apache ใช่ไหม? แต่แล้วเบราว์เซอร์จะเปิดการเชื่อมต่อ HTTP ค้างไว้และรอให้ Apache ตอบกลับต่อไปหรือไม่ โปรดช่วยฉันเข้าใจสิ่งนี้ ขอบคุณความมีน้ำใจของคุณ
夏期劇場

@ 夏期劇場กรณีการใช้งานของคุณคืออะไร? คุณพยายามทำอะไรเพื่อให้เกิดประโยชน์ต่อผู้ใช้ปลายทางโดยใช้เบราว์เซอร์
sw

สิ่งเหล่านี้ไม่เกี่ยวกับการตั้งค่าไคลเอนต์ / เซิร์ฟเวอร์ที่ยังคงเกี่ยวข้องระหว่างคิวและเซิร์ฟเวอร์และระหว่างไคลเอนต์และคิว ดูเหมือนว่ากระบวนทัศน์ไคลเอนต์ / เซิร์ฟเวอร์ยังคงมีอยู่และตอนนี้มีอยู่สองแห่ง
imagineerThat

75

มีงานวิจัยล่าสุดจำนวนพอสมควรเมื่อพิจารณาว่าการโทร REST HTTP สามารถแทนที่แนวคิดคิวข้อความได้อย่างไร

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

Ex:

POST /task/name
    - Returns a 202 accepted status immediately
    - Returns a resource url for the created task: /task/name/X
    - Returns a resource url for the started process: /process/Y

GET /process/Y
    - Returns status of ongoing process

งานสามารถมีหลายขั้นตอนในการเริ่มต้นและกระบวนการสามารถคืนสถานะเมื่อโพลหรือ POST ไปยัง URL ที่เรียกกลับเมื่อเสร็จสมบูรณ์

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

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

คุณได้สร้างในการค้นหาบริการแม้กระทั่งสำหรับงานที่มีหลายขั้นตอนโดยไม่มีโปรโตคอลที่ซับซ้อนเป็นพิเศษ

GET /task/name
    - returns form with required fields

POST (URL provided form's "action" attribute)

การค้นพบบริการของคุณเป็นรูปแบบ HTML ซึ่งเป็นรูปแบบที่เป็นสากลและมนุษย์สามารถอ่านได้

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

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

http://www.infoq.com/presentations/BPM-with-REST


11
@tempire แล้วความอดทนต่อความผิดนั้นเป็นอย่างไร? REST นั้นดี แต่ผู้พัฒนาได้สร้างมิดเดิลแวร์ของตัวเอง
Dan Rosenstark

10
@Yar คำถามส่วนใหญ่เกี่ยวกับ 'สิ่งนี้เกี่ยวกับเรื่องนี้' สามารถกล่าวอีกครั้งได้ 'มีวิธีจัดการกับเว็บอย่างไร' สามารถจัดการข้อผิดพลาดความผิดพลาดได้ผ่านโหลดบาลานซ์หรือแม้กระทั่งการจัดการเรคคอร์ด DNS มีปัญหาอีกสองสามข้อที่จะต้องแก้ไขเช่นความสามารถในการขยายแนวนอน - เว็บไม่ได้จัดการกับสิ่งนั้นอย่างดี (ยกตัวอย่างเช่นการโจมตี ddos)
tempire

8
@tempire ไม่มีการรับประกันการส่งบนเว็บใช่ไหม? ฉันกดปุ่มส่งและอธิษฐานว่าข้อความมาถึงปลายทางแล้ว ด้วย MQ ฉันรู้ว่าถ้าฉันไปถึง MQ ฉันก็เสร็จแล้ว มันจะจัดการรับข้อความไปยังปลายทาง
Dan Rosenstark

10
@Yar พิจารณาว่า 'การจัดส่งที่รับประกัน' หมายถึงอะไร มันเป็นเพียง 'รับประกัน' เป็น uptime ของคิวข้อความ แทนที่คิวข้อความด้วยเซิร์ฟเวอร์ REST ที่จัดการกับงานและกระบวนการเป็นทรัพยากรและคุณมี 'รับประกัน' เหมือนกับสิ่งอื่นใด โดยพื้นฐานแล้วคุณยังคงมีคิวข้อความ แต่ในรูปแบบที่สามารถเข้าถึงได้มาตรฐานเว็บที่สามารถตรวจสอบได้โดยใช้เครื่องมือเว็บใด ๆ
tempire

16
@Yar - ฉันไม่คิดว่าหลายคนเข้าใจว่าการกำหนดปัญหา MQ กำลังพยายามแก้ปัญหาให้เพียงพอที่จะพิจารณาสิ่งเหล่านั้น พวกเขาเข้าใจ MQ แต่มันแตกต่างจากการทำความเข้าใจพื้นที่ปัญหา แต่เป็นปัญหาที่แพร่หลายเพราะฉันคิดว่าโปรแกรมเมอร์และผู้จัดการส่วนใหญ่ในโลกได้รับการฝึกฝนให้เชื่อมโยงชิ้นส่วนแทนที่จะเป็นโซลูชันทางวิศวกรรม
tempire

32

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

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

โปรดทราบว่าคิวข้อความและบริการบนเว็บเป็นแนวคิดมุมฉากนั่นคือพวกเขาไม่ได้เป็นเอกสิทธิ์เฉพาะบุคคลร่วมกัน เช่นคุณสามารถใช้บริการบนเว็บ XML ซึ่งทำหน้าที่เป็นส่วนต่อประสานกับคิวข้อความ ฉันคิดว่าความแตกต่างที่คุณมองหาคือ Message Queues เทียบกับ Request / Response ซึ่งหลังคือเมื่อคำขอถูกประมวลผลพร้อมกัน


3
ใช่ฉันแค่คิดถึงสิ่งนี้: ไม่ใช่ว่าพวกเขากำลังปิดกั้นหรือไม่ปิดกั้น ไม่ว่าพวกเขาต้องการเวลาที่นานกว่าและ / หรือคาดเดาไม่ได้ในการดำเนินการ ... เนื่องจากพวกเขาเป็นผู้ตั้งฉากมันก็เป็นความจริงที่ว่าเว็บเซอร์วิสสามารถใช้ในการร้องขอนาน ๆ ได้ แต่ถ้าคุณมีคิวข้อความที่หรูหรามันอาจเป็นความคิดที่ดี
Dan Rosenstark

คำถามใหม่ของฉันคืออะไรถ้าต้องการให้กระบวนการซิงโครนัส แต่ไม่ตรงกันเมื่อหมดเวลา ถ้าอย่างนั้นเว็บเซอร์วิสก็น่าจะเหมาะสมกว่า
Dan Rosenstark

27

คิวข้อความแบบอะซิงโครนัสและสามารถลองซ้ำหลายครั้งหากการส่งล้มเหลว ใช้คิวข้อความหากผู้ร้องขอไม่จำเป็นต้องรอการตอบกลับ

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


1
ขอบคุณสำหรับสิ่งนั้นใช่ "รับประกันการจัดส่ง" ฉันจะต้องคิดว่าสำคัญหรือไม่ ฉันหมายถึงการซิงค์กับ async เป็นเรื่องของรสนิยมในบางแง่มุม ในขณะที่มีกรณีสีดำและสีขาวอย่างชัดเจน แต่ก็มีกลางสีเทาขนาดใหญ่
Dan Rosenstark

22

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


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