MSMQ移行判断の知識マップ(知識グラフ)
type: Dataset
description: MSMQはOS機能としては2026年7月時点でも非推奨になっていませんが、これを扱う標準ライブラリSystem.Messagingは.NET Frameworkにしか存在せず、.NET(Core以降)への公式な道はありません。CoreWCFによる移植やネイティブAPIのP/Invokeは延命手段止まりで、新規採用も推奨できません。移行判断の軸は「アプリを.NETへ上げるか」で、上げるならMSMQ+DTCが担っていた整合性を、業務データと同一のローカルトランザクションで確定できるDBのテーブルキューに置き換えるのが第一候補です。複数システム間の疎結合な連携が必要な場合に限り、RabbitMQやAzure Service Busを検討します。テーブルキューの実装ではREADPASTヒントとREAD_COMMITTED_SNAPSHOTデータベースオプションの組み合わせに注意が要ります。

MSMQ(Microsoft Message Queuing)
type: Concept
definition: Windowsに同梱されてきたメッセージキュー基盤。store-and-forward・トランザクション・OS同梱を特徴とし、2026年7月時点で公式の非推奨機能一覧には載っていない。
alternative label: MSMQ
uses: トランザクションキュー
uses: expressメッセージ
uses: ジャーナルキュー
uses: 配信不能(デッドレター)キュー
not recommended for: 新規プロジェクトでの新規採用

System.Messaging
type: Concept
definition: MSMQを扱う.NETの標準クラスライブラリ。対象バージョンは.NET Framework 1.1〜4.8.1のみで、.NET(Core以降)向けの版は存在しない。
alternative label: MessageQueueクラス
requires: .NET Framework
incompatible with: .NET(Core以降)

DTC(分散トランザクションコーディネーター)
type: Concept
definition: 複数のリソース(MSMQのキューとデータベースなど)にまたがるトランザクションを調停するWindowsのサービス。クラウド系のキューサービスは参加できない。
alternative label: MS DTC
alternative label: 分散トランザクション
incompatible with: RabbitMQ
incompatible with: Azure Service Bus

トランザクションキュー
type: Concept
definition: トランザクションメッセージだけを扱うMSMQのキュー。作成時に決まり、後から変更できない。

expressメッセージ
type: Concept
definition: MSMQの既定の送信モード。配送中も配送後もメモリ上に置かれ高速だが、MSMQサービスやマシンの再起動で失われる。

recoverable(回復可能)メッセージ
type: Concept
definition: 送信側と中継する各コンピューターでディスクに書かれ、宛先キューでもディスク上に保持されるMSMQの送信モード。再起動をまたいで残る。
prevents: 再起動時のメッセージ喪失

ジャーナルキュー
type: Concept
definition: 送信した・取り出したメッセージの控えを保持する、MSMQが自動生成するシステムキュー。放置すると容量を食うため塩漬け運用では監視対象になる。

配信不能(デッドレター)キュー
type: Concept
definition: 届けられなかったメッセージを保持する、MSMQが自動生成するシステムキュー。
alternative label: 配信不能キュー

プライベートキュー
type: Concept
definition: ディレクトリサービス(Active Directory)には発行せず、そのコンピューター上にだけ登録されるMSMQのキュー。中小規模の業務システムで使われているのはほとんどがこちら。対するパブリックキューはディレクトリサービスに登録される。
alternative label: パブリックキュー

再起動時のメッセージ喪失
type: Concept
definition: MSMQサービスやマシンの再起動によって、メモリ上にしか無いメッセージが失われること。

.NET Framework
type: Concept
definition: Windowsのコンポーネントとして扱われ、インストールされているOSのライフサイクルに沿ってサポートされるランタイム。System.Messagingの対象範囲。

.NET(Core以降)
type: Concept
definition: .NET Frameworkの後継となる、クロスプラットフォーム対応の.NETランタイム(.NET 5以降)。
alternative label: .NET Core
alternative label: モダンな.NET

MSMQのWin32ネイティブAPI
type: Concept
definition: MQSendMessage・MQReceiveMessageなど、MSMQをC/C++向けに操作する文書化されたWin32 API。.NETからP/Invokeで呼ぶことも可能だが、フォーマッターやトランザクション連携は自前で書く延命手段。
alternative label: MQSendMessage
alternative label: MQReceiveMessage
requires: MSMQ(Microsoft Message Queuing)

CoreWCF
type: Concept
definition: WCFのサーバー側を.NETに移植するコミュニティ主導プロジェクト。マイクロソフトが公式なサポートポリシーを提供する一方、MSMQ対応パッケージ(CoreWCF.MSMQ)はSystem.Messagingのコミュニティ移植に依存する。
uses: System.Messaging

DBのテーブルキュー
type: Concept
definition: データベースのテーブルをキューとして使う設計。メッセージの取り出しと業務データの更新を同一のローカルトランザクションで確定でき、MSMQ+DTCの整合性をより単純な仕組みで置き換えられる。
alternative label: テーブルキュー
succeeds: MSMQ(Microsoft Message Queuing)
recommended for: DTC(分散トランザクションコーディネーター)

RabbitMQ
type: Concept
definition: オンプレミスで運用できるメッセージブローカー。複数システム・複数言語間の疎結合な連携やファンアウト配信が得意な一方、自前運用の冗長化・更新の負荷を伴う。

Azure Service Bus
type: Concept
definition: クラウド上で運用できるメッセージブローカー。複数システム間の疎結合な連携に向くが、DTCには参加できない。

複数システム・複数言語間の疎結合な連携
type: Concept
definition: 配信のファンアウトやルーティングが必要な、複数システム・複数言語にまたがる非同期連携の要件。

BinaryFormatter
type: Concept
definition: セキュリティ上の理由から段階的に廃止された.NETのバイナリ直列化機構。.NET 9以降はランタイムから実装が削除され既定では使用できない。

Outboxパターン
type: Concept
definition: 送信側で業務データの更新とメッセージ行のINSERTを同一トランザクションに入れ、業務データは更新されたのにメッセージが出ていないという不整合を防ぐ設計。

READPASTテーブルヒント
type: Concept
definition: 他のトランザクションがロックしている行を読まずに飛ばすSQL Serverのテーブルヒント。複数ワーカーによるテーブルキューの並列な取り出しに使う。行ロックは飛ばせるがページロックは飛ばせない。
alternative label: READPAST

READ_COMMITTED_SNAPSHOTデータベースオプション
type: Concept
definition: 読み取りのブロッキング対策として行バージョニングを使うデータベースオプション。ONのときセッションの分離レベルがREAD COMMITTEDだと、READCOMMITTEDLOCKヒントの併記なしにREADPASTを指定できない。Azure SQL Databaseでは既定でON。
alternative label: RCSI

新規プロジェクトでの新規採用
type: Concept
definition: これから作るシステムで、ある技術(メッセージキューやUI自動化ツールなど)を新規に選定・採用すること。

subject: MSMQ(Microsoft Message Queuing)
predicate: uses
object: DTC(分散トランザクションコーディネーター)
description: MSMQはMS DTC(分散トランザクションコーディネーター)と組み合わせて、キューからの取り出しとデータベース更新を1つの分散トランザクションで確定できる
evidence: https://learn.microsoft.com/previous-versions/windows/desktop/msmq/ms711472(v=vs.85)
verified at: 2026-08-01
certainty: context-dependent

subject: MSMQ(Microsoft Message Queuing)
predicate: uses
object: トランザクションキュー
description: MSMQはトランザクションメッセージだけを扱うトランザクションキューを持てる
evidence: https://learn.microsoft.com/previous-versions/windows/desktop/msmq/ms705161(v=vs.85)
verified at: 2026-08-01
certainty: established

subject: MSMQ(Microsoft Message Queuing)
predicate: uses
object: expressメッセージ
description: MSMQの既定の送信モードはexpressメッセージ
evidence: https://learn.microsoft.com/previous-versions/windows/desktop/msmq/ms704130(v=vs.85)
verified at: 2026-08-01
certainty: established

subject: MSMQ(Microsoft Message Queuing)
predicate: uses
object: recoverable(回復可能)メッセージ
description: 送信側が明示的に指定すると、MSMQはメッセージをディスクに永続化するrecoverableモードで扱える
evidence: https://learn.microsoft.com/previous-versions/windows/desktop/msmq/ms704130(v=vs.85)
verified at: 2026-08-01
certainty: context-dependent

subject: MSMQ(Microsoft Message Queuing)
predicate: uses
object: ジャーナルキュー
description: MSMQは送受信の控えを保持するジャーナルキューを自動生成する
evidence: https://learn.microsoft.com/previous-versions/windows/desktop/msmq/ms705161(v=vs.85)
verified at: 2026-08-01
certainty: established

subject: MSMQ(Microsoft Message Queuing)
predicate: uses
object: 配信不能(デッドレター)キュー
description: MSMQは届けられなかったメッセージを保持する配信不能キューを自動生成する
evidence: https://learn.microsoft.com/previous-versions/windows/desktop/msmq/ms705161(v=vs.85)
verified at: 2026-08-01
certainty: established

subject: MSMQ(Microsoft Message Queuing)
predicate: uses
object: プライベートキュー
description: 中小規模の業務システムで使われているMSMQのキューは、ほとんどがディレクトリサービスに発行しないプライベートキュー
evidence: https://learn.microsoft.com/previous-versions/windows/desktop/msmq/ms705161(v=vs.85)
verified at: 2026-08-01
certainty: context-dependent

subject: expressメッセージ
predicate: mayCause
object: 再起動時のメッセージ喪失
description: expressメッセージはメモリ上に留まり得るため、MSMQサービスやマシンの再起動でメッセージが失われる
evidence: https://learn.microsoft.com/previous-versions/windows/desktop/msmq/ms704130(v=vs.85)
verified at: 2026-08-01
certainty: context-dependent

subject: recoverable(回復可能)メッセージ
predicate: prevents
object: 再起動時のメッセージ喪失
description: recoverableメッセージはディスクに書かれるため、再起動をまたいで残る
evidence: https://learn.microsoft.com/previous-versions/windows/desktop/msmq/ms704130(v=vs.85)
verified at: 2026-08-01
certainty: established

subject: System.Messaging
predicate: requires
object: .NET Framework
description: System.Messaging.MessageQueueクラスのリファレンスが対象とするのは.NET Framework 1.1から4.8.1まで
evidence: https://learn.microsoft.com/dotnet/api/system.messaging.messagequeue
verified at: 2026-08-01
certainty: established

subject: System.Messaging
predicate: incompatibleWith
object: .NET(Core以降)
description: .NET(Core以降)向けのSystem.Messaging版は存在せず、公式なマネージドAPIの道が閉じている
evidence: https://learn.microsoft.com/dotnet/api/system.messaging.messagequeue
verified at: 2026-08-01
certainty: established

subject: .NET(Core以降)
predicate: uses
object: MSMQのWin32ネイティブAPI
description: .NETからMSMQのWin32ネイティブAPIをP/Invokeで呼ぶことは技術的には可能だが、フォーマッターやトランザクション連携を自前で書いて保守する延命手段になる
evidence: https://learn.microsoft.com/previous-versions/windows/desktop/msmq/ms704996(v=vs.85)
verified at: 2026-08-01
certainty: context-dependent

subject: MSMQのWin32ネイティブAPI
predicate: requires
object: MSMQ(Microsoft Message Queuing)
description: MQSendMessageなどのネイティブAPIはMSMQ自体が有効化・インストールされていることを前提とする
evidence: https://learn.microsoft.com/previous-versions/windows/desktop/msmq/ms704996(v=vs.85)
verified at: 2026-08-01
certainty: established

subject: CoreWCF
predicate: uses
object: System.Messaging
description: CoreWCFのMSMQトランスポート(CoreWCF.MSMQ)の実装は.NET Framework版System.Messagingライブラリのコミュニティ移植に依存している
evidence: CoreWCF.MSMQ
verified at: 2026-08-01
certainty: established

subject: DBのテーブルキュー
predicate: succeeds
object: MSMQ(Microsoft Message Queuing)
description: 中小規模の業務システムでMSMQが担っていた非同期処理の移行先として、本記事はDBのテーブルキューを第一候補として位置付ける
evidence: hints-transact-sql-table
verified at: 2026-08-01
certainty: established

subject: トランザクションキュー
predicate: requires
object: DTC(分散トランザクションコーディネーター)
description: MSMQのトランザクションキューとDB更新をアトミックに扱うには、DTCによる分散トランザクションが必要だった
evidence: https://learn.microsoft.com/previous-versions/windows/desktop/msmq/ms711472(v=vs.85)
verified at: 2026-08-01
certainty: context-dependent

subject: DBのテーブルキュー
predicate: recommendedFor
object: DTC(分散トランザクションコーディネーター)
description: MSMQ+DTCで実現していた整合性は、業務データと同一のローカルトランザクションで確定できるテーブルキューに置き換えるのが本記事の推奨
evidence: hints-transact-sql-table
verified at: 2026-08-01
certainty: established

subject: DTC(分散トランザクションコーディネーター)
predicate: incompatibleWith
object: RabbitMQ
description: クラウド系キューはDTCに参加できないため、この要件がある限りRabbitMQへの移行は遠回りになる
evidence: https://learn.microsoft.com/previous-versions/windows/desktop/msmq/ms711472(v=vs.85)
verified at: 2026-08-01
certainty: established

subject: DTC(分散トランザクションコーディネーター)
predicate: incompatibleWith
object: Azure Service Bus
description: Azure Service BusもDTCに参加できないため、DTC要件がある限り移行の遠回りになる
evidence: https://learn.microsoft.com/previous-versions/windows/desktop/msmq/ms711472(v=vs.85)
verified at: 2026-08-01
certainty: established

subject: RabbitMQ
predicate: recommendedFor
object: 複数システム・複数言語間の疎結合な連携
description: 配信のファンアウトやルーティングが必要な、複数システム・複数言語間の疎結合な連携にはRabbitMQ(オンプレ)が候補になる
evidence: deprecated-features
verified at: 2026-08-01
certainty: context-dependent

subject: Azure Service Bus
predicate: recommendedFor
object: 複数システム・複数言語間の疎結合な連携
description: クラウドに置ける場合、複数システム間の疎結合な連携にはAzure Service Busが候補になる
evidence: deprecated-features
verified at: 2026-08-01
certainty: context-dependent

subject: DBのテーブルキュー
predicate: notRecommendedFor
object: 複数システム・複数言語間の疎結合な連携
description: 配信のファンアウトやルーティングが必要な複数システム・複数言語間の連携には、テーブルキューでは要件が足りないことがある
evidence: deprecated-features
verified at: 2026-08-01
certainty: context-dependent

subject: BinaryFormatter
predicate: incompatibleWith
object: .NET(Core以降)
description: BinaryFormatterは.NET 9以降ランタイムから実装が削除され既定では使用できないが、非サポートのSystem.Runtime.Serialization.Formattersパッケージに明示的に依存させれば、引き続き利用できる場合がある
evidence: binaryformatter-migration-guide
verified at: 2026-08-01
certainty: context-dependent

subject: DBのテーブルキュー
predicate: incompatibleWith
object: BinaryFormatter
description: 移行先がモダンな.NETの場合、BinaryFormatterは実装が削除されているため、テーブルキューへ移す新システムにこの直列化形式は持ち込めず、JSONなどへの置き換えが必要になる
evidence: binaryformatter-migration-guide
verified at: 2026-08-01
certainty: context-dependent

subject: DBのテーブルキュー
predicate: uses
object: Outboxパターン
description: 送信側でメッセージの出し漏れを防ぎたい場合は、業務データの更新とメッセージ行のINSERTを同一トランザクションに入れるOutboxパターンを使う
evidence: hints-transact-sql-table
verified at: 2026-08-01
certainty: context-dependent

subject: DBのテーブルキュー
predicate: uses
object: READPASTテーブルヒント
description: SQL Serverでは、テーブルキューの取り出しはREADPASTヒントを使うことで、他のワーカーがロックしている行を待たずに飛ばし、複数プロセスで同時に回せる
evidence: hints-transact-sql-table
verified at: 2026-08-01
certainty: context-dependent

subject: READPASTテーブルヒント
predicate: incompatibleWith
object: READ_COMMITTED_SNAPSHOTデータベースオプション
description: READ_COMMITTED_SNAPSHOTがONでセッションの分離レベルがREAD COMMITTEDのとき、READCOMMITTEDLOCKヒントの併記なしにREADPASTは指定できず、文そのものがエラーになる
evidence: hints-transact-sql-table
verified at: 2026-08-01
certainty: context-dependent

subject: MSMQ(Microsoft Message Queuing)
predicate: notRecommendedFor
object: 新規プロジェクトでの新規採用
description: 公式な将来の道(モダンな.NETからの利用手段)がないため、新規プロジェクトでのMSMQ新規採用は推奨できない
evidence: deprecated-features
verified at: 2026-08-01
certainty: established