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


10

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

基本的なアーキテクチャを次のようにしたいと思います。ここに画像の説明を入力してください

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

懸念事項は、これを言語にとらわれないようにしたいことです。つまり、どのコードでもメッセージをハンドラに送信して、メッセージを解釈できるようにする必要があります。これは、JSONフラットファイルを介して、またはプログラムへのREST呼び出しを介して(下流のアプリケーションに柔軟性を与える)希望します。

私の質問は

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

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

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

回答:


4

AMQP(Advanced Message Queuing Protocol: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


RabbitMQが他のソフトウェア用に実装されたのを見たことはありますが、常に(少し複雑ではないにしても)興味深いように見えました。調べてみます!データ送信者を提供するために多くの柔軟性を望んでいたので、私は最初これから遠ざかったと思います。したがって、既存のPowershellまたはJavascriptにREST呼び出しを実装するのが難しい場合、またはVB6アプリを禁止する場合、それらは通常、非常に簡単にフラットファイルに出力できます。ただし、メッセージ処理の多くを置き換えるだけで、時間と労力を確実に節約できます。
クリストファー

2
RabbitMQに初めて入ったときは少し怖かったですが、週末の勉強の後はすごい
jleach

AMQPのアイデアは気に入っていますが、RabbitMQが各言語のクライアントAPIを処理する方法は、言語にとらわれないプロトコルを使用するという目的全体を打ち負かしています。サポートされているAPIが記述されていない言語を実行しているクライアントがある場合はどうなりますか?これらの機能のいくつかは本当に素晴らしいです...しかし、私がしなければならないすべてのことは、間に何もない状態で、ポイントAからポイントBに1つのメッセージを取得することです。
クリストファー

私はそれの上にクイックレストAPIを平手打ちすることを考えていましたが、それは不可知論的な懸念をカバーしますが、AMQPが提供する機能がまったく必要ない場合、それはやり過ぎになることを承知しています(ワイルドカードを実行した場合は謝罪します)ガチョウの追跡...)
jleach

ええ-それをカバーするための簡単なREST APIは機能します。そして、謝罪は必要ありません-それは素晴らしい技術であり、学ぶことは進歩するために不可欠です:)今ではないなら-私はそれが将来役立つと確信しています。
クリストファー

3

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

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

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

幸運を!


1
リレーショナルデータベースの使用に関して、メールグループ、メンバー、その他のさまざまな優れた点を制御できる機能が気に入っています。データベースの設計は、プロジェクトで最初に始めたものなので、削除することすら考えていませんでした。その入力と視点をありがとう!
クリストファー

私はそれを知っていました!:)あなたが何かから抜け出すために本当に探しているものを理解することが最も重要なことです。乾杯!
ジョナベントン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.