Amazonは、Windows Communication Foundationに代わるオープンソース向けに、サーバーとクライアントコードでAmazon Simple Queue Service(SQS)をサポートするCoreWCFの新しいバインディングの提供を発表した。この新しいバインディングにより、従来のMicrosoft MSMQバインディングをAWSのクラウドベースの実装に簡単に移行できる。
Amazon SQSはクラウドベースのキューサービスで、コンポーネントが非同期で確実にメッセージを送信、保存、受信できるようにする。SQSキューは名前によって識別され、読み書きができる。
CoreWCFのSQSバインディングは、レガシーのMSMQ(Microsoft Message Queuing)バインディングと同様、一方向バインディングである。そのため、CoreWCFのサービスインターフェイスではvoidメソッドしか使用できない。CoreWCFにおけるMSMQのサポートは(NetNamedPipe
とともに)まだプレビュー段階であり、将来的に追加される可能性がある。マイクロソフトは、Azure Storage Queues向けに同様のバインディングをリリースする予定だ。
SQSのサポートには2つのパッケージがある。1つはキューにメッセージを送信するクライアントシナリオ用、もう1つはキューからメッセージを読み込んで処理するサーバーシナリオ用だ。AWS SDK for .NETは、パッケージの依存関係としてまとめられている。SQSによるクライアントサーバーコードの完全なサンプルは、エクステンションのGitHubリポジトリで入手可能だ。
CoreWCFを使ってAmazonのAWSでSQSキューを呼び出すには、開発者は.NETプロジェクトにAWS.WCF.Extensions NuGetパッケージを追加しなければならない。最初のステップは、キューにアクセスするためのAWS認証情報を供給する認証プロバイダ、AmazonSQSClient
のインスタンスを作成することである。プロバイダーのインスタンスは、キュー名とともにAwsSqsBinding
コンストラクターに渡される。そして、CoreWCFの通常のChannelFactoryクラスが呼び出されるサービスの通信チャネルを作成する必要がある。
// この例では、ILoggingServiceという既存のwCFサービスを想定しているvar sqsClient = new AmazonSQSClient();var sqsBinding = new AWS.WCF.Extensions.SQS.AwsSqsBinding(sqsClient, queueName);var endpointAddress = new EndpointAddress(new Uri(sqsBinding.QueueUrl));var factory = new ChannelFactory<ILoggingService>(sqsBinding, endpointAddress);var channel = factory.CreateChannel();((System.ServiceModel.Channels.IChannel)channel).Open();// wcf クライアント経由でメッセージを送信するchannel.LogMessage("Hello World");
SQSキューのコンシューマとして公開されるCoreWCFサービスを作成するには、開発者はAWS.CoreWCF.Extensions NuGetパッケージを使用する必要がある。サービスバインディングの作成は、サービス構成ステップでCoreWCFサービスコレクションにキュートランスポートを追加することから始まる。さらに、AddDefaultAWSOptions
拡張メソッドを使用して、キュー名とAWS認証情報を持つSQSクライアント拡張メソッドを追加する必要がある。
アプリビルダーの設定では、キューが存在しない場合は、EnsureSqsQueue
メソッドがキューを作成する。次に、AdsSqsBinding
クラスをインスタンス化し、キュー名を指定するAddServiceEndpoint
メソッドを使用して、サービスをキューに接続する。
public class Startup { private static readonly string _queueName = "your-aws-sqs-queue"; public void ConfigureServices(IServiceCollection services) { services.AddSingleton<LoggingService>(); services.AddServiceModelServices(); services.AddQueueTransport(); // AWS の設定 AWSOptions option = new AWSOptions(); option.Credentials = new BasicAWSCredentials("your access key", "your secret key"); services.AddDefaultAWSOptions(option); services.AddSQSClient(_queueName); // AWSの設定終了 } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { var queueUrl = app.EnsureSqsQueue(_queueName); app.UseServiceModel(services => {) services.AddService<LoggingService>(); services.AddServiceEndpoint<LoggingService, ILoggingService>( new AwsSqsBinding(), queueUrl); }); }}
SQSバインディングパッケージでは、サーバー側で2つのカスタマイズができる。1つ目は、サービスバインディングの同時実行レベルを指定できることだ。これは、サーバーから一度に引き出されるメッセージの数を制御し(デフォルトは1つ)、メッセージは並列スレッドで処理される。もう1つのカスタマイズは、IDispatchCallbackCollection
クラスで2つのコールバックコレクションを公開したことだ。これらには、SQSへの呼び出しが成功または失敗したときに呼び出される2つのデリゲートが含まれており、グレースフルデグレードや、失敗したリクエストのログを取得可能にしている。
CoreWCFプロジェクトは2019年に始まったが、 2022年4月に正式にリリースされた。これは、.NETプラットフォーム上のWCFサービスからもっとも頻繁に使用される機能のサブセットを提供することを目的としている。これは.NET Standard 2.0と互換性があり、.NET Framework 4.6.2以上でそのまま移行できる。主流のWCFバインディングと、KafkaやRabbitMQのような他のプロトコルで、HTTPとTCPトランスポートプロトコルをカバーしている。現在のバージョンは1.5.1だ。
AWSは、2019年6月に発表されたCoreWCFコミュニティプロジェクトの主要な貢献者の一つである。CoreWCF SQSエクステンションはApache 2.0ライセンスの下、GitHubで公開されている。エクステンションの現在のバージョンは1.0.3である。