REST หรือคิวข้อความในระบบที่ต่างกันหลายระดับ?


9

ฉันออกแบบ API REST สำหรับระบบสามชั้นเช่น: Client application-> ->Front-end API cloud serveruser's home API server (Home)

Homeเป็นอุปกรณ์บ้านและควรจะรักษาเชื่อมต่อFront-endผ่าน WebSocket หรือโพลล์ยาว(นี้เป็นสถานที่แรกที่เรากำลังละเมิด REST. จะได้รับก็แย่ภายหลัง) Front-endช่องสัญญาณส่วนใหญ่Clientร้องขอการHomeเชื่อมต่อและจัดการการโทรบางตัว บางครั้งส่งการแจ้งเตือนไปยังHomeClient

Front-endและHomeมี API เดียวกันโดยทั่วไป Clientอาจเชื่อมต่อHomeโดยตรงผ่าน LAN ในกรณีนี้Homeจำเป็นต้องลงทะเบียนClientการกระทำบางอย่างกับFront-endตัวเอง

ข้อดีสำหรับ REST ในระบบนี้คือ:

  • REST สามารถอ่านได้โดยมนุษย์
  • ส่วนที่เหลือมีการทำแผนที่กริยาที่กำหนดไว้อย่างดี (เช่น CRUD) คำนามและรหัสการตอบสนองกับวัตถุโปรโตคอล;
  • มันทำงานผ่าน HTTP และส่งผ่านผู้รับมอบฉันทะที่เป็นไปได้ทั้งหมด;

ส่วนที่เหลือ REST คือ:

  • เราไม่เพียง แต่ต้องการสไตล์การสื่อสารที่ตอบสนองการร้องขอเท่านั้น
  • รหัสข้อผิดพลาด HTTP อาจไม่เพียงพอสำหรับจัดการข้อผิดพลาดการสื่อสารสามระดับ Front-endอาจจะกลับ202 Acceptedไปโทร async บางเพียงเพื่อจะพบว่าสิ่งที่จำเป็นHomeการเชื่อมต่อถูกทำลายและมีควรจะได้รับ503;
  • HomeClientความต้องการที่จะส่งข้อความไปยัง Clientจะต้องสำรวจFront-endหรือเพื่อรักษาการเชื่อมต่อ

เรากำลังพิจารณาWAMP / Autobahnบน Websocket เพื่อรับฟังก์ชั่นการเผยแพร่ / สมัครสมาชิกเมื่อมันทำให้ฉันรู้สึกว่ามันดูเหมือนคิวข้อความอยู่แล้ว

มันคุ้มค่าหรือไม่ที่จะประเมินคิวการส่งข้อความว่าเป็นการขนส่งหรือไม่

ดูเหมือนว่า contras queue message คือ:

  • ฉันจะต้องกำหนดคำกริยา CRUD และรหัสข้อผิดพลาดด้วยตัวเองในระดับข้อความ
  • ฉันอ่านบางอย่างเกี่ยวกับ "ค่าบำรุงรักษาที่สูงขึ้น" แต่มันหมายความว่าอย่างไร

การพิจารณาเหล่านี้มีความสำคัญเพียงใด


1
ทำไมคุณมีเซิร์ฟเวอร์คลาวด์ในการผสม? ดูเหมือนว่าทุกอย่างจะเปลี่ยนเส้นทางซึ่งทำให้ฉันคิดว่ามันน่าจะมีชีวิตอยู่บนเครื่องเดียวกับเซิร์ฟเวอร์ที่บ้าน ...
Jimmy Hoffa

3
เมื่อคุณวิเคราะห์คิวข้อความโปรดทราบว่าพวกเขาส่วนใหญ่ได้รับการปรับให้เหมาะสมสำหรับ LAN ส่วนตัว: ความหน่วงแฝงต่ำไคลเอนต์ควบคุมเครือข่ายที่ได้รับการป้องกัน ฯลฯ การเปิดเผยคิวต่ออินเทอร์เน็ตอาจเป็นปัญหาด้านความปลอดภัยขนาดใหญ่
Javier

@Jimmy Hoffaจุดที่ถูกต้องขอบคุณ ถูกต้อง แต่ไม่สมบูรณ์ มันเป็นฐานข้อมูลทั่วไปที่เก็บข้อมูลและอื่น ๆ @Javierขอบคุณมันเป็นคำตอบที่ดี
Victor Sergienko

เซิร์ฟเวอร์ Home หมายถึงการทำงานที่บ้านของผู้ใช้และ front-end ในคลาวด์ บ้านเชื่อมต่อกับส่วนหน้าและไคลเอนต์ส่งข้อความไปที่บ้านผ่านทางส่วนหน้า ถ้าฉันเข้าใจการออกแบบของคุณอย่างถูกต้องฉันสามารถให้คำตอบกับพระเจ้า
Michael Brown

@Mike Brownอย่างแน่นอน กรุณาทำ
Victor Sergienko

คำตอบ:


5

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

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

หากคุณมีปัญหาการเชื่อมต่อผ่านอินเทอร์เน็ตด้วยพอร์ต 80 และ http เท่านั้นและ comms 'ทิศทางเดียว' ระบบสไตล์ REST น่าจะดีที่สุด ส่งและสำรวจหรือรับ websocket สำหรับข้อมูลการโทรกลับ แต่โดยทั่วไปแล้วสถาปนิกระบบของคุณจะเป็นลูกค้า / เซิร์ฟเวอร์ หากคุณมีความสามารถในการเชื่อมต่อระบบการส่งข้อความก็ยอดเยี่ยม

ฉันจะไปกับZeroMQสำหรับระบบส่งข้อความซึ่งสามารถกำหนดค่าได้มากพอที่จะบิดในทุกสถานการณ์รวมถึงคนที่ทนต่อความผิดพลาด ฉันไม่แน่ใจว่าใช้งานได้กับ httpแม้ว่า


ขอบคุณ สิ่งที่ฉันพบหลังจาก@Javierความคิดเห็น: ØMQดูเหมือนจะไม่สนับสนุนการเข้ารหัสตัวเอง atm: zeromq.org/area:faq#toc8แม้ว่า RabbitMQ จะทำ: rabbitmq.com/ssl.html
Victor Sergienko

ฉันไม่รู้ว่ามีการเชื่อมต่อหรือไม่ Homeเป็นอุปกรณ์หลักของผู้ใช้และClientเป็นสมาร์ทโฟนผ่าน Wi-Fi หรือ 3G ส่วนใหญ่ของคำถามคือความไม่รู้ของฉันเกี่ยวกับวิธีการสำรวจเส้นทาง NAT
Victor Sergienko

5

ดูเหมือนว่า Autobahn เหมาะสมกับสิ่งที่คุณพยายามทำอย่างมาก มีเครื่องมืออื่น ๆ เช่นกัน ลองใช้Windows Azure Service Bus (ซึ่งมีเฟรมเวิร์กไคลเอ็นต์สำหรับ Java, .NET, PHP, Python, NodeJS และ Ruby)

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

อัปเดตบัญชี 54321 ยอดคงเหลือ = ยอดคงเหลือ - 20.00 ปรับปรุงบัญชี 98765 ยอดคงเหลือ = ยอดคงเหลือ + 20.00

คุณอาจต้องการข้อความเดียวเช่น

โอน 20.00 จากบัญชี 54321 ไปยังบัญชี 98765

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


ขอบคุณมาก. อันที่จริงเราอาจเจริญเกินกว่า CRUD แม้ว่าจะไม่ช้าโดเมนของเราก็ค่อนข้างง่าย BTW หนังสือเล่มนี้ยังไม่ได้ตีพิมพ์พยายามหาของสะสมในบล็อกของเกร็ก ... ฉันคิดว่ามันดีฉันไม่ต้องใช้เทคโนโลยีของ Microsoft ในการทำเช่นนั้น
Victor Sergienko

รอหนังสือของเขายังไม่ออก ... เขาพูดถึงมันมานานแล้ว ... ฟังดูเหมือนนักเขียนด้านเทคนิคคนอื่นที่ฉันรู้จัก : ">
Michael Brown

1
สำหรับเร็กคอร์ดวิธี REST จะมีรีซอร์ส Transfer ที่คุณสร้าง หรือแม้แต่ TransferRequest ที่สามารถผ่านได้หรือไม่ REST มีเล่ห์เหลี่ยมในบางกรณี แต่นี่ไม่ใช่หนึ่งในนั้น
Jacek Gorgoń
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.