สถาปัตยกรรมระบบแจ้งเตือน


10

ฉันต้องการสร้างระบบที่จัดการข้อความแจ้งเตือนจากโปรแกรมต่าง ๆ และสามารถประมวลผลการแจ้งเตือนเหล่านั้นไปยังผู้บริโภคที่ไม่ต้องการทางอีเมล ทั้งหมดนี้จะถูกเก็บไว้ในเครือข่ายภายในหนึ่งเครือข่าย

ฉันคิดว่าฉันต้องการสถาปัตยกรรมพื้นฐานที่มีลักษณะเช่นนี้:ป้อนคำอธิบายรูปภาพที่นี่

ข้อกังวลหลักที่ฉันมีอยู่ในปัจจุบันคือบิต "ตัวจัดการข้อความ" ซึ่งเป็นสิ่งที่จะเป็น "sort-of-API" ของฉัน ฉันต้องการส่วนประกอบทั้งหมดของระบบนี้เพื่อส่งข้อมูลไปยัง API ซึ่งจัดการการเขียนทั้งหมดไปยังฐานข้อมูล ฉันคิดว่าวิธีนี้ง่ายกว่าเพราะมันช่วยลดความปลอดภัยและช่วยให้ฉันมีการสืบค้น DB ที่ซับซ้อนมากขึ้นในโปรแกรมเดียว

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

คำถามของฉันคือ -

ฉันควรรบกวนตัวจัดการข้อความหรือไม่หรือจะเพิ่มความเรียบง่ายให้อนุญาตการเข้าถึงฐานข้อมูลโดยตรงไปยังแอพพลิเคชั่นดาวน์สตรีมรวมถึงส่วนประกอบอื่น ๆ สองตัว (Management Console และ Alert Manager)

ด้วยวิธีนี้พวกเขาสามารถแทรกการแจ้งเตือนใดก็ได้ที่พวกเขาต้องการ - ตราบใดที่ INSERT ในตาราง DB / s นั้นถูกต้อง

ฉันไม่ได้เป็นนักออกแบบซอฟต์แวร์โดยการค้าขอตัวฉัน - ฉันแค่ต้องการให้โครงการทำในเวลาว่าง

คำตอบ:


4

คุณเคยดู AMQP (โปรโตคอลการจัดคิวข้อความขั้นสูง: https://www.rabbitmq.com/protocol.html ) หรือไม่

RabbitMQ เป็นเครื่องมือที่ยอดเยี่ยมสำหรับสิ่งนี้ฉันคิดว่า (มีคนอื่นเช่น MSMQ, Azure / AWS, ฯลฯ ) ไม่เพียงคุณได้รับตัวจัดการข้อความที่ไม่เชื่อเรื่องภาษาเดียว (ง่าย ๆ "ส่งข้อความไปยังเซิร์ฟเวอร์ข้อความที่มีข้อมูล json") คุณแยกการประมวลผลข้อความแบบดาวน์สตรีมและทำให้โดดเดี่ยวได้ดี เรียกใช้บริการข้อความที่ประมวลผลข้อความขาเข้าจากคิวที่คุณต้องการและคายการแจ้งเตือนของคุณ

หนึ่งในเหตุผลที่ฉันชอบใช้ AMQP คือคุณเริ่มต้นเหมือนตอนนี้คุณมีวิธีแก้ปัญหาแบบโฮมเมด แต่เมื่อคุณต้องจัดการกับข้อความที่แตกต่างกันเล็กน้อยขึ้นอยู่กับประเภทที่ต้องการไป ฯลฯ ดังนั้นคุณจะต้องสร้าง AMQP ของคุณเอง

คุณจะทำอย่างไรถ้าข้อความต้องการผู้รับถึง 5 คน จะเกิดอะไรขึ้นถ้าคุณมีข้อความที่ควรหมุนไปตามตัวประมวลผลจำนวนหนึ่ง (คิดว่าใช้เวลานานในการทำงานและมีตัวประมวลผลพร้อมกันจำนวน X ซึ่งคุณสามารถปัดเศษข้อความประเภทที่เฉพาะเจาะจงได้) จะทำอย่างไรถ้าข้อความนั้นควรส่งถึงบุคคลหนึ่ง แต่หากไม่สามารถใช้งานได้ / ออนไลน์ข้อความนั้นควรส่งไปยังบุคคลอื่น AMQP จัดการทั้งหมดนี้ (ค่อนข้างดี!) เรียบร้อยแล้วด้วยการจัดหมวดหมู่ที่ดีมาก, คิว, ช่องทาง, การคงอยู่อย่างคงทน, คุณสมบัติทุกประเภท

นี่คือภาพรวมพื้นฐานของสถานการณ์ที่สามารถจัดการได้ (โปรดทราบว่านี่ไม่เฉพาะเจาะจงกับ RabbitMQ: เป็นสิ่ง AMQP แต่ RabbitMQ เกิดขึ้นเพื่ออธิบายได้ดี) - https://www.rabbitmq.com/getstarted.html


ฉันเคยเห็น RabbitMQ นำมาใช้กับซอฟต์แวร์อื่นมาก่อน - ดูน่าสนใจอยู่เสมอ (ถ้าไม่ซับซ้อนสักหน่อย) ฉันจะดูมัน! ฉันคิดว่าฉันควรหลีกเลี่ยงสิ่งนี้ในตอนแรกเพราะฉันต้องการความยืดหยุ่นอย่างมากในการนำเสนอผู้ส่งข้อมูล ดังนั้นหากเป็นการยากที่จะใช้การเรียกใช้ REST กับ Powershell หรือ Javascript ที่มีอยู่หรือสวรรค์ห้ามใช้แอป VB6 พวกเขามักจะสามารถส่งออกไปยังไฟล์แฟลตได้อย่างง่ายดาย แต่ความสามารถในการแทนที่การจัดการข้อความจำนวนมากจะช่วยประหยัดเวลาและความพยายามอย่างแน่นอน!
คริสโตเฟอร์

2
ฉันถูกข่มขู่เล็กน้อยเมื่อฉันเข้าสู่ RabbitMQ เป็นครั้งแรก แต่หลังจากการศึกษาในช่วงวันหยุดสุดสัปดาห์มันก็เหมือนว้าวนี่เป็นสิ่งที่ดีจริงๆและตอนนี้ฉันเข้าใจสิ่งที่ฉันกำลังดูมันง่ายจริงๆ
jleach

ฉันชอบความคิดของ AMQP แต่วิธีที่ RabbitMQ จัดการกับ API ของลูกค้าสำหรับการเรียงลำดับภาษาแต่ละภาษานั้นมีจุดประสงค์เพื่อใช้โปรโตคอลภาษาที่ไม่เชื่อเรื่องพระเจ้า จะเกิดอะไรขึ้นถ้าฉันมีลูกค้าที่ใช้ภาษาที่ไม่มี API ที่รองรับรองรับอยู่ คุณสมบัติเหล่านี้บางอย่างดีมาก ... แต่เกินจริงเมื่อฉันต้องทำคือได้รับ 1 ข้อความจากจุด A ถึงจุด B โดยไม่มีสิ่งใดมาขวางกั้น
Christopher

ฉันคิดว่าจะตบ API ที่เหลืออย่างรวดเร็วซึ่งจะครอบคลุมข้อกังวลของผู้ไม่เชื่อเรื่องพระเจ้าของคุณ แต่ตกลงว่าหากคุณไม่ต้องการฟีเจอร์ใด ๆ ที่ AMQP เสนอให้มันจะ overkill (ขอโทษถ้าฉันให้คุณใช้งานไวด์) การไล่ล่าห่านกับมัน ... )
jleach

ใช่ - REST API ที่รวดเร็วเพื่อให้ครอบคลุมมันจะใช้งานได้ .. แต่จากนั้นฉันก็อาจสร้าง REST API ของฉันเองก็ได้ และไม่ต้องขอโทษด้วย - มันเป็นเทคโนโลยีที่ยอดเยี่ยมและการเรียนรู้เป็นสิ่งจำเป็นสำหรับความก้าวหน้า :) ถ้าไม่ใช่ตอนนี้ - ฉันแน่ใจว่ามันจะมีประโยชน์ในอนาคต
Christopher

3

คำถามกรอบดีมาก!

ดังนั้นการตัดสินใจทางสถาปัตยกรรมทั้งหมดเกี่ยวข้องกับการแลกเปลี่ยน หากคุณอยากรู้เกี่ยวกับการแลกเปลี่ยนความคิดเห็นอาจแก้ไขคำถามของคุณในทิศทางนั้น แต่เนื่องจากคำถามเพิ่งถามถึงตำแหน่งฉันจะเข้าข้างเถียงแทน MessageHandler ฉันจะไปอีกขั้นหนึ่งเพื่อแนะนำไม่ให้มีฐานข้อมูล - อย่างน้อยไม่ใช่ฐานข้อมูล SQL อย่างน้อยก็ไม่ควรเริ่ม เพียงแค่ให้ MessageHandler บันทึก JSON ไว้ในระบบไฟล์พูดคำเตือนต่อไดเรกทอรีต่อชั่วโมงที่ได้รับ (ขึ้นอยู่กับปริมาณของหลักสูตร) ​​และมี API เมื่อสอบถามโดยตัวจัดการการแจ้งเตือนเพียงแค่สำรวจไดเรกทอรี 2 รายการสุดท้ายของ การแจ้งเตือนเพื่อตัดสินใจว่าจะส่งอีเมลใด (ขึ้นอยู่กับลำดับความสำคัญ)

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

โชคดี!


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

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