web-dev-qa-db-ja.com

警告システムのアーキテクチャ

さまざまなプログラムからのアラートメッセージを処理し、それらのアラートを電子メールでダウンコンシューマーに処理できるシステムを作成したいと考えています。これはすべて1つの内部ネットワークに含まれます。

基本的なアーキテクチャを次のようにしたいと思います: enter image description here

私の現在の主な関心事は「メッセージハンドラー」ビットです。これが私の「ソートAPI」になります。このシステムのすべてのコンポーネントが、データベースへのすべての書き込みを処理するAPIにデータを送信するようにします。このアプローチは、セキュリティを簡素化し、より複雑なDBクエリの多くを1つのプログラムに含めることができるため、より簡単だと思います。

問題は、これを言語にとらわれないようにしたいことです。つまり、どのコードでもメッセージをハンドラーに送信できなければなりません-ハンドラーがメッセージを解釈します。 JSONフラットファイルを介して、またはRESTプログラムへの呼び出し(ダウンストリームアプリケーションに柔軟性を与える)を介して)を実行したいと思います。

私の質問は

メッセージハンドラーを気にする必要がありますか?それとも、下流のアプリケーションと他の2つのコンポーネント(管理コンソールとアラートマネージャー)へのデータベースへの直接アクセスを許可するだけで簡単になりますか?

このようにして、DBテーブルへのINSERTが有効である限り、任意のアラートを挿入できます。

私は貿易でソフトウェアデザイナーではないので、失礼します。ただ、自由な時間にプロジェクトをやってもらいたいのです。

10
Christopher

AMQP(高度なメッセージキュープロトコル: https://www.rabbitmq.com/protocol.html )を調べましたか?

RabbitMQはこのようなものに最適なツールだと思います(他にも、MSMQ、Azure/AWSサービスなどがあります)。 1つの言語にとらわれないメッセージハンドラーを取得するだけでなく(単純な「jsonデータを使用してメッセージサーバーにメッセージを送信する」)、ダウンストリームメッセージ処理を切り離して、十分に分離します。必要なキューからの着信メッセージを処理するメッセージサービスを実行し、通知を吐き出します。

私がAMQPを使用するのが本当に好きな理由の1つは、あなたが今、いくつかの自家製のソリューションを使用しているように開始することですが、後で、タイプ、宛先などに応じてメッセージを少し異なる方法で処理する必要があることを理解してください。とにかく、基本的に、とにかく独自のAMQP実装を構築することになります。

5人の異なる受信者にメッセージを送信する必要がある場合はどうしますか?多数のプロセッサ全体でローテーションする必要があるメッセージがある場合はどうなりますか(長時間実行タスクとX個の同時プロセッサがあり、特定のタイプのメッセージをラウンドロビンできると考えてください)。メッセージが1人に送られるべきであるが、彼らがオンラインで利用できない場合は、別の人に送られるべきでしょうか? AMQPはこのすべてを(かなりうまく!)既に処理しており、非常に良い分類、キュー、チャネル、永続性の持続、あらゆる種類の機能を備えています。

これが処理できるシナリオの基本的な概要です(これはRabbitMQに固有のものではないことに注意してください:AMQPのことですが、RabbitMQはたまたまそれをうまく説明します)- https://www.rabbitmq.com/getstarted.html

4
jleach

非常によく組み立てられた質問!

つまり、すべてのアーキテクチャ上の決定にはトレードオフが伴います。トレードオフの説明に興味がある場合は、質問をその方向に編集してください。代わりに、質問はポジションを求めるだけなので、MessageHandlerを支持して議論する側にします。私はさらに一歩進んで、少なくともSQLデータベースではなく、データベースを含めないこと、少なくとも開始しないことを提案します。 MessageHandlerにJSONをファイルシステムに保存させ、(もちろんボリュームに応じて)受信した時間ごとのディレクトリアラートを指定し、アラートマネージャーからクエリが送信されたときに、最後の2つのディレクトリをトラバースするだけのAPIを用意します。配信するメールを決定するためのアラート(もちろん、優先度に応じて)。

この問題には多くの優れた点があり、データベースを初期段階でデータベースから除外すると、多くの付随的なノイズと不要な問題解決が削除されます。もちろん、おそらく、リレーショナルデータモデルを作成することへの隠された愛と、SQLを書く夢を持っているでしょう。その場合、この答えは完全に間違っています。しかし、一般的に言えば、最も機敏なデータベースでさえ、ひどいアプリケーションプラットフォームであり、耐久性とインデックス付きクエリの専門家であるため、システムに組み込まれるだけです。

幸運を!

3
Jonah Benton