BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース MSMQと.NET Core

MSMQと.NET Core

ブックマーク

原文(投稿日:2020/07/13)へのリンク

Microsoft Message Queuing (MSMQ) は現在、.NET Coreでは使用できない。一般的には他のメッセージキューシステムが好まれているが、エンタープライズアプリケーションの多くがMSMQをベースとしているため、.NET Frameworkから.NET Coreや次期バージョンである.NET 5への移行を考えているチームにとっては問題である。しかし先日のReference Sourceへのプルリクエストが、状況を変えてくれるかも知れない。

MSMQは1997年に開発され、Windows 95およびWindows NT 4.0以降、OSのオプションコンポーネントとして提供されてきた。(現在のWindowsのバージョンはWindows NTから派生している。) このような遍在性から、特にJavaのプロプライエタリなJMSテクノロジ以外に競合相手がほぼ存在しなかった初期においては、多くの企業が既定の選択肢としていた。

もっとも、JMSがプロプライエタリであると非難するのは、少々誤解を招く表現だ。Javaのみで利用可能であるとは言え、任意のオペレーティングで動作するからだ。対照的にMSMQは、COMに対応する任意のプログラミング言語で利用可能だが、動作するのはWindows上のみである。そして、Windows上で実行可能なプログラミング言語であっても、COMライブラリにアクセス可能であることが必要条件になる。

.NETプログラマにとって、MSMQを使用する選択肢は複数あった。最も難しいルートは、Win32またはCOMベースのライブラリを直接使う方法だ。この方法は、COM/.NETの互換性問題を表面化させる。C#でCOMを扱った経験のある者ならば分かることだが、参照カウント型のライブラリと.NETのマーク・アンド・スイープ型のGCを併用すると、メモリリークの回避が困難になるのだ。

より一般的な選択肢は、System.Messagingというライブラリを使用する方法だ。これは当初から、.NET Frameworkの一部であったが、.NET Coreには引き継がれていない。

最後の選択肢は、Windows Communication Foundation (WCF)を使うことだ。理屈の上では、これによって、それまでMSMQで送信していたメッセージを、コンフィギュレーション設定を変更するだけで、他のメッセージキューシステムにルート変更することが可能になる。しかし、非Microsoftテクノロジ用に必要なプラグインが広く普及していないため、WCFはこの約束を果たせていないのが実情だ。そして、WCFの.NET Coreバージョンは製品レベルに達していない上に、現在のロードマップにはMSMQが掲載されていない。

何が問題なのだろうか?"MSMQ is dead"と題した記事の中で、David Boike氏は、他のメッセージキューシステムへの変更を考える場合に考慮の必要な、MSMQの持つ2つの大きなアドバンテージについて述べている。

MSMQは、すべてのサーバがキューインフラストラクチャをホストする、分散型あるいは連合型のメッセージングシステムです。発信するメッセージは、最終的なアドレスに配信される前にローカルに送信されます。対照的に、他の大部分のメッセージングシステムは集中型あるいはブローカベースです。つまり、論理キューがひとつあるのみで、高可用性を提供するために通常はクラスタ内に配置されています。これによって競合コンシューマパターン(competing consumers pattern)を使用して、複数のエンドポイントインスタンスが同じキュー上のメッセージを競合することが可能になるため、スケールアウトが極めて容易なのです。

MSMQは分散トランザクションをサポートするという意味で、極めてユニークな存在です。つまり、キューを通じて行うSQL Serverのデータベース操作とメッセージング操作を、ひとつのアトミックなトランザクションに組み合わせて、すべてが成功かすべてが失敗のいずれかにすることが可能なのです。他の大部分のメッセージトランスポートは分散トランザクションをサポートしていませんが、NServuiceBusを使用しているのであれば、ローカルデータベーストランザクションをピギーバックすることで分散トランザクションの信頼性をシミュレートする、Outboxというコンポーネントがあります。詳細は私たちのブログ記事 "What does idempotent mean?"をご覧ください。

MicrosoftのKarel Ziklmund氏は先日、Reference SourceにSystem.Messagingのオリジナルの.NET Frameworkコードをポストした。このソースはMITライセンス下に置かれており、.NET Core実装に着手することが可能になっている。これが実現するとすれば、Core WCFのようなコミュニティ活動の形を取ることになるだろう。

Bill Loytty氏によれば、System.Messagingを.NET Core下で動作させることに成功したということだ。ただしこれはSystem.Messagingがオープンソースになる前の話であるため、その時点で成果を公開することはできなかった。

この記事に星をつける

おすすめ度
スタイル

BT